¿Deshabilitar una regla de Checkstyle particular para una línea de código particular?

Resuelto yegor256 asked hace 14 años • 9 respuestas

Tengo una regla de validación Checkstyle configurada en mi proyecto, que prohíbe definir métodos de clase con más de 3 parámetros de entrada. La regla funciona bien para mis clases, pero a veces tengo que extender clases de terceros que no obedecen esta regla en particular.

¿Existe la posibilidad de indicarle a Checkstyle que un determinado método debe ignorarse silenciosamente?

Por cierto, terminé con mi propio contenedor de Checkstyle: qulice.com (ver Control estricto de la calidad del código Java )

yegor256 avatar Oct 26 '10 18:10 yegor256
Aceptado

Consulte el uso de supressionCommentFilter en https://checkstyle.sourceforge.io/filters/suppressioncommentfilter.html . Deberá agregar el módulo a su checkstyle.xml

<module name="SuppressionCommentFilter"/>

y es configurable. Por lo tanto, puede agregar comentarios a su código para desactivar el estilo de verificación (en varios niveles) y luego volver a activarlo mediante el uso de comentarios en su código. P.ej

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

O incluso mejor, usa esta versión más modificada:

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

que le permite desactivar comprobaciones específicas para líneas de código específicas:

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

*Nota: también tendrás que agregar FileContentsHolder:

<module name="FileContentsHolder"/>

Ver también

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

en la SuppressionFiltersección de esa misma página, que le permite desactivar las comprobaciones individuales de recursos que coincidan con patrones.

Entonces, si tienes en tu checkstyle.xml:

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

Puedes desactivarlo en tu archivo xml de supresión con:

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

Otro método, ahora disponible en Checkstyle 5.7, es suprimir las infracciones mediante la @SuppressWarningsanotación de Java. Para hacer esto, necesitará agregar dos nuevos módulos ( SuppressWarningsFiltery SuppressWarningsHolder) en su archivo de configuración:

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

Luego, dentro de tu código puedes hacer lo siguiente:

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

o, para supresiones múltiples:

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

NB: El checkstyle:prefijo " " es opcional (pero recomendado). Según los documentos, el nombre del parámetro debe estar en minúsculas, pero la práctica indica que cualquier caso funciona.

Chris Knight avatar Oct 26 '2010 11:10 Chris Knight

Si prefiere usar anotaciones para silenciar reglas selectivamente, ahora es posible usar la @SuppressWarningsanotación, comenzando con Checkstyle 5.7 (y compatible con el complemento Checkstyle Maven 2.12+).

Primero, en su checkstyle.xml, agregue el SuppressWarningsHoldermódulo a TreeWalker:

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

A continuación, habilite SuppressWarningsFilterallí (como hermano de TreeWalker):

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

<module name="TreeWalker">
...

Ahora puede anotar, por ejemplo, el método que desea excluir de una determinada regla de Checkstyle:

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

El checkstyle:prefijo en el argumento to @SuppressWarningses opcional, pero me gusta como recordatorio de dónde vino esta advertencia. El nombre de la regla debe estar en minúsculas.

Por último, si está utilizando Eclipse, se quejará de que desconoce el argumento:

@SuppressWarnings no admitido("checkstyle:methodlength")

Puede desactivar esta advertencia de Eclipse en las preferencias si lo desea:

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'
Henrik Heimbuerger avatar Mar 21 '2014 10:03 Henrik Heimbuerger

Lo que también funciona bien es SuppressWithNearbyCommentFilter , que utiliza comentarios individuales para suprimir eventos de auditoría.

Por ejemplo

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

Para configurar un filtro para que CHECKSTYLE IGNORE check FOR NEXT var LINES evite activar auditorías para la verificación dada para la línea actual y las siguientes líneas var (para un total de líneas 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

Akos Cz avatar Feb 17 '2012 21:02 Akos Cz

A cada respuesta que se refiere a SuppressWarningsFilter le falta un detalle importante. Solo puede usar la identificación en minúsculas si está definida como tal en su checkstyle-config.xml. De lo contrario, debe utilizar el nombre del módulo original.

Por ejemplo, si en mi checkstyle-config.xml tengo:

<module name="NoWhitespaceBefore"/>

No puedo usar:

@SuppressWarnings({"nowhitespacebefore"})

Sin embargo, debo usar:

@SuppressWarnings({"NoWhitespaceBefore"})

Para que funcione la primera sintaxis, checkstyle-config.xml debe tener:

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

Esto es lo que funcionó para mí, al menos en la versión 6.17 de CheckStyle.

Joao Baltazar avatar Apr 22 '2016 12:04 Joao Baltazar