Как отключить определенное правило checkstyle для определенной строки кода?


У меня есть checkstyle правило проверки, настроенное в моем проекте, которое запрещает определять методы класса с более чем 3 входными параметрами. Правило отлично работает для мой классы, но иногда мне приходится расширять сторонние классы, которые не подчиняются этому конкретному правилу.

есть ли возможность поручить "checkstyle", что определенный метод должен быть проигнорирован?

кстати, я закончил с моей собственной оберткой checkstyle: qulice.com (см. строгий контроль качества кода Java)

6 145

6 ответов:

Проверьте использование suppressioncommentfilter в http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter. вам нужно будет добавить модуль в свой checkstyle.xml

<module name="SuppressionCommentFilter"/>

и это настраивается. Таким образом, вы можете добавить комментарии к своему коду, чтобы отключить checkstyle (на разных уровнях), а затем снова включить его с помощью комментариев в своем коде. Е. Г.

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

или даже лучше, используйте это более тонко версия:

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

что позволяет отключить определенные проверки для определенных строк кода:

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

*Примечание: Вы также должны добавить FileContentsHolder:

<module name="FileContentsHolder"/>

см. также

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

в разделе SuppressionFilter на той же странице, которая позволяет отключить отдельные проверки для сопоставленных ресурсов шаблона.

Итак, если у вас есть в вашем checkstyle.XML-код:

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

вы можете отключить его в ваш XML-файл подавления с помощью:

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

другой метод, теперь доступный в Checkstyle 5.7, заключается в подавлении нарушений с помощью @SuppressWarnings аннотация java. Для этого вам понадобятся новые модули (SuppressWarningsFilter и SuppressWarningsHolder) в вашем конфигурационном файле:

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

затем, в коде, вы можете сделать следующее:

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

или, для нескольких подавления:

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

Примечание:"checkstyle:" префикс является необязательным (но рекомендуется). Согласно документам имя параметра должно быть во всех строчных буквах, но практика показывает, что любой случай работает.

если вы предпочитаете использовать аннотации для выборочного молчания правил, теперь это возможно с помощью @SuppressWarnings аннотация, начиная с Checkstyle 5.7 (и поддерживается плагином Checkstyle Maven 2.12+).

во-первых, в своем checkstyle.xml добавить SuppressWarningsHolder модуль TreeWalker:

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

далее включить SuppressWarningsFilter там (как одноуровневый элемент TreeWalker):

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

<module name="TreeWalker">
...

теперь вы можете аннотировать, например, метод, который вы хотите исключить из определенного стиля проверки правило:

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

The checkstyle: префикс в аргументе @SuppressWarnings не является обязательным, но мне нравится, как напоминание, откуда пришло это предупреждение. Имя правила должно быть в нижнем регистре.

наконец, если вы используете Eclipse, он будет жаловаться на то, что аргумент ему неизвестен:

неподдерживаемый @SuppressWarnings ("checkstyle:methodlength")

вы можете отключить это предупреждение Eclipse в настройках, если вы например:

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

что также является SuppressWithNearbyCommentFilter которых использует отдельные комментарии для подавления событий аудита.

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

чтобы настроить фильтр так, чтобы CHECKSTYLE игнорировал проверку для следующих строк var, избегая запуска любых аудитов для данной проверки для текущей строки и следующих строк var (для всего var + 1 строк):

<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

каждый ответ, относящийся к SuppressWarningsFilter отсутствует важная деталь. Вы можете использовать только строчный идентификатор, если он определен как таковой в вашем checkstyle-config.XML. Если нет, вы должны использовать исходное имя модуля.

например, если в моем checkstyle-config.xml у меня есть:

<module name="NoWhitespaceBefore"/>

Я не могу использовать:

@SuppressWarnings({"nowhitespacebefore"})

Я должен, однако, использовать:

@SuppressWarnings({"NoWhitespaceBefore"})

для того, чтобы первый синтаксис работал, checkstyle-config.XML должно быть:

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

это работало для меня, по крайней мере, в CheckStyle версии 6.17.

У меня были трудности с ответами выше, потенциально потому, что я установил предупреждения checkStyle как ошибки. То, что действительно работало, было SuppressionFilter:http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

недостатком этого является то, что линейный диапазон хранится в отдельном подавлении.xml-файл, поэтому незнакомый разработчик может не сразу установить соединение.

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

чтобы настроить фильтр для подавления событий аудита между комментарием, содержащим код начала строки, и комментарием, содержащим код конца строки:

<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

Посмотреть подробнее