Wie deaktiviere ich eine bestimmte Checkstyle-Regel für eine bestimmte Codezeile?

183

In meinem Projekt ist eine Checkstyle- Validierungsregel konfiguriert, die das Definieren von Klassenmethoden mit mehr als 3 Eingabeparametern verbietet. Die Regel funktioniert gut für meine Klassen, aber manchmal muss ich Klassen von Drittanbietern erweitern, die dieser bestimmten Regel nicht entsprechen.

Gibt es eine Möglichkeit, "checkstyle" anzuweisen, dass eine bestimmte Methode stillschweigend ignoriert werden soll?

Übrigens, ich hatte meinen eigenen Checkstyle-Wrapper: qulice.com (siehe Strikte Kontrolle der Java- Codequalität )

yegor256
quelle

Antworten:

290

Überprüfen Sie die Verwendung des supressionCommentFilter unter http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter . Sie müssen das Modul zu Ihrer checkstyle.xml hinzufügen

<module name="SuppressionCommentFilter"/>

und es ist konfigurierbar. Auf diese Weise können Sie Ihrem Code Kommentare hinzufügen, um den Prüfstil (auf verschiedenen Ebenen) zu deaktivieren und dann mithilfe von Kommentaren in Ihrem Code wieder einzuschalten. Z.B

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

Oder noch besser, verwenden Sie diese optimierte Version:

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

Hiermit können Sie bestimmte Überprüfungen für bestimmte Codezeilen deaktivieren:

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

* Hinweis: Sie müssen außerdem Folgendes hinzufügen FileContentsHolder:

<module name="FileContentsHolder"/>

Siehe auch

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

Klicken Sie im SuppressionFilterAbschnitt auf derselben Seite auf, in dem Sie einzelne Überprüfungen für musterangepasste Ressourcen deaktivieren können.

Also, wenn Sie in Ihrer checkstyle.xml haben:

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

Sie können es in Ihrer Unterdrückungs-XML-Datei deaktivieren mit:

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

Eine andere Methode, die jetzt in Checkstyle 5.7 verfügbar ist, besteht darin, Verstöße über die @SuppressWarningsJava-Annotation zu unterdrücken . Dazu müssen Sie Ihrer Konfigurationsdatei zwei neue Module ( SuppressWarningsFilterund SuppressWarningsHolder) hinzufügen :

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

Dann können Sie in Ihrem Code Folgendes tun:

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

oder für mehrere Unterdrückungen:

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

NB: Das checkstyle:Präfix " " ist optional (wird jedoch empfohlen). Gemäß den Dokumenten muss der Parametername in Kleinbuchstaben angegeben werden, aber die Praxis zeigt, dass jeder Fall funktioniert.

Chris Knight
quelle
7
Denken Sie daran, FileContentsHolder zum TreeWalter hinzuzufügen. Siehe stackoverflow.com/a/5764666/480483
djjeck
2
Wenn Sie es verwenden //CHECKSTYLE.OFF: und dann vergessen, es wieder einzuschalten, bleibt es dann nur in der Datei deaktiviert, die //CHECKSTYLE.OFF: oder alle anschließend verarbeiteten Dateien enthält?
Roland
1
@ Roland, es bleibt nur für die Dauer dieser Testklasse ausgeschaltet.
Chris Knight
1
"Der Parametername muss in Kleinbuchstaben angegeben werden." @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")funktionierte für mich genauso gut wie das Kleinbuchstabenäquivalent.
Anders Rabo Thorbeck
2
Seit Checkstyle 8.1 sollte sich der SuppressionCommentFilter unter dem befinden TreeWalker, und der FileContentHolderist nicht mehr notwendig (verfügbar).
Avandeursen
69

Wenn Sie Anmerkungen bevorzugen, um Regeln selektiv zum Schweigen zu bringen, ist dies jetzt mithilfe der @SuppressWarningsAnmerkung möglich, beginnend mit Checkstyle 5.7 (und unterstützt durch das Checkstyle Maven Plugin 2.12+).

Fügen Sie zunächst in Ihrem Modul Folgendes checkstyle.xmlhinzu :SuppressWarningsHolderTreeWalker

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

Als nächstes aktivieren Sie das SuppressWarningsFilterdort (als Geschwister zu TreeWalker):

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

<module name="TreeWalker">
...

Jetzt können Sie zB die Methode kommentieren, die Sie von einer bestimmten Checkstyle-Regel ausschließen möchten:

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

