| <?xml version="1.0"?> |
| <ruleset name="PMD ruleset for Checkstyle" |
| xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 |
| http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> |
| <description> |
| PMD common ruleset for Checkstyle main/test sourcesets |
| </description> |
| <rule ref="rulesets/java/basic.xml"/> |
| <rule ref="rulesets/java/braces.xml"/> |
| <rule ref="rulesets/java/clone.xml"/> |
| <rule ref="rulesets/java/codesize.xml"> |
| <!-- we are using CyclomaticComplexity --> |
| <exclude name="ModifiedCyclomaticComplexity"/> |
| <!-- we are using CyclomaticComplexity --> |
| <exclude name="StdCyclomaticComplexity"/> |
| </rule> |
| |
| <rule ref="rulesets/java/codesize.xml/CyclomaticComplexity"> |
| <properties> |
| <property name="showClassesComplexity" value="false"/> |
| <property name="reportLevel" value="11"/> |
| <!-- DeclarationOrder - 'visitToken' has just big SWITCH block which contains IF blocks. |
| If we split the block to several methods it will demage readibility. |
| validateCli is not reasonable to split as encapsulation of logic will be damaged |
| getDetails - huge Switch, it has to be monolithic |
| JavadocMethodCheck, JavadocStyleCheck, JavadocUtils.getJavadocTags() - deprecated |
| FinalLocalVariableCheck.visitToken() - it is just big switch , not could be done |
| GenericWhitespaceCheck.processSingleGeneric() - it contains a lot of similar to each other and very simple condition |
| VariableDeclarationUsageDistanceCheck, CustomImportOrderCheck - it is not OK to have such a complicated logic need to be refactored. |
| --> |
| <property name="violationSuppressXPath" value="//DeclarationOrder[@Name='visitToken'] and //MethodDeclaration[@Name='validateCli' and ../../..[@Image='Main']] | //MethodDeclaration[@Name='processSingleGeneric' and ../../..[@Image='GenericWhitespaceCheck']] | //MethodDeclaration[@Name='visitToken' and ../../..[@Image='FinalLocalVariableCheck']] | //MethodDeclaration[@Name='getJavadocTags' and ../../..[@Image='JavadocUtils']] | //MethodDeclaration[@Name='getDetails' and ../../..[@Image='RightCurlyCheck']] | //ClassOrInterfaceDeclaration[@Image='JavadocMethodCheck' or @Image='JavadocStyleCheck' or @Image='VariableDeclarationUsageDistanceCheck' or @Image='CustomImportOrderCheck']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/codesize.xml/NPathComplexity"> |
| <properties> |
| <!-- JavadocMethodCheck - deprecated |
| WhitespaceAroundCheck.isNotRelevantSituation - npath = 216, but additional extraction |
| of expression to separate method does not make sense as it will |
| damage encapsulation of that check. |
| --> |
| <property name="violationSuppressXPath" value="//MethodDeclaration[@Name='isNotRelevantSituation' and ../../..[@Image='WhitespaceAroundCheck']] | //MethodDeclaration[@Name='validateCli' and ../../..[@Image='Main']] | //ClassOrInterfaceDeclaration[@Image='JavadocMethodCheck' or @Image='JavadocStyleCheck']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/codesize.xml/TooManyFields"> |
| <properties> |
| <!-- Unable to split fields out of class. --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='Checker']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/codesize.xml/TooManyMethods"> |
| <properties> |
| <property name="maxmethods" value="20"/> |
| <!-- Reducing the number of methods in RequireThisCheck requires making excess hierarchy or duplicating code, or making existing methods too complex. --> |
| <!-- PackageObjectFactory has many boilerplate methods. --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='RequireThisCheck' or @Image='PackageObjectFactory']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/codesize.xml/ExcessiveClassLength"> |
| <properties> |
| <!-- *TokenTypes are special classes that a big due to a lot of description comments --> |
| <!-- JavadocMethodCheck is deprecated class, till it is redone to use JavadocAst --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='JavadocTokenTypes' or @Image='TokenTypes' or @Image='JavadocMethodCheck' or @Image='RequireThisCheck']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/codesize.xml/ExcessiveMethodLength"> |
| <properties> |
| <!-- JavadocMethodCheck is deprecated class, till it is redone to use JavadocAst --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='JavadocMethodCheck']"/> |
| <!-- getDetails() method is a huge SWITCH, it has to be monolithic --> |
| <property name="violationSuppressXPath" value="//MethodDeclaration[@Name='getDetails' and ../../..[@Image='RightCurlyCheck']]"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/codesize.xml/ExcessiveParameterList"> |
| <properties> |
| <!-- LocalizedMessage class has constructor with many parameters --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='LocalizedMessage']"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/comments.xml"> |
| <!-- <exclude name="CommentRequired"/> --> |
| <!-- we use class comments as source for xdoc files, so content is big and that is by design --> |
| <exclude name="CommentSize"/> |
| </rule> |
| <rule ref="rulesets/java/comments.xml/CommentRequired"> |
| <properties> |
| <!-- *TokenTypes are special class, comments are as trailing comments --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='JavadocTokenTypes'] | //Annotation/MarkerAnnotation//Name[@Image='Override']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/comments.xml/CommentSize"> |
| <properties> |
| <!-- we use class comments as source for xdoc files, so content is big and that is by design --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration | //PackageDeclaration | //ClassOrInterfaceDeclaration[@Image='JavadocTagInfo'] | //ClassOrInterfaceDeclaration[@Image='SeverityLevel'] | //ClassOrInterfaceDeclaration[@Image='LeftCurlyOption'] | //ClassOrInterfaceDeclaration[@Image='RightCurlyOption'] | //ClassOrInterfaceDeclaration[@Image='ImportOrderOption']"/> |
| <property name="maxLines" value="8"/> |
| <property name="maxLineLength" value="100"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/controversial.xml"> |
| <!-- calling super() is completely pointless, no matter if class inherits anything or not; it is meaningful only if you do not call implicit constructor of base class --> |
| <exclude name="CallSuperInConstructor"/> |
| <!-- We reuse Check instances between java files, we need to clear state of class in beginTree() methods --> |
| <exclude name="NullAssignment"/> |
| <!-- it is possible only in functional languages and fanatically-pristine code, without additional option that are done at ReturnCountExtendedCheck it is not good rule --> |
| <exclude name="OnlyOneReturn"/> |
| <!-- opposite to UnnecessaryConstructor --> |
| <exclude name="AtLeastOneConstructor"/> |
| <!-- that rule is too buggy, too much false positives--> |
| <exclude name="DataflowAnomalyAnalysis"/> |
| <!-- turning local variables to fields create design problems and extend scope of variable --> |
| <exclude name="AvoidFinalLocalVariable"/> |
| <!-- conflicts with names that does not mean in/out --> |
| <exclude name="AvoidPrefixingMethodParameters"/> |
| <!-- that is not practical, no options to allow some magic numbers, we will use our implementation --> |
| <exclude name="AvoidLiteralsInIfCondition"/> |
| <!-- Checkstyle is not thread safe --> |
| <exclude name="UseConcurrentHashMap"/> |
| </rule> |
| <rule ref="rulesets/java/controversial.xml/AvoidUsingShortType"> |
| <properties> |
| <!-- that class integrates checkstyle and antlr that is why it has a lot of imports --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='AutomaticBean']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/coupling.xml"> |
| <!-- produce too much violations, suppressed till we figure out how useful that metrics--> |
| <exclude name="LawOfDemeter"/> |
| <!-- this rule is for managing import, we have special Check for that --> |
| <exclude name="LoosePackageCoupling"/> |
| </rule> |
| <rule ref="rulesets/java/coupling.xml/ExcessiveImports"> |
| <properties> |
| <!-- TreeWalker integrates Checkstyle and antlr and CheckstyleAntTask integrates Checkstyle |
| with Ant. Checker collects external resource locations and setup configuration. --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='TreeWalker' or @Image='CheckstyleAntTask' or @Image='Checker' or @Image='Main']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/coupling.xml/CouplingBetweenObjects"> |
| <properties> |
| <!-- I do not see any problem , looks like false positive --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='HandlerFactory']"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/design.xml"> |
| <!-- extra final modifier does not make code more secure in that cases--> |
| <exclude name="ImmutableField"/> |
| <!-- this rule does not have any option, unreasonable to use --> |
| <exclude name="MissingBreakInSwitch"/> |
| <!-- we need compare by ref as Tree structure is immutable, we can easily rely on refs --> |
| <exclude name="CompareObjectsWithEquals"/> |
| <!-- we will use our own declaration order logic --> |
| <exclude name="FieldDeclarationsShouldBeAtStartOfClass"/> |
| <!-- too much alarms of Checks, we will never move logic out of Check, each Check is independent logic container --> |
| <exclude name="GodClass"/> |
| <!--we do not care about this minor overhead, we are not Android application and we do not want to change |
| visibility of methods. Package-private visibility should be avoid almost always.--> |
| <exclude name="AccessorMethodGeneration"/> |
| </rule> |
| |
| <rule ref="rulesets/java/design.xml/ConfusingTernary"> |
| <properties> |
| <!-- false positives on IF_ELSE-IF-ELSE-IF --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='XMLLogger']//MethodDeclarator[@Image='isReference'] | //ClassOrInterfaceDeclaration[@Image='DetailAST']//MethodDeclarator[@Image='addPreviousSibling'] | //ClassOrInterfaceDeclaration[@Image='AnnotationLocationCheck']//MethodDeclarator[@Image='checkAnnotations'] | //ClassOrInterfaceDeclaration[@Image='ImportControl']//MethodDeclarator[@Image='checkAccess'] | //ClassOrInterfaceDeclaration[@Image='HandlerFactory']//MethodDeclarator[@Image='getHandler']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/design.xml/AccessorClassGeneration"> |
| <properties> |
| <!-- We do instantiation by way of private constructors from outside of the constructor’s |
| class in DetectorOptions intentionally as it is a whole idea of Builder pattern. --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='DetectorOptions']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/design.xml/PreserveStackTrace"> |
| <properties> |
| <!-- yes we swallow one exception and try to do another attempt, second attempt does not hide cause --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='PackageObjectFactory']//MethodDeclarator[@Image='createModule']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/design.xml/EmptyMethodInAbstractClassShouldBeAbstract"> |
| <properties> |
| <!-- Can not change API --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='AbstractFileSetCheck' |
| or @Image='AbstractCheck' or @Image='AbstractJavadocCheck' or @Image='AbstractNode' or @Image='AbstractViolationReporter']"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/design.xml/AvoidDeeplyNestedIfStmts"> |
| <properties> |
| <!-- default is 3 but we try to use single point of exit from method and that require extra IFs --> |
| <property name="problemDepth" value="4"/> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='ClassResolver']//MethodDeclarator[@Image='resolve']"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/design.xml/AvoidSynchronizedAtMethodLevel"> |
| <properties> |
| <!-- UniqueProperties#put overloads synchronized method, so it should have synchronized modifier --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='UniqueProperties']//MethodDeclarator[@Image='put']"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/empty.xml"/> |
| <rule ref="rulesets/java/empty.xml/EmptyCatchBlock"> |
| <properties> |
| <property name="allowCommentedBlocks" value="true"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/finalizers.xml"/> |
| <rule ref="rulesets/java/imports.xml"/> |
| <rule ref="rulesets/java/javabeans.xml"> |
| <!-- too many false-positives --> |
| <exclude name="BeanMembersShouldSerialize"/> |
| </rule> |
| <rule ref="rulesets/java/logging-jakarta-commons.xml"/> |
| |
| <rule ref="rulesets/java/logging-java.xml"/> |
| <rule ref="rulesets/java/logging-java.xml/SystemPrintln"> |
| <properties> |
| <!-- it is ok to use println in CLI class --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='Main']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/logging-java.xml/AvoidPrintStackTrace"> |
| <properties> |
| <!-- it is ok to use print stack trace in CLI class --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='Main']"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/migrating.xml"/> |
| |
| <rule ref="rulesets/java/naming.xml"> |
| <!-- we use CheckstyleCustomShortVariable, to control lenght (will be fixed in PMD 5.4) and skip Override methods --> |
| <exclude name="ShortVariable"/> |
| </rule> |
| <rule name="CheckstyleCustomShortVariable" |
| message="Avoid variables with short names that shorter than 2 symbols: {0}" |
| language="java" |
| class="net.sourceforge.pmd.lang.rule.XPathRule" |
| externalInfoUrl=""> |
| <description> |
| Fields, local variables, or parameter names that are very short are not helpful to the reader. |
| </description> |
| <priority>3</priority> |
| <properties> |
| <property name="xpath"> |
| <value> |
| <![CDATA[ |
| //VariableDeclaratorId[string-length(@Image) < 2] |
| [not(ancestor::ForInit)] |
| [not(../../VariableDeclarator and ../../../LocalVariableDeclaration and ../../../../ForStatement)] |
| [not((ancestor::FormalParameter) and (ancestor::TryStatement))] |
| [not(ancestor::ClassOrInterfaceDeclaration[//MarkerAnnotation/Name[pmd-java:typeof(@Image, 'java.lang.Override', 'Override')]])] |
| ]]> |
| </value> |
| </property> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/naming.xml/AbstractNaming"> |
| <properties> |
| <!-- We can not brake compatibility with previous versions --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='AbstractClassNameCheck' or @Image='AutomaticBean']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/naming.xml/LongVariable"> |
| <properties> |
| <!-- nothing bad in long and descriptive variable names if only they fit line, but still keep it reasonable --> |
| <property name="minimum" value="45"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/naming.xml/ShortClassName"> |
| <properties> |
| <!-- Main is good name for class containing main method, Tag as inner class name is also fine --> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='Main' or @Image='Tag']"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/optimizations.xml"> |
| <!--produces more false-positives than real problems--> |
| <exclude name="AvoidInstantiatingObjectsInLoops"/> |
| <!--pollutes code with modifiers--> |
| <exclude name="LocalVariableCouldBeFinal"/> |
| <!--pollutes code with modifiers--> |
| <exclude name="MethodArgumentCouldBeFinal"/> |
| <!--not configurable, decreases readability--> |
| <exclude name="UseStringBufferForStringAppends"/> |
| </rule> |
| <rule ref="rulesets/java/strictexception.xml/AvoidCatchingGenericException"> |
| <properties> |
| <!-- There is no other way to deliver filename that was under processing. |
| See https://github.com/checkstyle/checkstyle/issues/2285--> |
| <property name="violationSuppressXPath" value="//MethodDeclaration[@Name='processFiles' and ../../..[@Image='Checker']]"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/strictexception.xml/AvoidThrowingRawExceptionTypes"> |
| <properties> |
| <!-- There is no other way to deliver filename that was under processing. |
| See https://github.com/checkstyle/checkstyle/issues/2285--> |
| <property name="violationSuppressXPath" value="//MethodDeclaration[@Name='processFiles' and ../../..[@Image='Checker']]"/> |
| </properties> |
| </rule> |
| |
| <rule ref="rulesets/java/strings.xml"/> |
| <rule ref="rulesets/java/strings.xml/AvoidDuplicateLiterals"> |
| <properties> |
| <!-- Annotations like '@SuppressWarnings' don't need to be checked, it is better to keep their strings |
| connected to the annotation instead of separating. --> |
| <property name="skipAnnotations" value="true"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/sunsecure.xml/MethodReturnsInternalArray"> |
| <properties> |
| <!--It's not important when array is empty--> |
| <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='JavadocNodeImpl']"/> |
| </properties> |
| </rule> |
| <rule ref="rulesets/java/typeresolution.xml"/> |
| <rule ref="rulesets/java/unnecessary.xml"/> |
| <rule ref="rulesets/java/unusedcode.xml"/> |
| |
| </ruleset> |