??-May-2021 - 6.35.0-SNAPSHOT
The PMD team is pleased to announce PMD 6.35.0-SNAPSHOT.
This is a minor release.
New and noteworthy
Javascript module now requires at least Java 8
The latest version of Rhino, the implementation of JavaScript we use for parsing JavaScript code, requires at least Java 8. Therefore we decided to upgrade the pmd-javascript module to Java 8 as well. This means that from now on, a Java 8 or later runtime is required in order to analyze JavaScript code. Note that PMD core still only requires Java 7.
New rules
- The new Java rule
JUnit5TestShouldBePackagePrivate
enforces the convention that JUnit 5 tests should have minimal visibility. You can try out this rule like so:<rule ref="category/java/bestpractices.xml/JUnit5TestShouldBePackagePrivate" />
Modified rules
- The Java rule
CompareObjectsWithEquals
has now a new propertytypesThatCompareByReference
. With that property, you can configure types, that should be whitelisted for comparison by reference. By default,java.lang.Enum
andjava.lang.Class
are allowed, but you could add custom types here. Additionally comparisons against constants are allowed now. This makes the rule less noisy when two constants are compared. Constants are identified by looking for an all-caps identifier.
Deprecated rules
-
The java rule
DefaultPackage
has been deprecated in favor ofCommentDefaultAccessModifier
.The rule “DefaultPackage” assumes that any usage of package-access is accidental, and by doing so, prohibits using a really fundamental and useful feature of the language.
To satisfy the rule, you have to make the member public even if it doesn’t need to, or make it protected, which muddies your intent even more if you don’t intend the class to be extended, and may be at odds with other rules like
AvoidProtectedFieldInFinalClass
.The rule
CommentDefaultAccessModifier
should be used instead. It flags the same thing, but has an escape hatch. -
The Java rule
CloneThrowsCloneNotSupportedException
has been deprecated without replacement.The rule has no real value as
CloneNotSupportedException
is a checked exception and therefore you need to deal with it while implementing theclone()
method. You either need to declare the exception or catch it. If you catch it, then subclasses can’t throw it themselves explicitly. However,Object.clone()
will still throw this exception if theCloneable
interface is not implemented.Note, this rule has also been removed from the Quickstart Ruleset (
rulesets/java/quickstart.xml
).
Fixed Issues
- apex
- core
- #2639: [core] PMD CLI output file is not created if directory or directories in path don’t exist
- doc
- #3230: [doc] Remove “Edit me” button for language index pages
- dist
- #2466: [dist] Distribution archive doesn’t include all batch scripts
- java
- #3269: [java] Fix NPE in MethodTypeResolution
- java-bestpractices
- #1175: [java] UnusedPrivateMethod FP with Junit 5 @MethodSource
- #2219: [java] Document Reasons to Avoid Reassigning Parameters
- #2737: [java] Fix misleading rule message on rule SwitchStmtsShouldHaveDefault with non-exhaustive enum switch
- #3236: [java] LiteralsFirstInComparisons should consider constant fields (cont’d)
- #3254: [java] AvoidReassigningParameters reports violations on wrong line numbers
- java-codestyle
- #2655: [java] UnnecessaryImport false positive for on-demand imports
- #3206: [java] Deprecate rule DefaultPackage
- #3262: [java] FieldDeclarationsShouldBeAtStartOfClass: false negative with anon classes
- #3265: [java] MethodArgumentCouldBeFinal: false negatives with interfaces and inner classes
- #3266: [java] LocalVariableCouldBeFinal: false negatives with interfaces, anon classes
- #3274: [java] OnlyOneReturn: false negative with anonymous class
- #3275: [java] UnnecessaryLocalBeforeReturn: false negatives with lambda and anon class
- java-design
- #2780: [java] DataClass example from documentation results in false-negative
- java-errorprone
- #3110: [java] Enhance CompareObjectsWithEquals with list of exceptions
- #3112: [java] Deprecate rule CloneThrowsCloneNotSupportedException
- #3205: [java] Make CompareObjectWithEquals allow comparing against constants
- #3248: [java] Documentation is wrong for SingletonClassReturningNewInstance rule
- #3249: [java] AvoidFieldNameMatchingTypeName: False negative with interfaces
- #3268: [java] ConstructorCallsOverridableMethod: IndexOutOfBoundsException with annotations
- javascript
API Changes
External Contributions
- #3272: [apex] correction for ApexUnitTestMethodShouldHaveIsTestAnnotation false positives - William Brockhus