Подтвердить что ты не робот

Игнорирование предупреждений Checkstyle с аннотацией @SuppressWarnings

Я пытаюсь игнорировать или отключать некоторые бесполезные предупреждения в eclipse с помощью checkstyle с аннотацией @SuppressWarnings like Как отключить определенное правило проверки для определенной строки кода?

но это не работает для меня.

Вот checkstyle.xml

<module name="Checker">
  <property name="severity" value="warning"/>
  <module name="SuppressWarningsFilter"/>
  <module name="TreeWalker">
    <property name="tabWidth" value="4"/>
    <module name="FileContentsHolder"/>
    <module name="SuppressWarningsHolder"/>
    <module name="CyclomaticComplexity"/>
    ...

и здесь код java:

@SuppressWarnings("checkstyle:CyclomaticComplexity")
public void doSomeThing() {
 ...
}

Также установите значение предупреждения на "все" @SuppressWarnings("all") или @SuppressWarnings("CyclomaticComplexity"), @SuppressWarnings("CyclomaticComplexity") без каких-либо результатов.

Документация на контрольный стиль оставляет желать лучшего. Некоторые идеи?

4b9b3361

Ответ 1

A. Фильтр подавления предупреждений

С checkstyle 6.5.0 я могу использовать @SuppressWarnings. Пожалуйста, обратите внимание на следующие моменты:

  • Фильтр SuppressWarnings должен быть включен в настройках Checkstyle (см. "TreeWalker" в примере настроек ниже).
  • В теге для аннотации SuppressWarnings вы должны использовать имя модуля checkstyle в всех строчных буквах.
  • При желании в теге можно использовать префикс "checkstyle:".
  • Если аннотация не работает должным образом, попробуйте изменить ее положение position. Аннотация для модуля MagicNumber должна быть помещена перед методом. Некоторые аннотации должны быть расположены непосредственно там, где показана проблема, а другие должны быть расположены перед определением класса.

Некоторые примеры для модуля checkstyle "MagicNumber":

Работает:

@SuppressWarnings("checkstyle:magicnumber")
public example(){
    int g = 5;
}

.

@SuppressWarnings("magicnumber")
public example(){
    int g = 5;
}

Не работает:

@SuppressWarnings("MagicNumber")
public example(){
    int g = 5;
}

.

@SuppressWarnings("magicNumber")
public example(){        
    int g = 5;
}

.

public example(){
    @SuppressWarnings("magicnumber")
    int g = 5;
}

Дополнительные заметки

  • Я получил предупреждение о неподдерживаемых предупреждениях, которое я отключил в настройках Eclipse с помощью Java => Compiler => Errors/Warnings => Annotations => Необработанный токен в '@SuppressWarnings' ': игнорировать

  • Имя (как определено в xml файле) соответствующего модуля checkstyle не отображается в сообщении о нарушении, которое появляется при наведении курсора на проблему с кодом. Я включил параметр "включить идентификатор модуля (если имеется) в сообщение о нарушении" и вручную изменил все идентификаторы модуля, чтобы они совпадали с именем соответствующего модуля в файле XML, но в нижнем регистре. например, есть модуль & lt; name = "AnonInnerLength" & gt; который отображается в настройках контрольного стиля Eclipse как "Длина анонимных внутренних классов". Этот модуль не имел идентификатора модуля. Я изменил идентификатор модуля на checkstyle: anoninnerlength, чтобы моим коллегам было проще подавить предупреждение:

    & lt; module name = "AnonInnerLength" & gt;
    & lt; property name = "id" value = "checkstyle: anoninnerlength"/& gt;
    & Л; модуль & GT;

  • Я использую префикс "checkstyle:" в идентификаторе модуля, а также в теге SuppressWarnings, чтобы явно указать, что предупреждение не является "стандартным предупреждением Eclipse". (Необязательный префикс "checkstyle:" уже может использоваться в теге без изменения идентификатора модуля. Однако префикс не будет отображаться в сообщении о нарушении. Включение его в идентификатор модуля делает сообщение более прозрачным и мотивирует моих коллег на включите префикс в тег тоже.)

B. Фильтр подавления комментариев

  • Фильтр checkstyle Filters => Подавление комментариев Фильтр использует имя модуля так, как оно указано в xml файле.
  • Если вы используете префикс "checkstyle:", имя модуля также можно использовать в нижнем регистре.

Работает:

//CHECKSTYLE:OFF: checkstyle:magicnumber        
public example(){
    int g = 5;
}   
//CHECKSTYLE:ON: checkstyle:magicnumber

.

//CHECKSTYLE:OFF: MagicNumber           
public example(){
    int g = 5;
}   
//CHECKSTYLE:ON: MagicNumber

