web-dev-qa-db-ja.com

特定のコード行の特定のチェックスタイルルールを無効にする方法

プロジェクトに checkstyle 検証ルールが設定されており、3つ以上の入力パラメーターを持つクラスメソッドの定義を禁止しています。ルールはmyクラスに対しては正常に機能しますが、この特定のルールに従わないサードパーティクラスを拡張する必要がある場合があります。

特定のメソッドを静かに無視する必要があることを「checkstyle」に指示する可能性はありますか?

ところで、私は自分のcheckstyleのラッパーになりました: qulice.comJava Code Qualityの厳密な制御を参照してください

162
yegor256

http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter でsupressionCommentFilterの使用を確認してください。 checkstyle.xmlにモジュールを追加する必要があります

<module name="SuppressionCommentFilter"/>

そしてそれは設定可能です。したがって、コードにコメントを追加して、チェックスタイルを(さまざまなレベルで)オフにしてから、コードでコメントを使用して再びオンにすることができます。例えば。

//CHECKSTYLE:OFF
public void someMethod(String arg1, String arg2, String arg3, String arg4) {
//CHECKSTYLE:ON

または、さらに良く、このより微調整されたバージョンを使用します

<module name="SuppressionCommentFilter">
    <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
    <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
    <property name="checkFormat" value="$1"/>
</module>

これにより、特定のコード行の特定のチェックをオフにできます。

//CHECKSTYLE.OFF: IllegalCatch - Much more readable than catching 7 exceptions
catch (Exception e)
//CHECKSTYLE.ON: IllegalCatch

*注意:FileContentsHolderも追加する必要があります。

<module name="FileContentsHolder"/>

こちらもご覧ください

<module name="SuppressionFilter">
    <property name="file" value="docs/suppressions.xml"/>
</module>

同じページのSuppressionFilterセクションで、パターン一致リソースの個々のチェックをオフにできます。

したがって、checkstyle.xmlに以下が含まれている場合:

<module name="ParameterNumber">
   <property name="id" value="maxParameterNumber"/>
   <property name="max" value="3"/>
   <property name="tokens" value="METHOD_DEF"/>
</module>

抑制xmlファイルで次の方法で無効にできます。

<suppress id="maxParameterNumber" files="YourCode.Java"/>

Checkstyle 5.7で利用できるようになったもう1つの方法は、@SuppressWarnings Javaアノテーションを使用して違反を抑制することです。これを行うには、構成ファイルに新しいモジュール(SuppressWarningsFilterおよびSuppressWarningsHolder)を追加する必要があります。

<module name="Checker">
   ...
   <module name="SuppressWarningsFilter" />
   <module name="TreeWalker">
       ...
       <module name="SuppressWarningsHolder" />
   </module>
</module> 

次に、コード内で次のことができます。

@SuppressWarnings("checkstyle:methodlength")
public void someLongMethod() throws Exception {

または、複数の抑制の場合:

@SuppressWarnings({"checkstyle:executablestatementcount", "checkstyle:methodlength"})
public void someLongMethod() throws Exception {

NB: "checkstyle:"プレフィックスはオプションです(ただし推奨)。ドキュメントによると、パラメータ名はすべて小文字である必要がありますが、慣習では大文字と小文字が区別されます。

263
Chris Knight

注釈を使用してルールを選択的に無音化する場合は、Checkstyle 5.7以降で@SuppressWarnings注釈を使用してこれが可能になりました(そしてCheckstyle Mavenプラグイン2.12+でサポートされます)。

まず、checkstyle.xmlで、SuppressWarningsHolderモジュールをTreeWalkerに追加します。

<module name="TreeWalker">
    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->
    <module name="SuppressWarningsHolder" />
</module>

次に、そこでSuppressWarningsFilterを有効にします(TreeWalkerの兄弟として):

<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
<module name="SuppressWarningsFilter" />

<module name="TreeWalker">
...

これで、たとえば特定のCheckstyleルールから除外するメソッド:

@SuppressWarnings("checkstyle:methodlength")
@Override
public boolean equals(Object obj) {
    // very long auto-generated equals() method
}

checkstyle:の引数にある@SuppressWarningsプレフィックスはオプションですが、この警告がどこから来たかを思い出させるものとして気に入っています。ルール名は小文字でなければなりません。

最後に、Eclipseを使用している場合は、引数が不明であることについて文句を言います。

サポートされていない@SuppressWarnings( "checkstyle:methodlength")

必要に応じて、設定でこのEclipse警告を無効にできます。

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'
59

また、うまく機能するのは SuppressWithNearbyCommentFilter で、個々のコメントを使用して監査イベントを抑制します。

例えば

// CHECKSTYLE IGNORE check FOR NEXT 1 LINES
public void onClick(View view) { ... }

CHECKSTYLE IGNOREが次のvar LINESのチェックを無視するようにフィルターを設定するには、現在の行と次のvar行(指定された合計var + 1行)の指定されたチェックの監査をトリガーしません。

<module name="SuppressWithNearbyCommentFilter">
    <property name="commentFormat" value="CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES"/>
    <property name="checkFormat" value="$1"/>
    <property name="influenceFormat" value="$2"/>
</module>

http://checkstyle.sourceforge.net/config.html

32
Akos Cz

SuppressWarningsFilter を参照するすべての回答には、重要な詳細がありません。 checkstyle-config.xmlでall-lowercase idが定義されている場合のみ使用できます。そうでない場合は、元のモジュール名を使用する必要があります。

たとえば、checkstyle-config.xmlに次のものがある場合:

<module name="NoWhitespaceBefore"/>

私は使用できません:

@SuppressWarnings({"nowhitespacebefore"})

ただし、次を使用する必要があります。

@SuppressWarnings({"NoWhitespaceBefore"})

最初の構文が機能するためには、checkstyle-config.xmlに以下が含まれている必要があります。

<module name="NoWhitespaceBefore">
  <property name="id" value="nowhitespacebefore"/>
</module>

少なくともCheckStyleバージョン6.17では、これが私にとってはうまくいきました。

2
Joao Baltazar
<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

行BEGIN GENERATED CODEを含むコメントと行END GENERATED CODEを含むコメントの間の監査イベントを抑制するようにフィルターを構成するには:

<module name="SuppressionCommentFilter">
  <property name="offCommentFormat" value="BEGIN GENERATED CODE"/>
  <property name="onCommentFormat" value="END GENERATED CODE"/>
</module>

//BEGIN GENERATED CODE
@Override
public boolean equals(Object obj) { ... } // No violation events will be reported

@Override
public int hashCode() { ... } // No violation events will be reported
//END GENERATED CODE

詳細を参照

1
Roberto

CheckStyleの警告をエラーに設定した可能性があるため、上記の回答に問題がありました。動作したのはSuppressionFilterでした: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

これの欠点は、行範囲が個別のsuppresssions.xmlファイルに保存されるため、なじみのない開発者がすぐに接続できない場合があることです。

1
Saltymule