24 April 2020
The PMD team is pleased to announce PMD 6.23.0.
This is a minor release.
To facilitate healthy and constructive community behavior PMD adopts Contributor Convenant as its code of conduct.
Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.
You can find the code of conduct in the file code_of_conduct.md in our repository.
XPath rules written with XPath 2.0 now support conversion to a rulechain rule, which
improves their performance. The rulechain is a mechanism that allows several rules
to be executed in a single tree traversal. Conversion to the rulechain is possible if
your XPath expression looks like //someNode/... | //someOtherNode/... | ...
, that
is, a union of one or more path expressions that start with //
. Instead of traversing
the whole tree once per path expression (and per rule), a single traversal executes all
rules in your ruleset as needed.
This conversion is performed automatically and cannot be disabled. The conversion should not change the result of your rules, if it does, please report a bug at https://github.com/pmd/pmd/issues
Note that XPath 1.0 support, the default XPath version, is deprecated since PMD 6.22.0. We highly recommend that you upgrade your rules to XPath 2.0. Please refer to the migration guide.
PMD uses the Rhino library to parse Javascript.
The default version has been set to ES6
, so that some ECMAScript 2015 features are
supported. E.g. let
statements and for-of
loops are now parsed. However Rhino does
not support all features.
PMD now supports a JSON renderer (use it with -f json
on the CLI).
See the documentation and example
The new Apex rule FieldDeclarationsShouldBeAtStart
(apex-codestyle
)
helps to ensure that field declarations are always at the beginning of a class.
The new Apex rule UnusedLocalVariable
(apex-bestpractices
) detects unused
local variables.
Those APIs are not intended to be used by clients, and will be hidden or removed with PMD 7.0.0.
You can identify them with the @InternalApi
annotation. You’ll also get a deprecation warning.
As part of the changes we’d like to do to AST classes for 7.0.0, we would like to hide some methods and constructors that rule writers should not have access to. The following usages are now deprecated in the Apex, Javascript, PL/SQL, Scala and Visualforce ASTs:
InternalApi
. Nodes should only be obtained from the parser,
which for rules, means that they never need to instantiate node themselves.
Those constructors will be made package private with 7.0.0.Parser
(eg VfParser
) are deprecated and should not be used directly.
Use LanguageVersionHandler#getParser
instead.TokenManager
(eg VfTokenManager
) are deprecated and should not be used outside of our implementation.
This also affects CPD-only modules.These deprecations are added to the following language modules in this release. Please look at the package documentation to find out the full list of deprecations.
net.sourceforge.pmd.lang.apex.ast
net.sourceforge.pmd.lang.ecmascript.ast
net.sourceforge.pmd.lang.plsql.ast
net.sourceforge.pmd.lang.scala.ast
net.sourceforge.pmd.lang.vf.ast
These deprecations have already been rolled out in a previous version for the following languages:
net.sourceforge.pmd.lang.java.ast
net.sourceforge.pmd.lang.jsp.ast
net.sourceforge.pmd.lang.vm.ast
Outside of these packages, these changes also concern the following TokenManager implementations, and their corresponding Parser if it exists (in the same package):
CppTokenManager
JavaTokenManager
Ecmascript5TokenManager
JspTokenManager
MatlabTokenManager
ModelicaTokenManager
ObjectiveCTokenManager
PLSQLTokenManager
PythonTokenManager
VfTokenManager
VmTokenManager
In the Java AST the following attributes are deprecated and will issue a warning when used in XPath rules:
ASTAdditiveExpression#getImage
- use getOperator()
insteadASTVariableDeclaratorId#getImage
- use getName()
insteadASTVariableDeclaratorId#getVariableName
- use getName()
insteadParser#getTokenManager
TokenManager#setFileName
AbstractTokenManager#setFileName
AbstractTokenManager#getFileName
AntlrToken#getType
- use getKind()
instead.ImmutableLanguage
MockRule
Node#getFirstParentOfAnyType
Node#getAsDocument
AbstractNode#hasDescendantOfAnyType
ASTRecordDeclaration#getComponentList
XPathRule
. See javadoc for details.