Come disattivare una particolare regola checkstyle per una particolare linea di codice?

StackOverflow https://stackoverflow.com/questions/4023185

  •  26-09-2019
  •  | 
  •  

Domanda

Ho un checkstyle convalida regola configurata nel mio progetto, che vieta di definire metodi di classe con più di 3 ingressi parametri. La regola funziona bene per i miei le classi, ma a volte devo estendere le classi terze parti, che non obbediscono questa regola particolare.

C'è la possibilità di istruire "checkstyle" che un certo metodo dovrebbe essere silenziosamente ignorati?

A proposito, ho finito con il mio involucro di checkstyle: qulice.com (vedi rigoroso controllo del codice Java Qualità )

È stato utile?

Soluzione

Scopri l'uso del supressionCommentFilter a http://checkstyle.sourceforge.net/config_filters. html # SuppressionCommentFilter . Avrai bisogno di aggiungere il modulo al vostro checkstyle.xml

<module name="SuppressionCommentFilter"/>

ed è configurabile. Così è possibile aggiungere commenti al codice per disattivare checkstyle (a vari livelli) e poi indietro di nuovo attraverso l'uso di commenti nel codice. Per es.

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

O, meglio ancora, utilizzare questa versione più ottimizzato:

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

, che consente di disattivare i controlli specifici per specifiche linee di codice:

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

* Nota: avrete anche aggiungere la FileContentsHolder:

<module name="FileContentsHolder"/>

Si veda anche

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

nella sezione SuppressionFilter su quella stessa pagina, che consente di disattivare i singoli controlli per le risorse del modello corrispondente.

Quindi, se avete nel vostro checkstyle.xml:

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

È possibile disattivarlo nel file XML di soppressione con:

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

Un altro metodo, ora disponibile in Checkstyle 5.7 è quello di violazioni Sopprimere tramite l'annotazione @SuppressWarnings Java. Per fare questo, è necessario nuovi moduli (SuppressWarningsFilter e SuppressWarningsHolder) nel file di configurazione:

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

Poi, all'interno del codice è possibile effettuare le seguenti operazioni:

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

o, per più soppressioni:

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

NB: Il "checkstyle:" prefisso è opzionale (ma consigliato). Secondo la documentazione il nome del parametro deve essere in tutte le lettere minuscole, ma la pratica indica eventuali opere caso.

Altri suggerimenti

Se si preferisce utilizzare le annotazioni alle regole di silenzio in modo selettivo, questo è ora possibile utilizzare l'annotazione @SuppressWarnings, a partire da Checkstyle 5.7 (e sostenuta dal Checkstyle Maven Plugin 2.12 +).

Per prima cosa, nel vostro checkstyle.xml, aggiungere il modulo SuppressWarningsHolder al TreeWalker:

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

Avanti, abilitare la SuppressWarningsFilter lì (come un fratello per TreeWalker):

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

<module name="TreeWalker">
...

Ora è possibile annotare per esempio il metodo che si desidera escludere da una certa regola Checkstyle:

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

Il prefisso checkstyle: nell'argomento per @SuppressWarnings è facoltativo, ma mi piace come un promemoria in cui questo avvertimento è venuto da. Il nome della regola deve essere minuscolo.

Infine, se si sta utilizzando Eclipse, si lamentano l'argomento essere sconosciuto ad esso:

  

@SuppressWarnings non supportati ( "checkstyle: methodlength")

È possibile disattivare l'avviso di Eclipse nelle preferenze se ti piace:

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

Ciò che funziona anche bene è la SuppressWithNearbyCommentFilter che utilizza i singoli commenti a eventi di controllo sopprimere.

Ad esempio

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

Per configurare un filtro in modo che Checkstyle IGNORE controllo per i prossimi var LINEE evita innescando eventuali verifiche per il dato di controllo per la riga corrente e le successive linee var (per un totale di var + 1 linee):

<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

Ogni risposta riferendosi alla SuppressWarningsFilter manca un dettaglio importante. È possibile utilizzare solo l'id all-in minuscolo se è definito come tale nel vostro checkstyle-config.xml. Se non è necessario utilizzare il nome del modulo originale.

Per esempio, se nel mio checkstyle-config.xml ho:

<module name="NoWhitespaceBefore"/>

Non riesco a usare:

@SuppressWarnings({"nowhitespacebefore"})

Devo, tuttavia, l'uso:

@SuppressWarnings({"NoWhitespaceBefore"})

Per la prima sintassi per il lavoro, il checkstyle-config.xml dovrebbe avere:

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

Questo è ciò che ha funzionato per me, almeno nella versione CheckStyle 6.17.

ho avuto difficoltà con le risposte di cui sopra, potenzialmente, perché ho impostato gli avvertimenti Checkstyle essere errori. Ciò che ha funzionato è stata SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

Lo svantaggio di questo è che la gamma linea viene memorizzata in un file separato suppresssions.xml, così uno sviluppatore sconosciuto non può immediatamente effettuare la connessione.

<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

Per configurare un filtro per gli eventi di controllo Sopprimere tra un commento contenente inizio riga codice generato e un codice commento contenente la linea FINE generato:

<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

Tutte

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top