Як відключити певне правило контрольного стилю для певного рядка коду?


183

У моєму проекті налаштовано правило перевірки стилю , яке забороняє визначати методи класу з більш ніж 3 вхідними параметрами. Правило добре працює для моїх занять, але іноді доводиться поширювати сторонні класи, які не підкоряються цьому правилу.

Чи є можливість доручити "контрольному стилю", що певний метод слід мовчки ігнорувати?

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

Відповіді:


291

Перевірте використання supressionCommentFilter на веб-сайті http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter . Вам потрібно буде додати модуль до свого checkstyle.xml

<module name="SuppressionCommentFilter"/>

і це налаштовується. Таким чином, ви можете додавати коментарі до свого коду, щоб вимкнути контрольний стиль (на різних рівнях), а потім знову ввімкнути через використання коментарів у своєму коді. Напр

//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="$1"/>
</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: Префікс " " необов'язковий (але рекомендується). Згідно з документами, назва параметра має бути в усіх малих літерах, але практика вказує на те, що вся справа працює.


7
Не забудьте додати FileContentsHolder на TreeWalter. Див stackoverflow.com/a/5764666/480483
djjeck

2
якщо ви використовуєте, //CHECKSTYLE.OFF: а потім забудете знову ввімкнути його, чи залишиться він перевіреним лише у файлі, що містить //CHECKSTYLE.OFF: або всі файли, що згодом обробляються?
Roland

1
@Roland, він залишається вимкненим лише на час проведення цього тестового класу.
Кріс Найт

1
"ім'я параметра має бути в усіх малих регістрах." @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")працював так само добре, як і нижній регістр.
Андерс Рабо Торбек

2
Оскільки Checkstyle 8.1 SuppressionCommentFilter повинен бути під TreeWalker, і FileContentHolderне треба (є) більше.
avandeursen

70

Якщо ви віддаєте перевагу використовувати анотації для вибіркового замовчування правил, тепер це можливо за допомогою @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">
...

Тепер ви можете коментувати, наприклад, метод, який ви хочете виключити з певного правила Checkstyle:

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

checkstyle:Префікс в аргументі НЕ @SuppressWarningsє обов'язковим, але я , як це , як нагадування , де це попередження прийшло. Ім'я правила має бути малим.

Нарешті, якщо ви використовуєте Eclipse, він скаржиться на те, що аргумент йому невідомий:

Непідтримується @SuppressWarnings ("checkstyle: methodlength")

Ви можете відключити це попередження Eclipse у налаштуваннях, якщо вам подобається:

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

2
Я висуваю це як перевірену відповідь, оскільки вважаю, що це рішення, яке повинно найкраще працювати в більшості випадків.
avandeursen

33

Що також добре працює, це SuppressWithNearbyCommentFilter, який використовує індивідуальні коментарі для придушення аудиторських подій.

Наприклад

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

Щоб налаштувати фільтр таким чином, щоб CHECKSTYLE IGNORE перевірив NEXT var LINES, уникає ініціювання будь-якого аудиту для даної перевірки для поточного рядка та наступного рядка var (для загальної кількості 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


Я б змінив регулярний вираз, до CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES?якого зробить команду ігнорування більш читаною. (Ви зможете використовувати "CHECKSTYLE IGNORE check for NEXT 1 LINE" та "CHECKSTYLE IGNORE check FOR NEXT 3 LINES").
Matt3o12

@ matt3o12 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINEтакож працює для мене (він відповідає як lineі lines).
Слава Семушин

3

У кожній відповіді на адресу 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>

Це працювало для мене, принаймні, у версії 6.17 CheckStyle.


1

У мене виникли труднощі з відповідями вище, можливо, тому що я встановив попередження checkStyle як помилки. Що було у роботі: SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

Недолік цього полягає в тому, що діапазон рядків зберігається в окремому файлі suppresssions.xml, тому незнайомий розробник може не відразу встановити з'єднання.


Дякую, це було єдине, що працювало і для мене
jonathanrz

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

Щоб налаштувати фільтр для придушення подій аудиту між коментарем, що містить рядок BEGIN GENERATED CODE, і коментарем, що містить рядок 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

Побачити більше


0

Ви можете спробувати https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathFilter

Генеруйте придушення Xpath, використовуючи CLI з опцією -g. Потім виберіть елемент придушення, характерний для лінії, яку потрібно придушити. Збережіть це у файлі придушення та вкажіть шлях до файлу в елементі SuppressionXpathFilter вище.

https://checkstyle.sourceforge.io/cmdline.html#Command_line_usage

Якщо ви використовуєте мурашник, ви можете посилатися на цю публікацію як завдання мурашки, яке буде використовуватися для створення файлу Xpath придушення.

https://github.com/checkstyle/checkstyle/isissue/6934#issuecomment-522289083

Ознайомтесь з цією темою про використання фільтра:

https://groups.google.com/forum/m/#!topic/checkstyle/F_f6R_Qk1EM

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.