Releases: pmd/pmd
PMD 7.2.0 (31-May-2024)
31-May-2024 - 7.2.0
The PMD team is pleased to announce PMD 7.2.0.
This is a minor release.
Table Of Contents
🚀 New and noteworthy
Collections exposed as XPath attributes
Up to now, all AST node getters would be exposed to XPath, as long as the return type was a primitive (boxed or unboxed), String or Enum. That meant that collections, even of these basic types, were not exposed, so for instance accessing Apex's ASTUserClass.getInterfaceNames()
to list the interfaces implemented by a class was impossible from XPath, and would require writing a Java rule to check it.
Since this release, PMD will also expose any getter returning a collection of any supported type as a sequence through an XPath attribute. They would require to use apropriate XQuery functions to manipulate the sequence. So for instance, to detect any given ASTUserClass
in Apex that implements Queueable
, it is now possible to write:
/UserClass[@InterfaceNames = 'Queueable']
Updated PMD Designer
This PMD release ships a new version of the pmd-designer.
For the changes, see PMD Designer Changelog (7.2.0).
🐛 Fixed Issues
- core
- java
- #4912: [java] Unable to parse some Java9+ resource references
- #4973: [java] Stop parsing Java for CPD
- #4980: [java] Bad intersection, unrelated class types java.lang.Object[] and java.lang.Number
- #4988: [java] Fix impl of ASTVariableId::isResourceDeclaration / VariableId/@ResourceDeclaration
- #4990: [java] Add an attribute @PackageQualifier to ASTClassType
- #5006: [java] Bad intersection, unrelated class types Child and Parent<? extends Child>
- #5029: [java] PMD 7.x throws stack overflow in TypeOps$ProjectionVisitor while parsing a Java class
- java-bestpractices
- #4278: [java] UnusedPrivateMethod FP with Junit 5 @MethodSource and default factory method name
- #4852: [java] ReplaceVectorWithList false-positive (neither Vector nor List usage)
- #4975: [java] UnusedPrivateMethod false positive when using @MethodSource on a @nested test
- #4985: [java] UnusedPrivateMethod false-positive / method reference in combination with custom object
- java-codestyle
- #1619: [java] LocalVariableCouldBeFinal on 'size' variable in for loop
- #3122: [java] LocalVariableCouldBeFinal should consider blank local variables
- #4903: [java] UnnecessaryBoxing, but explicit conversion is necessary
- #4924: [java] UnnecessaryBoxing false positive in PMD 7.0.0 in lambda
- #4930: [java] EmptyControlStatement should not allow empty try with concise resources
- #4954: [java] LocalVariableNamingConventions should allow unnamed variables by default
- #5028: [java] FormalParameterNamingConventions should accept unnamed parameters by default
- java-errorprone
- java-multithreading
- #2368: [java] False positive UnsynchronizedStaticFormatter in static initializer
🚨 API Changes
Deprecated API
- pmd-java
ASTResource#getStableName
and the corresponding attribute@StableName
✨ External Contributions
📈 Stats
- 152 commits
- 46 closed tickets & PRs
- Days since last release: 35
PMD 7.1.0 (26-April-2024)
26-April-2024 - 7.1.0
The PMD team is pleased to announce PMD 7.1.0.
This is a minor release.
Table Of Contents
🚀 New and noteworthy
More robust CPD reports
There were a number of circumstances, specially around (but not limited to) literal sequences, were CPD would
report duplicate overlapping or partially overlapping matches. These have now been fixed, and CPD will report
only the longest non-overlapping duplicate.
These improvements apply to all supported languages, irrespective of supported flags.
✨ New Rules
- The new Java rule
UnnecessaryVarargsArrayCreation
reports explicit array creation
when a varargs is expected. This is more heavy to read and could be simplified. - The new Java rule
ConfusingArgumentToVarargsMethod
reports some confusing situations
where a varargs method is called with an inexact argument type. These may end up in a mismatch between the expected
parameter type and the actual value. - The new Java rule
LambdaCanBeMethodReference
reports lambda expressions that can be replaced
with a method reference. Please read the documentation of the rule for more info. This rule is now part of the Quickstart
ruleset.
🌟 Rule Changes
JUnitTestsShouldIncludeAssert
andJUnitTestContainsTooManyAsserts
have a new property namedextraAssertMethodNames
. With this property, you can configure which additional static
methods should be considered as valid verification methods. This allows to use custom mocking or assertion libraries.
🐛 Fixed Issues
- core
- cli
- doc
- #4901: [doc] Improve documentation on usage of violationSuppressXPath
- apex
- #4418: [apex] ASTAnnotation.getImage() does not return value as written in the class
- apex-errorprone
- #3953: [apex] EmptyCatchBlock false positive with formal (doc) comments
- cpp
- #2438: [cpp] Repeated Duplication blocks
- java
- java-bestpractices
- #1084: [java] Allow JUnitTestsShouldIncludeAssert to configure verification methods
- #3216: [java] New rule: UnnecessaryVarargsArrayCreation
- #4435: [java] [7.0-rc1] UnusedAssignment for used field
- #4569: [java] ForLoopCanBeForeach reports on loop
for (int i = 0; i < list.size(); i += 2)
- #4618: [java] UnusedAssignment false positive with conditional assignments of fields
- java-codestyle
- #4602: [java] UnnecessaryImport: false positives with static imports
- #4785: [java] False Positive: PMD Incorrectly report violation for UnnecessaryImport
- #4779: [java] Examples in documentation of MethodArgumentCanBeFinal do not trigger the rule
- #4881: [java] ClassNamingConventions: interfaces are identified as abstract classes (regression in 7.0.0)
- java-design
- java-errorprone
- #2056: [java] CloseResource false-positive with URLClassLoader in cast expression
- #4751: [java] PMD crashes when analyzing CloseResource Rule
- #4928: [java] EmptyCatchBlock false negative when allowCommentedBlocks=true
- #4948: [java] ImplicitSwitchFallThrough: False-positive with nested switch statements
- java-performance
- pom-errorprone
- #4388: [pom] InvalidDependencyTypes doesn't consider dependencies at all
- misc
- #4967: Fix reproducible build issues with 7.0.0
🚨 API Changes
Deprecated methods
- pmd-java
ASTLambdaExpression#getBlock
andASTLambdaExpression#getExpression
SingularFieldRule#mayBeSingular
has been deprecated for
removal. The method is only useful for the rule itself and shouldn't be used otherwise.
✨ External Contributions
- #4864: Fix #1084 [Java] add extra assert method names to Junit rules - Erwan Moutymbo (@emouty)
- #4894: Fix #4791 Error caused by space in JDK path - Scrates1 (@Scrates1)
📈 Stats
- 205 commits
- 71 closed tickets & PRs
- Days since last release: 34
PMD 7.0.0 (22-March-2024)
22-March-2024 - 7.0.0
🎉 After a long time, we're excited to bring you now the next major version of PMD! 🎉
Since this is a big release, we provide here only a concise version of the release notes. We prepared a separate
page with the full Detailed Release Notes for PMD 7.0.0.
🤝🙏 Many thanks to all users and contributors who were testing the release candidates and
provided feedback and/or PRs!
✨ PMD 7...
- ...has a new logo
- ...analyzes Java 21 and Java 22 projects with even better type resolution and symbol table support
- ...analyzes Kotlin and Swift
- ...analyzes Apex with a new parser
- ...finds duplicated code in Coco, Julia, TypeScript
- ...ships 11 new rules and tons of improvements for existing rules
- ...provides a new CLI interface with progress bar
- ...supports Antlr based languages
- ...and many more enhancements
💥 Note: Since PMD 7 is a major release, it is not a drop-in replacement for PMD 6.55.0.
A detailed documentation of required changes are available in the Migration Guide for PMD 7.
Expand to see Release Notes
Table Of Contents
- Changes since 7.0.0-rc4
- 🚀 Major Features and Enhancements
- 🎉 Language Related Changes
- New: CPD support for Apache Velocity Template Language (VTL)
- New: CPD support for Coco
- New: CPD support for Julia
- New: CPD support for TypeScript
- New: Java 21 and 22 Support
- New: Kotlin support
- New: Swift support
- Changed: Apex Support: Replaced Jorje with fully open source front-end
- Changed: CPP can now ignore identifiers in sequences (CPD)
- Changed: Groovy Support (CPD)
- Changed: HTML support
- Changed: JavaScript support
- Changed: Language versions
- Changed: Rule properties
- Changed: Velocity Template Language (VTL)
- Changed: Visualforce
- 🌟 New and changed rules
- 🚨 API
- 💥 Compatibility and migration notes
- 🐛 Fixed Issues
- ✨ External Contributions
- 📈 Stats
Changes since 7.0.0-rc4
This section lists the most important changes from the last release candidate.
The remaining section describes the complete release notes for 7.0.0.
New and Noteworthy
Maven PMD Plugin compatibility with PMD 7
In order to use PMD 7 with maven-pmd-plugin a new
compatibility module has been created. This allows to use PMD 7 by simply adding one additional dependency:
- Follow the guide Upgrading PMD at Runtime
- Add additionally the following dependency:
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-compat6</artifactId>
<version>${pmdVersion}</version>
</dependency>
It is important to add this dependency as the first in the list, so that maven-pmd-plugin sees the (old)
compatible versions of some classes.
This module is available beginning with version 7.0.0-rc4 and will be there at least for the first
final version PMD 7 (7.0.0). It's not decided yet, whether we will keep updating it, after PMD 7 is finally
released.
Note: This compatibility module only works for the built-in rules, that are still available in PMD 7. E.g. you need
to review your rulesets and look out for deprecated rules and such. See the use case
I'm using only built-in rules
in the Migration Guide for PMD 7.
As PMD 7 revamped the Java module, if you have custom rules, you need to migrate these rules.
See the use case I'm using custom rules
in the Migration Guide.
Note: Once the default version of PMD is upgraded to PMD7 in maven-pmd-plugin
(see MPMD-379), this
compatibility module is no longer needed. The module pmd-compat6 might not be maintained then
any further, hence it is already declared as deprecated.
No guarantee is given, that the (deprecated) module pmd-compat6 is being maintained over the
whole lifetime of PMD 7.
Java 22 Support
This release of PMD brings support for Java 22. There are the following new standard language features,
that are supported now:
PMD also supports the following preview language features:
- JEP 447: Statements before super(...) (Preview)
- JEP 459: String Templates (Second Preview)
- JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)
In order to analyze a project with PMD that uses these language features,
you'll need to enable it via the environment variable PMD_JAVA_OPTS
and select the new language
version 22-preview
:
export PMD_JAVA_OPTS=--enable-preview
pmd check --use-version java-22-preview ...
Note: Support for Java 20 preview language features have been removed. The version "20-preview" is no longer available.
Swift Support
- limited support for Swift 5.9 (Macro Expansions)
Groovy Support (CPD)
- We now support parsing all Groovy features from Groovy 3 and 4.
- We now support suppression through
CPD-ON
/CPD-OFF
comment pairs. - See PR #4726 for details.
Updated PMD Designer
This PMD release ships a new version of the pmd-designer. The designer artifact has been
renamed from "pmd-ui" to "pmd-designer". While the designer still works with Java 8, the
recommended Java Runtime is Java 11 (or later) with OpenJFX 17 (or later).
For the detailed changes, see PMD Designer Changelog (7.0.0).
Apex Support: Replaced Jorje with fully open source front-end
When PMD added Apex support with version 5.5.0, it utilized the Apex Jorje library to parse Apex source
and generate an AST. This library is however a binary-blob provided as part of the
Salesforce Extensions for VS Code, and it is closed-source.
This causes problems, if binary blobs are not allowed by e.g. a company-wide policy. In that case, the Jorje
library prevented that PMD Apex could be used at all.
Also having access to the source code, enhancements and modifications are easier to do.
Under the hood, we use two open source libraries instead:
- apex-parser originally by
Kevin Jones (@nawforce).
This project provides the grammar for a ANTLR based parser. - Summit-AST by Google (@google)
This project translates the ANTLR parse tree into an AST, that is similar to the AST Jorje provided.
Note: This is not an official Google product.
Although the parser is completely switched, there are only little known changes to the AST.
These are documented in the Migration Guide for PMD 7: Apex AST.
With the new Apex parser, the new language constructs like
[User Mode Database Operations...
PMD 7.0.0-rc4 (30-September-2023)
30-September-2023 - 7.0.0-rc4
We're excited to bring you the next major version of PMD!
Since this is a big release, we provide here only a concise version of the release notes. We prepared a separate
page with the full Detailed Release Notes for PMD 7.0.0.
PMD 7.0.0 is finally almost ready. In order to gather feedback, we are going to ship a couple of release candidates. These are officially available on GitHub and Maven Central and can be used as usual (e.g. as a dependency). We encourage you to try out the new features, but keep in mind that we may introduce API breaking changes between the release candidates. It should be stable enough if you don't use custom rules.
We have still some tasks planned for the next release candidates. You can see the progress in PMD 7 Tracking Issue #3898.
If you find any problem or difficulty while updating from PMD 6, please provide feedback via our issue tracker. That way we can improve the experience for all.
Expand to see Release Notes
Table Of Contents
- Changes since 7.0.0-rc3
- 🚀 Major Features and Enhancements
- 🎉 Language Related Changes
- New: Swift support
- New: Kotlin support (experimental)
- New: CPD support for TypeScript
- New: CPD support for Julia
- New: CPD support for Coco
- New: Java 21 Support
- Changed: JavaScript support
- Changed: Language versions
- Changed: CPP can now ignore identifiers in sequences (CPD)
- Changed: Apex Jorje Updated
- Changed: Rule properties
- 🌟 New and changed rules
- 🚨 API
- 💥 Compatibility and migration notes
- 🐛 Fixed Issues
- ✨ External Contributions
- 📈 Stats
Changes since 7.0.0-rc3
This section lists the most important changes from the last release candidate.
The remaining section describes the complete release notes for 7.0.0.
New and Noteworthy
Migration Guide for PMD 7
A detailed documentation of required changes are available in the
Migration Guide for PMD 7.
Apex Jorje Updated
With the new version of Apex Jorje, the new language constructs like User Mode Database Operations
can be parsed now. PMD should now be able to parse Apex code up to version 59.0 (Winter '23).
Java 21 Support
This release of PMD brings support for Java 21. There are the following new standard language features,
that are supported now:
PMD also supports the following preview language features:
- JEP 430: String Templates (Preview)
- JEP 443: Unnamed Patterns and Variables (Preview)
- JEP 445: Unnamed Classes and Instance Main Methods (Preview)
In order to analyze a project with PMD that uses these language features,
you'll need to enable it via the environment variable PMD_JAVA_OPTS
and select the new language
version 21-preview
:
export PMD_JAVA_OPTS=--enable-preview
pmd check --use-version java-21-preview ...
Note: Support for Java 19 preview language features have been removed. The version "19-preview" is no longer available.
Fixed issues
- miscellaneous
- core
- #1204: [core] Allow numeric properties in XML to be within an unbounded range
- #3919: [core] Merge CPD and PMD language
- #4204: [core] Provide a CpdAnalysis class as a programmatic entry point into CPD
- #4301: [core] Remove deprecated property concrete classes
- #4302: [core] Migrate Property Framework API to Java 8
- #4323: [core] Refactor CPD integration
- #4397: [core] Refactor CPD
- #4611: [core] Fix loading language properties from env vars
- #4621: [core] Make
ClasspathClassLoader::getResource
child first
- cli
- #4423: [cli] Fix NPE when only
--file-list
is specified
- #4423: [cli] Fix NPE when only
- doc
- apex
- apex-design
- #4596: [apex] ExcessivePublicCount ignores properties
- apex-security
- #4646: [apex] ApexSOQLInjection does not recognise SObjectType or SObjectField as safe variable types
- java
- java-bestpractices
- #4634: [java] JUnit4TestShouldUseTestAnnotation false positive with TestNG
API Changes
pmd-java
- Support for Java 19 preview language features have been removed. The version "19-preview" is no longer available.
Rule properties
- The old deprecated classes like
IntProperty
andStringProperty
have been removed. Please use
PropertyFactory
to create properties. - All properties which accept multiple values now use a comma (
,
) as a delimiter. The previous default was a
pipe character (|
). The delimiter is not configurable anymore. If needed, the comma can be escaped
with a backslash. - The
min
andmax
attributes in property definitions in the XML are now optional and can appear separately
or be omitted.
New Programmatic API for CPD
See Detailed Release Notes for PMD 7
and PR #4397 for details.
Removed classes and methods
The following previously deprecated classes have been removed:
- pmd-core
net.sourceforge.pmd.cpd.AbstractTokenizer
➡️ useAnyTokenizer
insteadnet.sourceforge.pmd.cpd.CPD
➡️ usePmdCli
frompmd-cli
module for CLI support or use
CpdAnalysis
for programmatic APInet.sourceforge.pmd.cpd.GridBagHelper
(now package private)
...
PMD 7.0.0-rc3 (30-May-2023)
30-May-2023 - 7.0.0-rc3
We're excited to bring you the next major version of PMD!
Since this is a big release, we provide here only a concise version of the release notes. We prepared a separate
page with the full Detailed Release Notes for PMD 7.0.0.
PMD 7.0.0 is finally almost ready. In order to gather feedback, we are going to ship a couple of release candidates. These are officially available on GitHub and Maven Central and can be used as usual (e.g. as a dependency). We encourage you to try out the new features, but keep in mind that we may introduce API breaking changes between the release candidates. It should be stable enough if you don't use custom rules.
We have still some tasks planned for the next release candidates. You can see the progress in PMD 7 Tracking Issue #3898.
If you find any problem or difficulty while updating from PMD 6, please provide feedback via our issue tracker. That way we can improve the experience for all.
Expand to see Release Notes
Table Of Contents
- Changes since 7.0.0-rc2
- 🚀 Major Features and Enhancements
- 🎉 Language Related Changes
- New: Swift support
- New: Kotlin support (experimental)
- New: CPD support for TypeScript
- New: CPD support for Julia
- New: CPD support for Coco
- Changed: JavaScript support
- Changed: Language versions
- Changed: CPP can now ignore identifiers in sequences (CPD)
- 🌟 New and changed rules
- 🚨 API
- 💥 Compatibility and migration notes
- 🐛 Fixed Issues
- ✨ External Contributions
- 📈 Stats
Changes since 7.0.0-rc2
This section lists the most important changes from the last release candidate.
The remaining section describes the complete release notes for 7.0.0.
New CPD report format cpdhtml-v2.xslt
Thanks to @mohan-chinnappan-n a new CPD report format has been added which features a data table.
It uses an XSLT stylesheet to convert CPD's XML format into HTML.
See the example report.
Fixed issues
- miscellaneous
- #4460: Fix assembly-plugin warnings
- core
- java-bestpractices
- java-codestyle
- #4268: [java] CommentDefaultAccessModifier: false positive with TestNG annotations
- #4432: [java] [7.0-rc1] UnnecessaryImport - Unused static import is being used
- #4455: [java] FieldNamingConventions: false positive with lombok's @UtilityClass
- #4557: [java] UnnecessaryImport FP with static imports of overloaded methods
- java-design
- java-errorprone
- #4063: [java] AvoidBranchingStatementAsLastInLoop: False-negative about try/finally block
- #4457: [java] OverrideBothEqualsAndHashcode: false negative with anonymous classes
- #4510: [java] ConstructorCallsOverridableMethod: false positive with lombok's @Value
- #4546: [java] OverrideBothEqualsAndHashCode ignores records
- java-performance
- #4458: [java] RedundantFieldInitializer: false positive with lombok's @Value
API Changes
-
The following previously deprecated classes have been removed:
- pmd-core
net.sourceforge.pmd.PMD
net.sourceforge.pmd.cli.PMDCommandLineInterface
net.sourceforge.pmd.cli.PMDParameters
net.sourceforge.pmd.cli.PmdParametersParseResult
- pmd-core
-
The asset filenames of PMD on GitHub Releases are
nowpmd-dist-<version>-bin.zip
,pmd-dist-<version>-src.zip
andpmd-dist-<version>-doc.zip
.
Keep that in mind, if you have an automated download script.The structure inside the ZIP files stay the same, e.g. we still provide inside the binary distribution
ZIP file the base directorypmd-bin-<version>
. -
The CLI option
--stress
(or-stress
) has been removed without replacement. -
The CLI option
--minimum-priority
was changed with 7.0.0-rc1 to only take the following values:
High, Medium High, Medium, Medium Low, Low. With 7.0.0-rc2 compatibility has been restored, so that the equivalent
integer values (1 to 5) are supported as well. -
Replaced
RuleViolation::getFilename
with newRuleViolation#getFileId
, that returns a
FileId
. This is an identifier for aTextFile
and could represent a path name. This allows to have a separate display name, e.g. renderers use
FileNameRenderer
to either display the full path name or a relative path name
(seeRenderer#setFileNameRenderer
and
ConfigurableFileNameRenderer
). Many places where we used a simple String for
a path-like name before have been adapted to use the newFileId
.See PR #4425 for details.
External Contributions
- #4426: [cpd] New XML to HTML XLST report format for PMD CPD - mohan-chinnappan-n (@mohan-chinnappan-n)
- #4431: [coco] CPD: Coco support for code duplication detection - Wener (@wener-tiobe)
- #4470: [cpp] CPD: Added strings as literal and ignore identifiers in sequences - Wener (@wener-tiobe)
- #4507: [java] Fix #4503: A false negative about JUnitTestsShouldIncludeAssert and testng - AnnaDev (@LynnBroe)
- #4533: [java] Fix #4063: False-negative about try/catch block in Loop - AnnaDev (@LynnBroe)
- #4536: [java] Fix #4268: CommentDefaultAccessModifier - false positive with TestNG's @Test annotation - AnnaDev (@LynnBroe)
- #4537: [java] Fix #4455: A false positive about FieldNamingConventions and UtilityClass - AnnaDev (@LynnBroe)
- [#4538](https://github.com/pmd/pmd/pull...
PMD 7.0.0-rc2 (29-April-2023)
29-April-2023 - 7.0.0-rc2
We're excited to bring you the next major version of PMD!
Since this is a big release, we provide here only a concise version of the release notes. We prepared a separate
page with the full Detailed Release Notes for PMD 7.0.0.
PMD 7.0.0 is finally almost ready. In order to gather feedback, we are going to ship a couple of release candidates. These are officially available on GitHub and Maven Central and can be used as usual (e.g. as a dependency). We encourage you to try out the new features, but keep in mind that we may introduce API breaking changes between the release candidates. It should be stable enough if you don't use custom rules.
We have still some tasks planned for the next release candidates. You can see the progress in PMD 7 Tracking Issue #3898.
If you find any problem or difficulty while updating from PMD 6, please provide feedback via our issue tracker. That way we can improve the experience for all.
Expand to see Release Notes
Table Of Contents
- Changes since 7.0.0-rc1
- 🚀 Major Features and Enhancements
- 🎉 Language Related Changes
- New: Swift support
- New: Kotlin support (experimental)
- New: CPD support for TypeScript
- New: CPD support for Julia
- Changed: JavaScript support
- Changed: Language versions
- 🌟 New and changed rules
- 🚨 API
- 💥 Compatibility and migration notes
- 🐛 Fixed Issues
- ✨ External Contributions
- 📈 Stats
Changes since 7.0.0-rc1
This section lists the most important changes from the last release candidate.
The remaining section describes the complete release notes for 7.0.0.
API Changes
- Moved the two classes
AntlrTokenizer
andJavaCCTokenizer
from
internal
package into packagenet.sourceforge.pmd.cpd.impl
. These two classes are part of the API and
are base classes for CPD language implementations. AntlrBaseRule
is gone in favor ofAbstractVisitorRule
.- The classes
KotlinInnerNode
andSwiftInnerNode
are package-private now. - The parameter order of
addSourceFile
has been swapped
in order to have the same meaning as in 6.55.0. That will make it easier if you upgrade from 6.55.0 to 7.0.0.
However, that means, that you need to change these method calls if you have migrated to 7.0.0-rc1 already.
Updated PMD Designer
This PMD release ships a new version of the pmd-designer.
For the changes, see PMD Designer Changelog.
Language Related Changes
- New: CPD support for TypeScript
- New: CPD support for Julia
Rule Changes
ImmutableField
: the propertyignoredAnnotations
has been removed. The property was
deprecated since PMD 6.52.0.SwitchDensity
: the type of the propertyminimum
has been changed from decimal to integer
for consistency with other statistical rules.
Fixed Issues
- cli
- core
- #2500: [core] Clarify API for ANTLR based languages
- doc
- java-codestyle
- java-design
- java-errorprone
- java-multithreading
- #4483: [java] NonThreadSafeSingleton false positive with double-checked locking
- miscellaneous
- #4462: Provide Software Bill of Materials (SBOM)
External contributions
- #4402: [javascript] CPD: add support for Typescript using antlr4 grammar - Paul Guyot (@pguyot)
- #4403: [julia] CPD: Add support for Julia code duplication - Wener (@wener-tiobe)
- #4444: [java] CommentDefaultAccessModifier - ignore org.junit.jupiter.api.extension.RegisterExtension by default - Nirvik Patel (@nirvikpatel)
- #4450: [java] Fix #4449 AvoidAccessibilityAlteration: Correctly handle Lambda expressions in PrivilegedAction scenarios - Seren (@mohui1999)
- #4452: [doc] Update PMD_APEX_ROOT_DIRECTORY documentation reference - nwcm (@nwcm)
- #4474: [java] ImmutableField: False positive with lombok (fixes #4254) - Pim van der Loos (@PimvanderLoos)
- #4488: [java] Fix #4477: A false-positive about SignatureDeclareThrowsException - AnnaDev (@LynnBroe)
- #4494: [java] Fix #4487: A false-positive about UnnecessaryConstructor and @Inject and @Autowired - AnnaDev (@LynnBroe)
- #4495: [java] Fix #4493: false-positive about MissingStaticMethodInNonInstantiatableClass and @Inject - AnnaDev (@LynnBroe)
- #4520: [doc] Fix typo: missing closing quotation mark after CPD-END - João Dinis Ferreira (@joaodinissf)
🚀 Major Features and Enhancements
New official logo
The new official logo of PMD:
Revamped Java module
- Java grammar substantially refactored - more correct regarding the Java Language Specification (JLS)
- Built-in rules have been upgraded for the changed AST
- Rewritten type resolution framework and symbol table correctly implements the JLS
- AST exposes more semantic information (method calls, field accesses)
For more ...
PMD 7.0.0-rc1 (25-March-2023)
25-March-2023 - 7.0.0-rc1
We're excited to bring you the next major version of PMD!
Since this is a big release, we provide here only a concise version of the release notes. We prepared a separate
page with the full Detailed Release Notes for PMD 7.0.0.
PMD 7.0.0 is finally almost ready. In order to gather feedback, we are going to ship a couple of release candidates. These are officially available on GitHub and Maven Central and can be used as usual (e.g. as a dependency). We encourage you to try out the new features, but keep in mind that we may introduce API breaking changes between the release candidates. It should be stable enough if you don't use custom rules.
We have still some tasks planned for the next release candidates. You can see the progress in PMD 7 Tracking Issue #3898.
If you find any problem or difficulty while updating from PMD 6, please provide feedback via our issue tracker. That way we can improve the experience for all.
Expand to see Release Notes
Table Of Contents
- 🚀 Major Features and Enhancements
- 🎉 Language Related Changes
- New: Swift support
- New: Kotlin support (experimental)
- Changed: JavaScript support
- Changed: Language versions
- 🌟 New and changed rules
- 🚨 API
- 💥 Compatibility and migration notes
- 🐛 Fixed Issues
- ✨ External Contributions
- 📈 Stats
🚀 Major Features and Enhancements
New official logo
The new official logo of PMD:
Revamped Java module
- Java grammar substantially refactored - more correct regarding the Java Language Specification (JLS)
- Built-in rules have been upgraded for the changed AST
- Rewritten type resolution framework and symbol table correctly implements the JLS
- AST exposes more semantic information (method calls, field accesses)
For more information, see the Detailed Release Notes for PMD 7.
Contributors: Clément Fournier (@oowekyala),
Andreas Dangel (@adangel),
Juan Martín Sotuyo Dodero (@jsotuyod)
Revamped Command Line Interface
- unified and consistent Command Line Interface for both Linux/Unix and Windows across our different utilities
- single script
pmd
(pmd.bat
for Windows) to launch the different utilities:pmd check
to run PMD rules and analyze a projectpmd cpd
to run CPD (copy paste detector)pmd designer
to run the PMD Rule Designer
- progress bar support for
pmd check
- shell completion
For more information, see the Detailed Release Notes for PMD 7.
Contributors: Juan Martín Sotuyo Dodero (@jsotuyod)
Full Antlr support
- Antlr based grammars can now be used to build full-fledged PMD rules.
- Previously, Antlr grammar could only be used for CPD
- New supported languages: Swift and Kotlin
For more information, see the Detailed Release Notes for PMD 7.
Contributors: Lucas Soncini (@lsoncini),
Matías Fraga (@matifraga),
Tomás De Lucca (@tomidelucca)
🎉 Language Related Changes
Note that this is just a concise listing of the highlight.
For more information on the languages, see the Detailed Release Notes for PMD 7.
New: Swift support
- use PMD to analyze Swift code with PMD rules
- initially 4 built-in rules
Contributors: Lucas Soncini (@lsoncini),
Matías Fraga (@matifraga),
Tomás De Lucca (@tomidelucca)
New: Kotlin support (experimental)
- use PMD to analyze Kotlin code with PMD rules
- Support for Kotlin 1.8 grammar
- initially 2 built-in rules
Changed: JavaScript support
- latest version supports ES6 and also some new constructs (see Rhino])
- comments are retained
Changed: Language versions
- more predefined language versions for each supported language
- can be used to limit rule execution for specific versions only with
minimumLanguageVersion
and
maximumLanguageVersion
attributes.
🌟 New and changed rules
New Rules
Apex
UnusedMethod
finds unused methods in your code.
Java
UnnecessaryBoxing
reports boxing and unboxing conversions that may be made implicit.
Kotlin
Swift
Changed Rules
Java
UnnecessaryFullyQualifiedName
: the rule has two new properties,
to selectively disable reporting on static field and method qualifiers. The rule also has been improved
to be more precise.UselessParentheses
: the rule has two new properties which control how strict
the rule should be applied. WithignoreClarifying
(default: true) parentheses that are strictly speaking
not necessary are allowed, if they separate expressions of different precedence.
The other propertyignoreBalancing
(default: true) is similar, in that it allows parentheses that help
reading and understanding the expressions.LooseCoupling
: the rule has a new property to allow some types to be coupled
to (allowedTypes
).EmptyCatchBlock
:CloneNotSupportedException
andInterruptedException
are not
special-cased anymore. Rename the exception parameter toignored
to ignore them.DontImportSun
:sun.misc.Signal
is not special-cased anymore.UseDiamondOperator
: the propertyjava7Compatibility
is removed. The rule now
handles Java 7 properly without a property.SingularField
: PropertiescheckInnerClasses
anddisallowNotAssignment
are removed.
The rule is now more precise and will check these cases properly.UseUtilityClass
: The propertyignoredAnnotations
has been removed.LawOfDemeter
: the rule has a new propertytrustRadius
. This defines the maximum degree
of trusted data. The default of 1 is the most restrictive.CommentContent
: The propertiescaseSensitive
anddisallowedTerms
are removed. The
new propertyfobiddenRegex
can be used now to define the disallowed terms with a single regular
expression.
Removed Rules
Many rules, that were previously deprecated have been finally removed.
See Detailed Release Notes for PMD 7 for the complete list.
🚨 API
The API of PMD has been growing over the years and needed some cleanup. The goal is, to
have a clear separation between a well-defined API and the implementation, which is internal.
This should help us in future development.
Also, there are some improvement and changes in different areas. For the ...
PMD 6.55.0 (25-February-2023)
25-February-2023 - 6.55.0
The PMD team is pleased to announce PMD 6.55.0.
This is a minor release.
Table Of Contents
New and noteworthy
PMD 7 Development
This release is the last planned release of PMD 6. The first version 6.0.0 was released in December 2017.
Over the course of more than 5 years we published almost every month a new minor version of PMD 6
with new features and improvements.
Already in November 2018 we started in parallel the development of the next major version 7.0.0,
and we are now in the process of finalizing the scope of the major version. We want to release a couple of
release candidates before publishing the final version 7.0.0.
We plan to release 7.0.0-rc1 soon. You can see the progress in PMD 7 Tracking Issue #3898.
Java 20 Support
This release of PMD brings support for Java 20. There are no new standard language features.
PMD supports JEP 433: Pattern Matching for switch (Fourth Preview) and
JEP 432: Record Patterns (Second Preview) as preview language features.
In order to analyze a project with PMD that uses these language features,
you'll need to enable it via the environment variable PMD_JAVA_OPTS
and select the new language
version 20-preview
:
export PMD_JAVA_OPTS=--enable-preview
./run.sh pmd --use-version java-20-preview ...
T-SQL support
Thanks to the contribution from Paul Guyot PMD now has CPD support
for T-SQL (Transact-SQL).
Being based on a proper Antlr grammar, CPD can:
- ignore comments
- honor comment-based suppressions
Fixed Issues
- core
- #4395: [core] Support environment variable CLASSPATH with pmd.bat under Windows
- java
- #4333: [java] Support JDK 20
- java-errorprone
- #4393: [java] MissingStaticMethodInNonInstantiatableClass false-positive for Lombok's @UtilityClass for classes with non-private fields
API Changes
Go
- The LanguageModule of Go, that only supports CPD execution, has been deprecated. This language
is not fully supported by PMD, so having a language module does not make sense. The functionality of CPD is
not affected by this change. The following class has been deprecated and will be removed with PMD 7.0.0:
Java
- Support for Java 18 preview language features have been removed. The version "18-preview" is no longer available.
- The experimental class
net.sourceforge.pmd.lang.java.ast.ASTGuardedPattern
has been removed.
External Contributions
- #4384: [swift] Add more swift 5.x support (#unavailable mainly) - Richard B. (@kenji21)
- #4390: Add support for T-SQL using Antlr4 lexer - Paul Guyot (@pguyot)
- #4392: [java] Fix #4393 MissingStaticMethodInNonInstantiatableClass: Fix false-positive for field-only class - Dawid Ciok (@dawiddc)
Stats
- 40 commits
- 11 closed tickets & PRs
- Days since last release: 28
PMD 6.54.0 (28-January-2023)
28-January-2023 - 6.54.0
The PMD team is pleased to announce PMD 6.54.0.
This is a minor release.
Table Of Contents
New and noteworthy
New report format html-report-v2.xslt
Thanks to @mohan-chinnappan-n a new PMD report format has been added which features a data table
with charting functions. It uses an XSLT stylesheet to convert PMD's XML format into HTML.
See the example report.
Fixed Issues
- apex-bestpractices
- #2669: [apex] UnusedLocalVariable false positive in dynamic SOQL
- core
- java
- #4364: [java] Parsing error with textblock containing quote followed by two backslashes
- testing
- #4236: [test] kotest logs look broken
API Changes
PMD CLI
- PMD now supports a new
--relativize-paths-with
flag (or short-z
), which replaces--short-names
.
It serves the same purpose: Shortening the pathnames in the reports. However, with the new flag it's possible
to explicitly define one or more pathnames that should be used as the base when creating relative paths.
The old flag--short-names
is deprecated.
Deprecated APIs
For removal
-
ApexRootNode#getApexVersion
has been deprecated for removal. The version returned is
alwaysVersion.CURRENT
, as the apex compiler integration doesn't use additional information which Apex version
actually is used. Therefore, this method can't be used to determine the Apex version of the project
that is being analyzed. -
CPDConfiguration#setEncoding
and
CPDConfiguration#getEncoding
. Use the methods
getSourceEncoding
and
setSourceEncoding
instead. Both are available
forCPDConfiguration
which extendsAbstractConfiguration
. -
BaseCLITest
andBaseCPDCLITest
have been deprecated for removal without
replacement. CLI tests should be done in pmd-core only (and in PMD7 in pmd-cli). Individual language modules
shouldn't need to test the CLI integration logic again. Instead, the individual language modules should test their
functionality as unit tests. -
FileCollector#addZipFile
has been deprecated. It is replaced
byFileCollector#addZipFileWithContent
which directly adds the
content of the zip file for analysis. -
PMDConfiguration#setReportShortNames
and
PMDConfiguration#isReportShortNames
have been deprecated for removal.
UsePMDConfiguration#addRelativizeRoot
instead.
Internal APIs
CSVWriter
- Some fields in
AbstractAntTestHelper
Experimental APIs
- CPDReport has a new method which limited mutation of a given report:
filterMatches
creates a new CPD report
with some matches removed with a given predicate based filter.
External Contributions
- #4110: [apex] Feature/unused variable bind false positive with dynamic SOQL - Thomas Prouvot (@tprouvot)
- #4125: [core] New report format html-report-v2.xslt to provide html with datatable and chart features - Mohan Chinnappan - (@mohan-chinnappan-n)
- #4280: [apex] Deprecate ApexRootNode.getApexVersion - Aaron Hurst (@aaronhurst-google)
- #4285: [java] CommentDefaultAccessModifier - add co.elastic.clients.util.VisibleForTesting as default suppressed annotation - Matthew Luckam (@mluckam)
Stats
- 107 commits
- 19 closed tickets & PRs
- Days since last release: 27
PMD 6.53.0 (31-December-2022)
31-December-2022 - 6.53.0
The PMD team is pleased to announce PMD 6.53.0.
This is a minor release.
Table Of Contents
New and noteworthy
Modified rules
- The Java rule
UnusedPrivateField
has a new propertyreportForAnnotations
.
This is a list of fully qualified names of the annotation types that should be reported anyway. If an unused field
has any of these annotations, then it is reported. If it has any other annotation, then it is still considered
to be used and is not reported.
Deprecated rules
-
The Java rules
ExcessiveClassLength
andExcessiveMethodLength
have been deprecated. The ruleNcssCount
can be used instead.
The deprecated rules will be removed with PMD 7.0.0. -
The Java rule
EmptyStatementNotInLoop
is deprecated.
Use the ruleUnnecessarySemicolon
instead.
Note: Actually it was announced to be deprecated since 6.46.0 but the rule was not marked as deprecated yet.
This has been done now.
Fixed Issues
- core
- #4248: [core] Can't analyze sources in zip files
- apex-security
- #4146: [apex] ApexCRUDViolation: Recognize User Mode in SOQL + DML
- java
- #4266: [java] PMD fails to process a record with lambda in compact constructor
- java-bestpractices
- java-design
- #2127: [java] Deprecate rules ExcessiveClassLength and ExcessiveMethodLength
- java-errorprone
- #4164: [java][doc] AvoidAssertAsIdentifier and AvoidEnumAsIdentifier - clarify use case
- java-multithreading
- #4210: [java] DoNotUseThreads report duplicate warnings
API Changes
Deprecated APIs
For removal
These classes / APIs have been deprecated and will be removed with PMD 7.0.0.
ExcessiveLengthRule
(Java)
External Contributions
- #4244: [apex] ApexCRUDViolation: user mode and system mode with test cases added - Tarush Singh (@Tarush-Singh35)
- #4274: [java] Fix finding lambda scope in record compact constructor - kdebski85 (@kdebski85)
Stats
- 43 commits
- 17 closed tickets & PRs
- Days since last release: 35