Не работает:

//CHECKSTYLE:OFF: magicnumber           
public example(){
    int g = 5;
}   
//CHECKSTYLE:ON: magicnumber

C. Пример файла checkstyle settings.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">


<!--
    Checkstyle-Configuration with module ids that can be used as    
    tags in @SuppressWarnings
-->

<module name="Checker">

  <property name="severity" value="warning"/>

  <module name="TreeWalker">
    <property name="tabWidth" value="4"/>
    <module name="FileContentsHolder"/>
    <module name="SuppressWarningsHolder"/>

    <module name="JavadocMethod">
      <property name="id" value="checkstyle:javadocmethod"/>   
      <property name="severity" value="ignore"/>
      <property name="allowMissingParamTags" value="true"/>
      <property name="allowMissingThrowsTags" value="true"/>
      <property name="allowMissingReturnTag" value="true"/>
      <property name="suppressLoadErrors" value="true"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="JavadocType">
      <property name="id" value="checkstyle:javadoctype"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="JavadocVariable">
      <property name="id" value="checkstyle:javadocvariable"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="JavadocStyle">
      <property name="id" value="checkstyle:javadocstyle"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="ConstantName">
      <property name="id" value="checkstyle:constantname"/>
    </module>

    <module name="LocalFinalVariableName">
      <property name="id" value="checkstyle:localfinalvariablename"/>
    </module>

    <module name="LocalVariableName">
      <property name="id" value="checkstyle:localvariablename"/>
    </module>

    <module name="MemberName">
      <property name="id" value="checkstyle:membername"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="MethodName">
      <property name="id" value="checkstyle:methodname"/>
    </module>

    <module name="PackageName">
      <property name="id" value="checkstyle:packagename"/>
    </module>

    <module name="ParameterName">
      <property name="id" value="checkstyle:parametername"/>
    </module>

    <module name="StaticVariableName">
      <property name="id" value="checkstyle:staticvariablename"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="TypeName">
      <property name="id" value="checkstyle:typename"/>
    </module>

    <module name="AvoidStarImport">
      <property name="id" value="checkstyle:avoidstarimport"/>
    </module>

    <module name="IllegalImport">
      <property name="id" value="checkstyle:illegalimport"/>
    </module>

    <module name="RedundantImport">
      <property name="id" value="checkstyle:redundantimport"/>
    </module>

    <module name="UnusedImports">
      <property name="id" value="checkstyle:unusedimports"/>
    </module>

    <module name="ParameterNumber">
      <property name="id" value="checkstyle:parameternumber"/>
    </module>

    <module name="EmptyForIteratorPad">
      <property name="id" value="checkstyle:emptyforiteratorpad"/>
    </module>

    <module name="MethodParamPad">
      <property name="id" value="checkstyle:methodparampad"/>
    </module>

    <module name="NoWhitespaceAfter">
      <property name="id" value="checkstyle:nowhitespaceafter"/>
      <property name="tokens" value="BNOT,DEC,DOT,INC,LNOT,UNARY_MINUS,UNARY_PLUS"/>
    </module>

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

    <module name="OperatorWrap">
      <property name="id" value="checkstyle:operatorwrap"/>
      <property name="option" value="eol"/>
    </module>

    <module name="ParenPad">
      <property name="id" value="checkstyle:parenpad"/>
    </module>

    <module name="TypecastParenPad">
      <property name="id" value="checkstyle:typecastparenpad"/>
    </module>

    <module name="WhitespaceAfter">
      <property name="id" value="checkstyle:whitespaceafter"/>
    </module>

    <module name="WhitespaceAround">
      <property name="id" value="checkstyle:whitespacearound"/>
    </module>

    <module name="ModifierOrder">
      <property name="id" value="checkstyle:modifierorder"/>
    </module>

    <module name="RedundantModifier">
      <property name="id" value="checkstyle:redundantmodifier"/>
    </module>

    <module name="LeftCurly">
      <property name="id" value="checkstyle:leftcurly"/>
    </module>

    <module name="NeedBraces">
      <property name="id" value="checkstyle:needbraces"/>
    </module>

    <module name="RightCurly">
      <property name="id" value="checkstyle:rightcurly"/>
    </module>

    <module name="AvoidInlineConditionals">
      <property name="id" value="checkstyle:avoidinlineconditionals"/>
    </module>

    <module name="EmptyStatement">
      <property name="id" value="checkstyle:emptystatement"/>
    </module>

    <module name="HiddenField">
      <property name="id" value="checkstyle:hiddenfield"/>
      <property name="tokens" value="VARIABLE_DEF"/>
    </module>

    <module name="IllegalInstantiation">
      <property name="id" value="checkstyle:illegalinstantiation"/>
    </module>

    <module name="InnerAssignment">
      <property name="id" value="checkstyle:innerassignment"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="MagicNumber">
      <property name="id" value="checkstyle:magicnumber"/>
    </module>

    <module name="MissingSwitchDefault">
      <property name="id" value="checkstyle:missingswitchdefault"/>
    </module>

    <module name="RedundantThrows">
      <property name="id" value="checkstyle:redundantthrows"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="SimplifyBooleanExpression">
      <property name="id" value="checkstyle:simplifybooleanexpression"/>
    </module>

    <module name="SimplifyBooleanReturn">
      <property name="id" value="checkstyle:simplifybooleanreturn"/>
    </module>

    <module name="DesignForExtension">
      <property name="id" value="checkstyle:designforextension"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="FinalClass">
      <property name="id" value="checkstyle:finalclass"/>
    </module>

    <module name="HideUtilityClassConstructor">
      <property name="id" value="checkstyle:hideutilityclassconstructor"/>
    </module>

    <module name="VisibilityModifier">
      <property name="id" value="checkstyle:visibilitymodifier"/>
    </module>

    <module name="ArrayTypeStyle">
      <property name="id" value="checkstyle:arraytypestyle"/>
    </module>

    <module name="UpperEll">
      <property name="id" value="checkstyle:upperell"/>
    </module>

    <module name="AnnotationUseStyle">
      <property name="id" value="checkstyle:annotationusestyle"/>
    </module>

    <module name="MissingDeprecated">
      <property name="id" value="checkstyle:missingdeprecated"/>
    </module>

    <module name="MissingOverride">
      <property name="id" value="checkstyle:missingoverride"/>
    </module>

    <module name="PackageAnnotation">
      <property name="id" value="checkstyle:packageannotation"/>
    </module>

    <module name="AbstractClassName">
      <property name="id" value="checkstyle:abstractclassname"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="AnonInnerLength">
      <property name="id" value="checkstyle:anoninnerlength"/>     
    </module>

    <module name="ExecutableStatementCount">
      <property name="id" value="checkstyle:executablestatementcount"/>
      <property name="max" value="20"/>
      <property name="tokens" value="INSTANCE_INIT,STATIC_INIT,METHOD_DEF,CTOR_DEF"/>
    </module>

    <module name="LineLength">
      <property name="id" value="checkstyle:linelength"/>
      <property name="max" value="120"/>
      <property name="tabWidth" value="4"/>
    </module>

    <module name="MethodLength">
      <property name="id" value="checkstyle:methodlength"/>
      <property name="severity" value="ignore"/>
      <property name="max" value="20"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="OuterTypeNumber">
      <property name="id" value="checkstyle:outertypenumber"/>
    </module>

    <module name="RegexpSinglelineJava">
      <property name="id" value="checkstyle:regexpsinglelinejava"/>
      <property name="format" value="^.*System.out.println.*$"/>
      <property name="ignoreComments" value="true"/>
    </module>

    <module name="AvoidNestedBlocks">
      <property name="id" value="checkstyle:avoidnestedblocks"/>
      <property name="allowInSwitchCase" value="true"/>
    </module>

    <module name="CovariantEquals">
      <property name="id" value="checkstyle:covariantequals"/>
    </module>

    <module name="DefaultComesLast">
      <property name="id" value="checkstyle:defaultcomeslast"/>
    </module>

    <module name="DeclarationOrder">
      <property name="id" value="checkstyle:declarationorder"/>
    </module>

    <module name="EqualsHashCode">
      <property name="id" value="checkstyle:equalshashcode"/>
    </module>

    <module name="ExplicitInitialization">
      <property name="id" value="checkstyle:explicitinitialization"/>
    </module>

    <module name="FallThrough">
      <property name="id" value="checkstyle:fallthrough"/>
    </module>

    <module name="IllegalCatch">
      <property name="id" value="checkstyle:illegalcatch"/>
    </module>

    <module name="IllegalThrows">
      <property name="id" value="checkstyle:illegalthrows"/>
    </module>

    <module name="MissingCtor">
      <property name="id" value="checkstyle:missingctor"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="ModifiedControlVariable">
      <property name="id" value="checkstyle:modifiedcontrolvariable"/>
    </module>

    <module name="MultipleStringLiterals">
      <property name="id" value="checkstyle:multiplestringliterals"/>
       <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="MultipleVariableDeclarations">
      <property name="id" value="checkstyle:multiplevariabledeclarations"/>
    </module>

    <module name="NestedForDepth">
      <property name="id" value="checkstyle:nestedfordepth"/>
      <property name="max" value="2"/>
    </module>

    <module name="NestedIfDepth">
      <property name="id" value="checkstyle:nestedifdepth"/>
      <property name="max" value="2"/>
    </module>

    <module name="NestedTryDepth">
      <property name="id" value="checkstyle:nestedtrydepth"/>
    </module>

    <module name="NoClone">
      <property name="id" value="checkstyle:noclone"/>
    </module>

    <module name="NoFinalizer">
      <property name="id" value="checkstyle:nofinalizer"/>
    </module>

    <module name="ParameterAssignment">
      <property name="id" value="checkstyle:parameterassignment"/>
    </module>

    <module name="StringLiteralEquality">
      <property name="id" value="checkstyle:stringliteralequality"/>
    </module>

    <module name="OneStatementPerLine">
      <property name="id" value="checkstyle:onestatementperline"/>
    </module>

    <module name="InnerTypeLast">
      <property name="id" value="checkstyle:innertypelast"/>
    </module>

    <module name="InterfaceIsType">
      <property name="id" value="checkstyle:interfaceistype"/>
    </module>

    <module name="MutableException">
      <property name="id" value="checkstyle:mutableexception"/>
    </module>

    <module name="BooleanExpressionComplexity">
      <property name="id" value="checkstyle:booleanexpressioncomplexity"/>
    </module>

    <module name="ClassFanOutComplexity">
      <property name="id" value="checkstyle:classfanoutcomplexity"/>
      <property name="max" value="10"/>
    </module>

    <module name="JavaNCSS">
      <property name="id" value="checkstyle:gavancss"/>
      <property name="methodMaximum" value="20"/>
    </module>

    <module name="NPathComplexity">
      <property name="id" value="checkstyle:npathcomplexity"/>
      <property name="max" value="1200"/>
    </module>

    <module name="TrailingComment">
      <property name="id" value="checkstyle:trailingcomment"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="UncommentedMain">
      <property name="id" value="checkstyle:uncommentedmain"/>
    </module>

    <module name="CyclomaticComplexity">
      <property name="id" value="checkstyle:cyclomaticcomplexity"/>
      <property name="max" value="7"/>
    </module>

    <module name="StrictDuplicateCode">
      <property name="id" value="checkstyle:strictduplicatecode"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>

    <module name="SuppressWarnings">
      <property name="id" value="checkstyle:suppresswarnings"/>
    </module>

  </module>



  <module name="JavadocPackage">
    <property name="id" value="checkstyle:javadocpackage"/>
    <property name="severity" value="ignore"/>
    <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
  </module>

  <module name="Translation">
      <property name="id" value="checkstyle:translation"/>
  </module>

  <module name="FileLength">
    <property name="id" value="checkstyle:filelength"/>   
    <property name="max" value="1000"/>
  </module>

  <module name="NewlineAtEndOfFile"> 
    <property name="id" value="checkstyle:newlineatendoffile"/>   
    <property name="fileExtensions" value="*.java"/>
  </module>

  <module name="SuppressWithNearbyCommentFilter"/>

  <module name="SuppressWarningsFilter"/>

  <module name="SuppressionCommentFilter">
    <metadata name="net.sf.eclipsecs.core.comment" value="Single warning"/>
    <property name="offCommentFormat" value="CHECKSTYLE\:OFF\: ([\w\|]+)"/>
    <property name="onCommentFormat" value="CHECKSTYLE\:ON\: ([\w\|]+)"/>
    <property name="checkFormat" value="$1"/>
  </module>

</module>

Ответ 2

Моя версия checkstyle 8.1.

Он работает с конфигурацией gradle следующим образом:

build.gradle:

apply plugin: 'checkstyle'

checkstyle {
    configFile = file('config/checkstyle.xml')
    toolVersion = '8.1'
}

И игнорировать магическое число, подобное этому:

@SuppressWarnings("checkstyle:MagicNumber")
private String f(String a) {
    String b = a.substring(0, 7);
    String c = a.substring(a.length() - 3);
    return b + "-" + c;
}

ПРИМЕЧАНИЕ. префикс checkstyle: не является обязательным. Надеюсь, это поможет кому-то.

Ответ 3

Просто чтобы подчеркнуть комментарий Кайо Фаустино, который исправляет проблему, по крайней мере, для контрольного стиля 8.19.

  1. Добавьте <module name="SuppressWarningsHolder"/> к элементу Treewalker.
  2. Добавьте <module name="SuppressWarningsFilter"/> в качестве основного модуля.
<module name="Checker">
  <--! ... -->
  <module name="TreeWalker">
    <--! ... -->
    <module name="SuppressWarningsHolder"/>
  </module>
  <module name="SuppressWarningsFilter"/>
</module>