Comment désactiver une règle de checkstyle particulière pour une ligne de code particulière?

j'ai une règle de validation checkstyle configurée dans mon projet, qui interdit de définir des méthodes de classe avec plus de 3 paramètres d'entrée. La règle fonctionne bien pour mes classes, mais parfois je dois étendre les classes de tiers, qui n'obéissent pas à cette règle particulière.

Est-il une possibilité d'instruire "checkstyle" qu'une certaine méthode doit être ignorées silencieusement?

BTW, j'ai fini avec mon propre emballage de checkstyle: qulice.com (voir contrôle Strict de la qualité du code Java )

145
demandé sur yegor256 2010-10-26 15:32:39

6 réponses

vérifier l'utilisation du filtre supressioncomment à http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter . Vous aurez besoin d'ajouter le module à votre checkstyle.xml

<module name="SuppressionCommentFilter"/>

et c'est configurable. Ainsi, vous pouvez ajouter des commentaires à votre code pour désactiver checkstyle (à différents niveaux), puis revenir sur en utilisant des commentaires dans votre code. Par exemple:

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

ou encore mieux, utilisez cette version plus retouchée:

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

qui permet de désactiver les contrôles spécifiques pour certaines lignes de code:

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

* Note: vous devrez également ajouter le FileContentsHolder :

<module name="FileContentsHolder"/>

Voir aussi

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

dans la section Filtre de suppression sur cette même page, ce qui vous permet de désactiver les contrôles individuels pour les ressources correspondant au modèle.

Donc, si vous avez dans votre checkstyle.xml:

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

vous pouvez l'éteindre dans votre fichier XML de suppression avec:

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

une autre méthode, maintenant disponible dans Checkstyle 5.7 est de supprimer les violations via l'annotation java @SuppressWarnings . Pour ce faire, vous aurez besoin de nouveaux modules (SuppressWarningsFilter et SuppressWarningsHolder) dans votre fichier de configuration:

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

alors, dans votre code vous pouvez faire ce qui suit:

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

ou, pour les suppressions multiples:

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

NB: le préfixe checkstyle: " est facultatif (mais recommandé). Selon les docs, le nom du paramètre doit être dans toutes les minuscules, mais la pratique indique que n'importe quel cas fonctionne.

233
répondu Chris Knight 2018-08-11 07:48:45

si vous préférez utiliser des annotations pour réduire sélectivement au silence les règles, cela est maintenant possible en utilisant l'annotation @SuppressWarnings , en commençant par Checkstyle 5.7 (et supporté par le Plugin Checkstyle Maven 2.12+).

tout D'abord, dans votre checkstyle.xml , ajouter le" module 151960920 "au TreeWalker :

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

ensuite, activez le SuppressWarningsFilter là (comme un frère à TreeWalker ):

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

<module name="TreeWalker">
...

Maintenant vous pouvez annoter par exemple la méthode que vous voulez exclure d'une certaine règle de Checkstyle:

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

le préfixe checkstyle: dans l'argument de @SuppressWarnings est facultatif, mais je l'aime comme un rappel d'où cet avertissement vient. Le nom de la règle doit être en minuscules.

enfin, si vous utilisez Eclipse, il se plaindra que l'argument lui est inconnu:

non supporté @SuppressWarnings ("checkstyle:methodlength")

vous pouvez désactiver cet avertissement D'éclipse dans les préférences si vous aimez:

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'
53
répondu Henrik Heimbuerger 2018-03-20 19:26:42

ce qui fonctionne aussi bien est le SuppressWithNearbyCommentFilter qui utilise les commentaires individuels pour supprimer les événements de vérification.

par exemple

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

pour configurer un filtre de sorte que CHECKSTYLE IGNORE check FOR NEXT var LINES évite de déclencher des audits pour le contrôle donné pour la ligne courante et les prochaines lignes var (pour un total de var+1 lines):

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

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

30
répondu Akos Cz 2012-12-12 09:57:03

chaque réponse faisant référence à SuppressWarningsFilter manque un détail important. Vous ne pouvez utiliser l'id all-lowercase que s'il est défini comme tel dans votre checkstyle-config.XML. Si ce n'est pas le cas, vous devez utiliser le nom du module original.

par exemple, si dans mon checkstyle-config.xml que j'ai:

<module name="NoWhitespaceBefore"/>

Je ne peux pas utiliser:

@SuppressWarnings({"nowhitespacebefore"})

toutefois, je dois utiliser:

@SuppressWarnings({"NoWhitespaceBefore"})

pour la première syntaxe fonctionne, le checkstyle-config.xml devrait avoir:

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

C'est ce qui a fonctionné pour moi, au moins dans la version de CheckStyle 6.17.

1
répondu Joao Baltazar 2016-04-22 12:22:07

j'ai eu de la difficulté avec les réponses ci-dessus, peut-être parce que j'ai placé les avertissements de style de vérification pour être des erreurs. Ce qui a fonctionné était SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

L'inconvénient de ceci est que la ligne est stocké dans un autre suppresssions.fichier xml, de sorte qu'un inconnu développeur ne peut pas immédiatement la connexion.

1
répondu Saltymule 2016-11-03 14:42:36
<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

pour configurer un filtre pour supprimer les événements d'audit entre un commentaire contenant le code BEGIN GENERATED de la ligne et un commentaire contenant le CODE END GENERATED de la ligne:

<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

voir plus

1
répondu Roberto Pegoraro 2017-08-18 14:38:05