2016-12-08 00:24:44 -05:00
|
|
|
<?xml version="1.0"?>
|
|
|
|
|
<ruleset name="WPILibRuleset"
|
2020-12-30 16:17:20 -08:00
|
|
|
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">
|
2017-07-18 20:32:08 -07:00
|
|
|
|
2018-06-03 10:00:53 -07:00
|
|
|
<description>PMD Ruleset for WPILib</description>
|
|
|
|
|
|
2025-08-08 23:04:02 -07:00
|
|
|
<!-- Generated files -->
|
|
|
|
|
<exclude-pattern>.*/*EntryImpl\.java</exclude-pattern>
|
|
|
|
|
<exclude-pattern>.*/*Subscriber\.java</exclude-pattern>
|
|
|
|
|
<exclude-pattern>.*/Timestamped.*\.java</exclude-pattern>
|
2025-08-09 00:00:53 -07:00
|
|
|
<exclude-pattern>.*/units/measure/.*\.java</exclude-pattern>
|
2025-08-08 23:04:02 -07:00
|
|
|
|
2018-06-11 18:01:49 -04:00
|
|
|
<exclude-pattern>.*/*IntegrationTests.*</exclude-pattern>
|
2025-08-08 23:04:02 -07:00
|
|
|
<exclude-pattern>.*/*JNI.*</exclude-pattern>
|
2023-12-05 20:02:29 -05:00
|
|
|
<exclude-pattern>.*/math/proto.*</exclude-pattern>
|
2025-11-07 19:56:29 -05:00
|
|
|
<exclude-pattern>.*/command3/proto.*</exclude-pattern>
|
2018-06-03 10:00:53 -07:00
|
|
|
|
|
|
|
|
<rule ref="category/java/bestpractices.xml">
|
|
|
|
|
<exclude name="AccessorClassGeneration" />
|
|
|
|
|
<exclude name="AccessorMethodGeneration" />
|
|
|
|
|
<exclude name="AvoidPrintStackTrace" />
|
2022-09-24 00:13:55 -07:00
|
|
|
<exclude name="AvoidReassigningCatchVariables" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="AvoidReassigningParameters" />
|
2021-06-09 07:01:00 -07:00
|
|
|
<exclude name="AvoidUsingHardCodedIP" />
|
|
|
|
|
<exclude name="ConstantsInInterface" />
|
2025-08-08 23:04:02 -07:00
|
|
|
<exclude name="ExhaustiveSwitchHasDefault" />
|
2021-06-09 07:01:00 -07:00
|
|
|
<exclude name="LooseCoupling" />
|
2025-08-08 23:04:02 -07:00
|
|
|
<exclude name="NonExhaustiveSwitch" />
|
2022-09-24 00:13:55 -07:00
|
|
|
<exclude name="PreserveStackTrace" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="ReplaceHashtableWithMap" />
|
|
|
|
|
<exclude name="ReplaceVectorWithList" />
|
|
|
|
|
<exclude name="SystemPrintln" />
|
2025-08-08 23:04:02 -07:00
|
|
|
<exclude name="UnitTestAssertionsShouldIncludeMessage" />
|
|
|
|
|
<exclude name="UnitTestContainsTooManyAsserts" />
|
|
|
|
|
<exclude name="UnitTestShouldIncludeAssert" />
|
|
|
|
|
<exclude name="UnitTestShouldUseAfterAnnotation" />
|
|
|
|
|
<exclude name="UnitTestShouldUseBeforeAnnotation" />
|
|
|
|
|
<exclude name="UnitTestShouldUseTestAnnotation" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="UseVarargs" />
|
|
|
|
|
</rule>
|
2018-06-11 18:01:49 -04:00
|
|
|
<rule ref="category/java/bestpractices.xml/UnusedPrivateMethod">
|
|
|
|
|
<properties>
|
|
|
|
|
<property name="violationSuppressRegex"
|
2020-12-30 16:17:20 -08:00
|
|
|
value=".*'.*Arguments\(\)'.*" />
|
2018-06-11 18:01:49 -04:00
|
|
|
</properties>
|
|
|
|
|
</rule>
|
2024-06-09 01:08:23 -04:00
|
|
|
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable">
|
|
|
|
|
<properties>
|
|
|
|
|
<property name="violationSuppressXPath" value="//Resource"/>
|
|
|
|
|
</properties>
|
|
|
|
|
</rule>
|
2018-06-03 10:00:53 -07:00
|
|
|
|
|
|
|
|
<rule ref="category/java/design.xml">
|
2024-06-09 01:08:23 -04:00
|
|
|
<exclude name="AvoidThrowingNewInstanceOfSameException" />
|
2025-08-08 23:04:02 -07:00
|
|
|
<exclude name="AvoidThrowingRawExceptionTypes" />
|
2021-12-09 12:20:08 -08:00
|
|
|
<exclude name="CognitiveComplexity" />
|
2024-06-09 01:08:23 -04:00
|
|
|
<exclude name="CouplingBetweenObjects" />
|
2021-06-09 07:01:00 -07:00
|
|
|
<exclude name="CyclomaticComplexity" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="DataClass" />
|
2024-06-09 01:08:23 -04:00
|
|
|
<exclude name="ExceptionAsFlowControl" />
|
2021-06-09 07:01:00 -07:00
|
|
|
<exclude name="ExcessiveImports" />
|
|
|
|
|
<exclude name="ExcessiveParameterList" />
|
|
|
|
|
<exclude name="ExcessivePublicCount" />
|
|
|
|
|
<exclude name="GodClass" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="LawOfDemeter" />
|
|
|
|
|
<exclude name="LoosePackageCoupling" />
|
2021-06-09 07:01:00 -07:00
|
|
|
<exclude name="NPathComplexity" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="NcssCount" />
|
2021-06-09 07:01:00 -07:00
|
|
|
<exclude name="TooManyFields" />
|
2020-10-22 23:53:48 -04:00
|
|
|
<exclude name="TooManyMethods" />
|
2018-06-03 10:00:53 -07:00
|
|
|
</rule>
|
|
|
|
|
|
|
|
|
|
<rule ref="category/java/errorprone.xml">
|
|
|
|
|
<exclude name="AssignmentToNonFinalStatic" />
|
2022-09-24 00:13:55 -07:00
|
|
|
<exclude name="AvoidCatchingThrowable" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="AvoidDuplicateLiterals" />
|
|
|
|
|
<exclude name="AvoidLiteralsInIfCondition" />
|
2021-12-09 12:20:08 -08:00
|
|
|
<exclude name="CloseResource" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="ConstructorCallsOverridableMethod" />
|
2021-12-09 12:20:08 -08:00
|
|
|
<exclude name="DoNotTerminateVM" />
|
2022-09-24 00:13:55 -07:00
|
|
|
<exclude name="EmptyCatchBlock" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="FinalizeDoesNotCallSuperFinalize" />
|
2018-10-07 18:11:57 -07:00
|
|
|
<exclude name="JUnitSpelling" />
|
|
|
|
|
<exclude name="MissingSerialVersionUID" />
|
2023-08-18 19:18:33 -07:00
|
|
|
<exclude name="NonSerializableClass" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="NullAssignment" />
|
|
|
|
|
</rule>
|
|
|
|
|
|
|
|
|
|
<rule ref="category/java/multithreading.xml">
|
|
|
|
|
<exclude name="AvoidSynchronizedAtMethodLevel" />
|
2025-08-08 23:04:02 -07:00
|
|
|
<exclude name="AvoidSynchronizedStatement" />
|
2018-06-03 10:00:53 -07:00
|
|
|
<exclude name="AvoidUsingVolatile" />
|
|
|
|
|
<exclude name="DoNotUseThreads" />
|
2018-07-29 12:29:32 -04:00
|
|
|
<exclude name="UseConcurrentHashMap" />
|
2018-06-03 10:00:53 -07:00
|
|
|
</rule>
|
|
|
|
|
|
|
|
|
|
<rule ref="category/java/performance.xml">
|
2021-06-09 07:01:00 -07:00
|
|
|
<exclude name="AvoidInstantiatingObjectsInLoops" />
|
2025-09-09 00:19:00 -04:00
|
|
|
<!--
|
|
|
|
|
This rule is in place to save three (!) bytecode instructions when initializing a field to its default value.
|
|
|
|
|
Code that's more readable due to having explicit initial values is more important than reducing class size by a
|
|
|
|
|
few bytes.
|
|
|
|
|
-->
|
|
|
|
|
<exclude name="RedundantFieldInitializer" />
|
2018-06-03 10:00:53 -07:00
|
|
|
</rule>
|
|
|
|
|
|
2020-12-30 16:17:20 -08:00
|
|
|
<rule name="UnnecessaryCastRule" language="java"
|
|
|
|
|
message="Avoid unnecessary casts"
|
2021-12-09 12:20:08 -08:00
|
|
|
class="net.sourceforge.pmd.lang.java.rule.codestyle.UnnecessaryCastRule"
|
|
|
|
|
externalInfoUrl="https://github.com/pmd/pmd/blob/master/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryCastRule.java" />
|
2018-06-03 10:00:53 -07:00
|
|
|
|
2018-05-15 23:58:20 -07:00
|
|
|
<!-- Custom Rules -->
|
|
|
|
|
<rule name="UseRequireNonNull"
|
2020-12-30 16:17:20 -08:00
|
|
|
message="Use Objects.requireNonNull() instead of throwing a NullPointerException yourself."
|
2024-06-09 01:08:23 -04:00
|
|
|
language="java" class="net.sourceforge.pmd.lang.rule.xpath.XPathRule">
|
2018-05-15 23:58:20 -07:00
|
|
|
<description>Use Objects.requireNonNull() instead of throwing a
|
2020-12-30 16:17:20 -08:00
|
|
|
NullPointerException yourself.</description>
|
2018-05-15 23:58:20 -07:00
|
|
|
<properties>
|
|
|
|
|
<property name="xpath">
|
|
|
|
|
<value>
|
2018-06-11 18:01:49 -04:00
|
|
|
<![CDATA[
|
|
|
|
|
//IfStatement[child::Expression//NullLiteral]/Statement//ThrowStatement/Expression/PrimaryExpression/PrimaryPrefix/AllocationExpression/ClassOrInterfaceType[@Image='NullPointerException']
|
|
|
|
|
]]>
|
2018-05-15 23:58:20 -07:00
|
|
|
</value>
|
|
|
|
|
</property>
|
|
|
|
|
</properties>
|
|
|
|
|
<priority>3</priority>
|
|
|
|
|
<example>
|
|
|
|
|
<![CDATA[
|
2017-07-18 20:32:08 -07:00
|
|
|
public class Example {
|
2018-05-16 22:47:35 -04:00
|
|
|
public Example(Object example) {
|
|
|
|
|
if (example == null) {
|
|
|
|
|
throw new NullPointerException();
|
2018-05-15 23:58:20 -07:00
|
|
|
}
|
2018-05-16 22:47:35 -04:00
|
|
|
}
|
2017-07-18 20:32:08 -07:00
|
|
|
}
|
|
|
|
|
]]>
|
2018-05-15 23:58:20 -07:00
|
|
|
</example>
|
|
|
|
|
</rule>
|
2016-12-08 00:24:44 -05:00
|
|
|
</ruleset>
|