blob: 01eb897c930fa11a7fd6c6e1cec6f1e0f90f3c68 [file] [log] [blame]
<?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>