tmori3y2のブログ

主にWindowsのプログラムなど

Code AnalysisのCA1702/1704/1707/1709を消す方法

2016/08/05 追記: ここにある方法で2文字の頭文字の警告は消せなくなってしまった模様。

tmori3y2.hatenablog.com

前回は、.NET FrameworkやNuGet Packageなどで使用されているが、デフォルト辞書ではNGとなっている綴りは、抑制するのではなく、プロジェクトごとの辞書で許可するのが良いと紹介したが、注意点がある。

カスタム辞書を作成するには、命名規則のチェックがどのように行われているかを把握しておく必要がある。

  • 名前付けのガイドラインのチェック方法
    • アンダースコアで区切られていたらCA1707違反
    • PascalCase/camelCaseで分割
    • 連続する大文字(文字数N) + 小文字からなる文字列 = 文字数(N-1)の頭文字 + (N字目 + 小文字からなる文字列)の単語に分割
    • 辞書にないものは部分文字列でさらに分割
    • 辞書にないものはCA1704違反 (綴り違反も含む)
    • 大文字・小文字が違うものはCA1709違反
      • 3文字以上の頭文字はPascal/camelの形式に従う ex) Mvvm/mvvm
      • 2文字の頭文字のPascalCaseはすべて大文字 ex) AX/ax, RX/rx
      • 2文字の省略形はPascal/camelの形式に従う ex) Ok/ok, Id/idのみ

以下はサンプル。

  • Ax (ActiveX)
    • Ax/axとしたいがPascalは「AX」でCA1709違反
    • 2文字の頭文字として登録されている
    • 2文字の省略形として登録 = 2文字の単語として登録
  • Rx (Reactive Extensions)
    • Rx/rxとしたいがPascalは「RX」でCA1709違反
    • 2文字の頭文字として登録されている
    • 2文字の省略形として登録 = 2文字の単語として登録
  • MVVM (Model-View-ViewModel)
    • Mvvm/mvvmとしたいが辞書に登録がなくCA1704違反
    • 4文字の単語として登録
  • WM_CLOSEなど
    • 相互運用用の辞書やルールセットを作って対処
    • アンダースコア違反(CA1707)は、数が多い場合はルールセット(.ruleset)でOffにする
    • WMは頭文字と認識されるので違反なし
    • アンダースコアで区切られた単語は全て大文字の頭文字として登録して、CA1709が出ないようにする
  • 複合語 (Multiselect)
    • 複合語として登録されておらず、登録済み単語に分割できたらCA1702違反 (MultiSelect)
    • 複合語として登録されておらず、登録済み単語に分割できなかったらCA1704違反
    • Dictionary/Words/Recognized/WordとDictionary/Words/DiscreteExceptions/Termで複合語を登録

複合語はかなり苦労した・・・

方法 : コード分析辞書をカスタマイズする

を見ると、Dictionary/Words/Compound/Term[@CompoundAlternate]と思ったが、

設定すると違反を回避できない!!

どう見ても設定しろと書いてあるようにしか見えないので要注意。

また、Dictionary/Acronyms/CasingExceptions/Acronymは大文字・小文字を区別するので、命名規則に従う新しい頭文字を登録するためのものではなく、PascalCaseが全て大文字となるような頭文字の登録に使用することにも注意。

ちなみに、VS2013.4だと二文字の抑制はできないようである(当方、VS2013.5使用)