2014-12-29 4 views
21

Я стараюсь игнорировать или отключить некоторые ненужные предупреждения в затмения Checkstyle с аннотацией @SuppressWarnings как How to disable a particular checkstyle rule for a particular line of code?Игнорирование Checkstyle предупреждений с аннотациями @SuppressWarnings

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

Вот 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") без какого-либо результата.

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

+0

Вы используете Checkstyle 5.7 или новее? @SuppressWarnings поддерживается с 5.7. – satellite779

+0

У меня также есть эта проблема с Checkstyle 6.0 – Marcin

ответ

37

A. SuppressWarnings фильтр

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

  • SuppressWarnings фильтр должен быть включен в настройках Checkstyle.
  • В теге для аннотации SuppressWarnings вы должны использовать имя модуля checkstyle в всего нижнего регистра.
  • необязательно a префикс "checkstyle:" может использоваться в теге.
  • Если аннотация не работает должным образом, попробуйте изменить ее позицию . Перед этим методом необходимо поставить аннотацию модуля 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; 
} 

Дальнейшие заметки

  • я получил предупреждение неподдерживаемые SuppressWarnings который я отключен в настройках Eclipse, с Java => Compiler => Ошибки/предупреждения => Аннотации => знак необработанное в '@SuppressWarnings' ': Игнорировать

  • Имя (как определено в xml-файле) соответствующего модуля checkstyle: не отображается в сообщении об ошибке, которое появляется при зависании над проблемой кода. Я включил опцию «» с идентификатором модуля (если есть) в сообщении о нарушении »и вручную изменил идентификаторы всех модулей, чтобы они совпадали с именем соответствующего модуля в XML-файле, но в нижнем регистре. Например, есть модуль < name = «AnonInnerLength» >, который отображается в настройках стиля Eclipse как «Анонимная длина внутренних классов». У этого модуля не было идентификатора модуля. Я изменил идентификатор модуля к Checkstyle: anoninnerlength, чтобы сделать его более легким для моих коллег, чтобы подавить предупреждение:

    < имя модуля = «AnonInnerLength» >
    < имя свойства = «Идентификатор» значение = "Checkstyle: anoninnerlength «/ >
    < модуль >

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

В. Подавление Комментарий фильтр

  • Checkstyle фильтр Фильтры => Подавление Комментарий фильтр использует имя модуля, как указано в 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> 
4

Моя 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: не является обязательным. Надеюсь, это может помочь кому-то.

+0

Вы бы хотели поделиться своим файлом checkstyle.xml? –

+0

@ JustinTilson уверен. см. мой gist https://gist.github.com/pengisgood/c2432403a03500cf4ec1826b85a08234 –

+0

Что-то должно быть в моей среде. Я скопировал ваши конфиги дословно, и мои подавления по-прежнему игнорируются. Я использую checkstyle 8.1 и Gradle 4.4.1. В начале каждой ошибки я вижу: [ant: checkstyle] [ERROR] ... Я не уверен, как муравей играет в этом, или если это проблема вообще. Является ли ваш код общедоступным репо где угодно? Могу ли я клонировать его и пытаться запустить его? –

Смежные вопросы