Das checkstyle:Präfix im Argument to @SuppressWarningsist optional, aber ich mag es als Erinnerung daran, woher diese Warnung stammt. Der Regelname muss klein geschrieben sein.

Wenn Sie Eclipse verwenden, wird es sich darüber beschweren, dass das Argument ihm unbekannt ist:

Nicht unterstützte @SuppressWarnings ("checkstyle: methodlength")

Sie können diese Eclipse-Warnung in den Einstellungen deaktivieren, wenn Sie möchten:

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'
Henrik Heimbuerger
quelle
2
Ich nominiere dies als überprüfte Antwort, da ich denke, dass dies die Lösung ist, die in den meisten Fällen am besten funktionieren sollte.
Avandeursen
33

Was auch gut funktioniert, ist der SuppressWithNearbyCommentFilter, der einzelne Kommentare verwendet, um Überwachungsereignisse zu unterdrücken.

Beispielsweise

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

So konfigurieren Sie einen Filter so, dass die Prüfung CHECKSTYLE IGNORE FOR NEXT var LINES das Auslösen von Audits für die angegebene Prüfung für die aktuelle Zeile und die nächsten var-Zeilen (für insgesamt var + 1 Zeilen) vermeidet:

<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

Akos Cz
quelle
Ich würde den regulären Ausdruck ändern, der CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES?den Befehl "Ignorieren" lesbarer macht. (Sie können "CHECKSTYLE IGNORE-Prüfung für nächste Zeile" und "CHECKSTYLE IGNORE-Prüfung für nächste 3 Zeilen" verwenden.)
Matt3o12
@ matt3o12 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINEfunktioniert auch für mich (es passt zu beiden lineund lines).
Slava Semushin
3

Bei jeder Antwort auf SuppressWarningsFilter fehlt ein wichtiges Detail. Sie können die ID nur in Kleinbuchstaben verwenden, wenn sie in Ihrer checkstyle-config.xml als solche definiert ist. Wenn nicht, müssen Sie den ursprünglichen Modulnamen verwenden.

Zum Beispiel, wenn ich in meiner checkstyle-config.xml habe:

<module name="NoWhitespaceBefore"/>

Ich kann nicht benutzen:

@SuppressWarnings({"nowhitespacebefore"})

Ich muss jedoch verwenden:

@SuppressWarnings({"NoWhitespaceBefore"})

Damit die erste Syntax funktioniert, sollte die Datei checkstyle-config.xml Folgendes enthalten:

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

Dies hat bei mir funktioniert, zumindest in der CheckStyle-Version 6.17.

Joao Baltazar
quelle
1

Ich hatte Schwierigkeiten mit den obigen Antworten, möglicherweise weil ich die checkStyle-Warnungen als Fehler festgelegt habe. Was funktionierte, war SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

Dies hat den Nachteil, dass der Zeilenbereich in einer separaten Datei suppresssions.xml gespeichert wird, sodass ein unbekannter Entwickler die Verbindung möglicherweise nicht sofort herstellt.

Saltymule
quelle
Danke, es war das einzige, was auch für mich funktioniert hat
Jonathanrz
1
<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

So konfigurieren Sie einen Filter zum Unterdrücken von Überwachungsereignissen zwischen einem Kommentar mit der Zeile BEGIN GENERATED CODE und einem Kommentar mit der Zeile 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

Mehr sehen

Roberto
quelle
0

Sie können https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathFilter ausprobieren

Generieren Sie Xpath-Unterdrückungen mithilfe der CLI mit der Option -g. Wählen Sie dann das Unterdrückungselement aus, das für die Zeile spezifisch ist, die Sie unterdrücken möchten. Speichern Sie das in einer Unterdrückungsdatei und geben Sie diesen Dateipfad im obigen SuppressionXpathFilter-Element an.

https://checkstyle.sourceforge.io/cmdline.html#Command_line_usage

Wenn Sie ant verwenden, können Sie diesen Beitrag als ant-Aufgabe bezeichnen, um eine Xpath-Datei für Unterdrückungen zu generieren.

https://github.com/checkstyle/checkstyle/issues/6934#issuecomment-522289083

In diesem Thread erfahren Sie, wie Sie den Filter verwenden:

https://groups.google.com/forum/m/#!topic/checkstyle/F_f6R_Qk1EM

fernal73
quelle