web-dev-qa-db-fra.com

Comment désactiver une règle de contrôle 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 je dois parfois étendre les classes tierces, qui n'obéissent pas à cette règle particulière.

Est-il possible d'indiquer à "checkstyle" qu'une certaine méthode doit être ignorée en silence?

BTW, je me suis retrouvé avec mon propre wrapper de checkstyle: qulice.com (voir Contrôle strict de Java Qualité du code )

170
yegor256

Découvrez l'utilisation de supressionCommentFilter à l'adresse http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter . Vous devrez 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 de nouveau via l'utilisation de 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 peaufinée:

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

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

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

* Remarque: vous devrez également ajouter le FileContentsHolder:

<module name="FileContentsHolder"/>

Voir également

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

sous la section SuppressionFilter sur cette même page, ce qui vous permet de désactiver les contrôles individuels pour les ressources correspondant à un 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 le désactiver dans votre fichier xml de suppression avec:

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

Une autre méthode, maintenant disponible dans Checkstyle 5.7, consiste à supprimer les violations via l'annotation @SuppressWarnings Java. 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> 

Ensuite, dans votre code, vous pouvez effectuer les opérations suivantes:

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

ou, pour des suppressions multiples:

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

NB: Le préfixe "checkstyle:" est optionnel (mais recommandé). Selon la documentation, le nom du paramètre doit être en minuscule, mais la pratique indique que tous les cas fonctionnent.

271
Chris Knight

Si vous préférez utiliser des annotations pour supprimer sélectivement les règles, vous pouvez désormais utiliser l'annotation @SuppressWarnings à partir de Checkstyle 5.7 (et pris en charge par Checkstyle Maven Plugin 2.12+).

Tout d’abord, dans votre checkstyle.xml, ajoutez le module SuppressWarningsHolder au TreeWalker:

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

Ensuite, activez la SuppressWarningsFilter ici (en tant que frère de 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 souhaitez exclure d'une certaine règle 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 j'aime bien le rappel de l'origine de cet avertissement. Le nom de la règle doit être en minuscule.

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

@SuppressWarnings ("checkstyle: methodlength") non pris en charge

Vous pouvez désactiver cet avertissement Eclipse dans les préférences si vous le souhaitez:

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

Ce qui fonctionne également bien est le SuppressWithNearbyCommentFilter qui utilise des commentaires individuels pour supprimer les événements d'audit.

Par exemple

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

Pour configurer un filtre de manière à ce que CHECKSTYLE IGNORE vérifie les lignes suivantes pour éviter le déclenchement d'audits pour le contrôle donné pour la ligne en cours et les lignes var suivantes (pour un total de var + 1 lignes):

<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

Chaque réponse faisant référence à SuppressWarningsFilter manque un détail important. Vous ne pouvez utiliser l'ID que toutes les minuscules s'il est défini comme tel dans votre fichier checkstyle-config.xml. Sinon, vous devez utiliser le nom du module d'origine.

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

<module name="NoWhitespaceBefore"/>

Je ne peux pas utiliser:

@SuppressWarnings({"nowhitespacebefore"})

Je dois cependant utiliser:

@SuppressWarnings({"NoWhitespaceBefore"})

Pour que la première syntaxe fonctionne, le fichier checkstyle-config.xml doit avoir:

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

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

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

Pour configurer un filtre afin de supprimer les événements d'audit entre un commentaire contenant la ligne BEGIN GENERATED CODE et un commentaire contenant la ligne 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

Voir plus

1
Roberto

J'ai eu de la difficulté avec les réponses ci-dessus, potentiellement parce que je définis les avertissements de checkStyle comme des erreurs. Qu'est-ce qui a fonctionné? SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

L'inconvénient est que la plage de lignes est stockée dans un fichier distinct suppresssions.xml, de sorte qu'un développeur peu familier ne peut pas établir immédiatement la connexion.

1
Saltymule