diff --git a/docs/pages/release_notes_pmd7.md b/docs/pages/release_notes_pmd7.md index 8b13789179..b8024d9779 100644 --- a/docs/pages/release_notes_pmd7.md +++ b/docs/pages/release_notes_pmd7.md @@ -1 +1,3545 @@ +--- +title: Detailed Release Notes for PMD 7 +summary: "These are the detailed release notes for PMD 7." +permalink: pmd_release_notes_pmd7.html +keywords: changelog, release notes +--- +## 🚀 Major Features and Enhancements + +### New official logo + +Many of you probably have already seen the new logo, but now it's time to actually ship it. The new logo +was long ago decided (see [#1663](https://github.com/pmd/pmd/issues/1663)). + +We decided it's time to have a modernized logo and get rid of the gun. This allows to include +the logo anywhere without offense. + +The official logo is also without a tagline (such as "Code Quality Matters!") as the tagline created some +controversies. Without a tagline, we are not limited in the direction of future development of PMD. + +![New PMD Logo](images/logo/pmd-logo-300px.png) + +The new logo is available from the [Logo Project Page](pmd_projectdocs_logo.html). + +### Revamped Java + +The Java grammar has been refactored substantially in order to make it easier to maintain and more correct +regarding the Java Language Specification. It supports now also the edge-cases where PMD 6 was failing +(e.g. annotations were not supported everywhere). Changing the grammar entails a changed AST and therefore changed +rules. The PMD built-in rules have all been upgraded and many bugs have been fixed on the way. +Unfortunately, if you are using custom rules, you will most probably need to accommodate these changes yourself. + +The type resolution framework has been rewritten from scratch and should now cover the entire Java spec correctly. +The same is true for the symbol table. +PMD 6 on the other hand has always had problems with advanced type inference, e.g. with lambdas and call chains. +Since it was built on the core reflection API, it also was prone to linkage errors and classloader leaks for instance. +PMD 7 does not need to load classes, and does not have these problems. + +The AST exposes much more semantic information now. For instance, you can jump from a method call to +the declaration of the method being called, or from a field access to the field declaration. These +improvements allow interesting rules to be written that need precise knowledge of the types +in the program, for instance to detect [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing) +or [`UseDiamondOperator`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#usediamondoperator). +These are just a small preview of the new rules we will be adding in the PMD 7 release cycle. + +Overall, the changes to the parser, AST, type resolution and symbol table code has made PMD for +Java **significantly faster**. On average, we have seen ~2-3X faster analysis, but as usual, this may change +depending on your workload, configuration and ruleset. + +Contributors: [Clément Fournier](https://github.com/oowekyala) (@oowekyala), +[Andreas Dangel](https://github.com/adangel) (@adangel), +[Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod) + +
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` and `max` attributes in property definitions in the XML are now optional and can appear separately
+ or be omitted.
+
+### Changed: Velocity Template Language (VTL)
+
+The module was named just "vm" which was not a good name. Its module name, language id and
+package names have been renamed to "velocity".
+
+If you import rules, you also need to adjust the paths, e.g.
+
+* `category/vm/...` ➡️ `category/velocity/...`
+
+### Changed: Visualforce
+
+There was an inconsistency between the naming of the maven module and the language id. The language id
+used the abbreviation "vf", while the maven module used the longer name "visualforce". This has been
+solved by renaming the language module to its full name "visualforce". The java packages have
+been renamed as well.
+
+If you import rules, you also need to adjust the paths, e.g.
+
+* `category/vf/security.xml` ➡️ `category/visualforce/security.xml`
+
+## 🌟 New and changed rules
+
+### New Rules
+
+**Apex**
+* [`OperationWithHighCostInLoop`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_performance.html#operationwithhighcostinloop) finds Schema class methods called in a loop, which is a
+ potential performance issue.
+* [`UnusedMethod`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_design.html#unusedmethod) finds unused methods in your code.
+
+**Java**
+* [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing) reports boxing and unboxing conversions that may be made implicit.
+* [`UseExplicitTypes`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#useexplicittypes) reports usages of `var` keyword, which was introduced with Java 10.
+
+**Kotlin**
+* [`FunctionNameTooShort`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_kotlin_bestpractices.html#functionnametooshort) finds functions with a too short name.
+* [`OverrideBothEqualsAndHashcode`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_kotlin_errorprone.html#overridebothequalsandhashcode) finds classes with only
+ either `equals` or `hashCode` overridden, but not both. This leads to unexpected behavior once instances
+ of such classes are used in collections (Lists, HashMaps, ...).
+
+**Swift**
+* [`ForceCast`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_swift_errorprone.html#forcecast) flags all force casts, making sure you are
+ defensively considering all types. Having the application crash shouldn't be an option.
+* [`ForceTry`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_swift_errorprone.html#forcetry) flags all force tries, making sure you are
+ defensively handling exceptions. Having the application crash shouldn't be an option.
+* [`ProhibitedInterfaceBuilder`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_swift_bestpractices.html#prohibitedinterfacebuilder) flags any usage of interface
+ builder. Interface builder files are prone to merge conflicts, and are impossible to code review, so larger
+ teams usually try to avoid it or reduce its usage.
+* [`UnavailableFunction`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_swift_bestpractices.html#unavailablefunction) flags any function throwing
+ a `fatalError` not marked as `@available(*, unavailable)` to ensure no calls are actually performed in
+ the codebase.
+
+**XML**
+* [`MissingEncoding`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_xml_bestpractices.html#missingencoding) finds XML files without explicit encoding.
+
+### Changed Rules
+
+**General changes**
+
+* All statistical rules (like ExcessiveClassLength, ExcessiveParameterList) have been simplified and unified.
+ The properties `topscore` and `sigma` have been removed. The property `minimum` is still there, however the type is not
+ a decimal number anymore but has been changed to an integer. This affects rules in the languages Apex, Java, PLSQL
+ and Velocity Template Language (velocity):
+ * Apex: [`ExcessiveClassLength`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_design.html#excessiveclasslength), [`ExcessiveParameterList`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_design.html#excessiveparameterlist),
+ [`ExcessivePublicCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_design.html#excessivepubliccount), [`NcssConstructorCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_design.html#ncssconstructorcount),
+ [`NcssMethodCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_design.html#ncssmethodcount), [`NcssTypeCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_design.html#ncsstypecount)
+ * Java: [`ExcessiveImports`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#excessiveimports), [`ExcessiveParameterList`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#excessiveparameterlist),
+ [`ExcessivePublicCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#excessivepubliccount), [`SwitchDensity`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#switchdensity)
+ * PLSQL: [`ExcessiveMethodLength`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#excessivemethodlength), [`ExcessiveObjectLength`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#excessiveobjectlength),
+ [`ExcessivePackageBodyLength`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#excessivepackagebodylength), [`ExcessivePackageSpecificationLength`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#excessivepackagespecificationlength),
+ [`ExcessiveParameterList`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#excessiveparameterlist), [`ExcessiveTypeLength`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#excessivetypelength),
+ [`NcssMethodCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#ncssmethodcount), [`NcssObjectCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#ncssobjectcount),
+ [`NPathComplexity`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_plsql_design.html#npathcomplexity)
+ * Velocity: [`ExcessiveTemplateLength`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_velocity_design.html#excessivetemplatelength)
+
+* The general property `violationSuppressXPath` which is available for all rules to
+ [suppress warnings](pmd_userdocs_suppressing_warnings.html) now uses XPath version 3.1 by default.
+ This version of the XPath language is mostly identical to XPath 2.0. In PMD 6, XPath 1.0 has been used.
+ If you upgrade from PMD 6, you need to verify your `violationSuppressXPath` properties.
+
+**Apex General changes**
+
+* The properties `cc_categories`, `cc_remediation_points_multiplier`, `cc_block_highlighting` have been removed
+ from all rules. These properties have been deprecated since PMD 6.13.0.
+ See [issue #1648](https://github.com/pmd/pmd/issues/1648) for more details.
+
+**Apex Codestyle**
+
+* [`MethodNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_codestyle.html#methodnamingconventions): The deprecated rule property `skipTestMethodUnderscores` has
+ been removed. It was actually deprecated since PMD 6.15.0, but was not mentioned in the release notes
+ back then. Use the property `testPattern` instead to configure valid names for test methods.
+
+**Java General changes**
+
+* Violations reported on methods or classes previously reported the line range of the entire method
+ or class. With PMD 7.0.0, the reported location is now just the identifier of the method or class.
+ This affects various rules, e.g. [`CognitiveComplexity`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#cognitivecomplexity).
+
+ The report location is controlled by the overrides of the method Node#getReportLocation
+ in different node types.
+
+ See [issue #4439](https://github.com/pmd/pmd/issues/4439) and [issue #730](https://github.com/pmd/pmd/issues/730)
+ for more details.
+
+**Java Best Practices**
+
+* [`ArrayIsStoredDirectly`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#arrayisstoreddirectly): Violations are now reported on the assignment and not
+ anymore on the formal parameter. The reported line numbers will probably move.
+* [`AvoidReassigningLoopVariables`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#avoidreassigningloopvariables): This rule might not report anymore all
+ reassignments of the control variable in for-loops when the property `forReassign` is set to `skip`.
+ See [issue #4500](https://github.com/pmd/pmd/issues/4500) for more details.
+* [`LooseCoupling`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#loosecoupling): The rule has a new property to allow some types to be coupled
+ to (`allowedTypes`).
+* [`UnusedLocalVariable`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#unusedlocalvariable): This rule has some important false-negatives fixed
+ and finds many more cases now. For details see issues [#2130](https://github.com/pmd/pmd/issues/2130),
+ [#4516](https://github.com/pmd/pmd/issues/4516), and [#4517](https://github.com/pmd/pmd/issues/4517).
+
+**Java Codestyle**
+
+* [`MethodNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#methodnamingconventions): The property `checkNativeMethods` has been removed. The
+ property was deprecated since PMD 6.3.0. Use the property `nativePattern` to control whether native methods
+ should be considered or not.
+* [`ShortVariable`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#shortvariable): This rule now also reports short enum constant names.
+* [`UseDiamondOperator`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#usediamondoperator): The property `java7Compatibility` has been removed. The rule now
+ handles Java 7 properly without a property.
+* [`UnnecessaryFullyQualifiedName`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#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`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#uselessparentheses): The rule has two new properties which control how strict
+ the rule should be applied. With `ignoreClarifying` (default: true) parentheses that are strictly speaking
+ not necessary are allowed, if they separate expressions of different precedence.
+ The other property `ignoreBalancing` (default: true) is similar, in that it allows parentheses that help
+ reading and understanding the expressions.
+* [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement): The rule has a new property to allow empty blocks when
+ they contain a comment (`allowCommentedBlocks`).
+
+**Java Design**
+
+* [`CyclomaticComplexity`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#cyclomaticcomplexity): The property `reportLevel` has been removed. The property was
+ deprecated since PMD 6.0.0. The report level can now be configured separated for classes and methods using
+ `classReportLevel` and `methodReportLevel` instead.
+* [`ImmutableField`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#immutablefield): The property `ignoredAnnotations` has been removed. The property was
+ deprecated since PMD 6.52.0.
+* [`LawOfDemeter`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#lawofdemeter): The rule has a new property `trustRadius`. This defines the maximum degree
+ of trusted data. The default of 1 is the most restrictive.
+* [`NPathComplexity`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#npathcomplexity): The property `minimum` has been removed. It was deprecated since PMD 6.0.0.
+ Use the property `reportLevel` instead.
+* [`SingularField`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#singularfield): The properties `checkInnerClasses` and `disallowNotAssignment` have been removed.
+ The rule is now more precise and will check these cases properly.
+* [`UseUtilityClass`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#useutilityclass): The property `ignoredAnnotations` has been removed.
+
+**Java Documentation**
+
+* [`CommentContent`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_documentation.html#commentcontent): The properties `caseSensitive` and `disallowedTerms` are removed. The
+ new property `forbiddenRegex` can be used now to define the disallowed terms with a single regular
+ expression.
+* [`CommentRequired`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_documentation.html#commentrequired):
+ * Overridden methods are now detected even without the `@Override`
+ annotation. This is relevant for the property `methodWithOverrideCommentRequirement`.
+ See also [pull request #3757](https://github.com/pmd/pmd/pull/3757).
+ * Elements in annotation types are now detected as well. This might lead to an increased number of violations
+ for missing public method comments.
+ * The deprecated property `headerCommentRequirement` has been removed. Use the property `classCommentRequirement`
+ instead.
+* [`CommentSize`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_documentation.html#commentsize): When determining the line-length of a comment, the leading comment
+ prefix markers (e.g. `*` or `//`) are ignored and don't add up to the line-length.
+ See also [pull request #4369](https://github.com/pmd/pmd/pull/4369).
+
+**Java Error Prone**
+
+* [`AvoidDuplicateLiterals`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#avoidduplicateliterals): The property `exceptionfile` has been removed. The property was
+ deprecated since PMD 6.10.0. Use the property `exceptionList` instead.
+* [`DontImportSun`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#dontimportsun): `sun.misc.Signal` is not special-cased anymore.
+* [`EmptyCatchBlock`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#emptycatchblock): `CloneNotSupportedException` and `InterruptedException` are not
+ special-cased anymore. Rename the exception parameter to `ignored` to ignore them.
+* [`ImplicitSwitchFallThrough`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#implicitswitchfallthrough): Violations are now reported on the case statements
+ rather than on the switch statements. This is more accurate but might result in more violations now.
+* [`NonSerializableClass`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#nonserializableclass): The deprecated property `prefix` has been removed
+ without replacement. In a serializable class all fields have to be serializable regardless of the name.
+
+### Deprecated Rules
+
+In PMD 7.0.0, there are no deprecated rules.
+
+### Removed Rules
+
+The following previously deprecated rules have been finally removed:
+
+**Apex**
+
+* performance.xml/AvoidSoqlInLoops (deleted) ➡️ use [`OperationWithLimitsInLoop`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_performance.html#operationwithlimitsinloop)
+* performance.xml/AvoidSoslInLoops (deleted) ➡️ use [`OperationWithLimitsInLoop`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_performance.html#operationwithlimitsinloop)
+* performance.xml/AvoidDmlStatementsInLoops (deleted) ➡️ use [`OperationWithLimitsInLoop`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_performance.html#operationwithlimitsinloop)
+* codestyle.xml/VariableNamingConventions (deleted) ➡️ use [`FieldNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_codestyle.html#fieldnamingconventions),
+ [`FormalParameterNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_codestyle.html#formalparameternamingconventions), [`LocalVariableNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_codestyle.html#localvariablenamingconventions),
+ or [`PropertyNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_codestyle.html#propertynamingconventions)
+* security.xml/ApexCSRF (deleted) ➡️ use [`ApexCSRF`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_errorprone.html#apexcsrf)
+
+**Java**
+
+* codestyle.xml/AbstractNaming (deleted) ➡️ use [`ClassNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#classnamingconventions)
+* codestyle.xml/AvoidFinalLocalVariable (deleted) ➡️ not replaced
+* codestyle.xml/AvoidPrefixingMethodParameters (deleted) ➡️ use [`FormalParameterNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#formalparameternamingconventions)
+* performance.xml/AvoidUsingShortType (deleted) ➡️ not replaced
+* errorprone.xml/BadComparison (deleted) ➡️ use [`ComparisonWithNaN`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#comparisonwithnan)
+* errorprone.xml/BeanMembersShouldSerialize (deleted) ➡️ use [`NonSerializableClass`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#nonserializableclass)
+* performance.xml/BooleanInstantiation (deleted) ➡️ use [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing)
+ and [`PrimitiveWrapperInstantiation`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#primitivewrapperinstantiation)
+* performance.xml/ByteInstantiation (deleted) ➡️ use [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing)
+ and [`PrimitiveWrapperInstantiation`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#primitivewrapperinstantiation)
+* errorprone.xml/CloneThrowsCloneNotSupportedException (deleted) ➡️ not replaced
+* errorprone.xml/DataflowAnomalyAnalysis (deleted) ➡️ use [`UnusedAssignment`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#unusedassignment)
+* codestyle.xml/DefaultPackage (deleted) ➡️ use [`CommentDefaultAccessModifier`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#commentdefaultaccessmodifier)
+* errorprone.xml/DoNotCallSystemExit (deleted) ➡️ use [`DoNotTerminateVM`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#donotterminatevm)
+* codestyle.xml/DontImportJavaLang (deleted) ➡️ use [`UnnecessaryImport`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryimport)
+* codestyle.xml/DuplicateImports (deleted) ➡️ use [`UnnecessaryImport`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryimport)
+* errorprone.xml/EmptyFinallyBlock (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* errorprone.xml/EmptyIfStmt (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* errorprone.xml/EmptyInitializer (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* errorprone.xml/EmptyStatementBlock (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* errorprone.xml/EmptyStatementNotInLoop (deleted) ➡️ use [`UnnecessarySemicolon`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessarysemicolon)
+* errorprone.xml/EmptySwitchStatements (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* errorprone.xml/EmptySynchronizedBlock (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* errorprone.xml/EmptyTryBlock (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* errorprone.xml/EmptyWhileStmt (deleted) ➡️ use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#emptycontrolstatement)
+* design.xml/ExcessiveClassLength (deleted) ➡️ use [`NcssCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#ncsscount)
+* design.xml/ExcessiveMethodLength (deleted) ➡️ use [`NcssCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#ncsscount)
+* codestyle.xml/ForLoopsMustUseBraces (deleted) ➡️ use [`ControlStatementBraces`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#controlstatementbraces)
+* codestyle.xml/IfElseStmtsMustUseBraces (deleted) ➡️ use [`ControlStatementBraces`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#controlstatementbraces)
+* codestyle.xml/IfStmtsMustUseBraces (deleted) ➡️ use [`ControlStatementBraces`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#controlstatementbraces)
+* errorprone.xml/ImportFromSamePackage (deleted) ➡️ use [`UnnecessaryImport`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryimport)
+* performance.xml/IntegerInstantiation (deleted) ➡️ use [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing)
+ and [`PrimitiveWrapperInstantiation`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#primitivewrapperinstantiation)
+* errorprone.xml/InvalidSlf4jMessageFormat (deleted) ➡️ use [`InvalidLogMessageFormat`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#invalidlogmessageformat)
+* errorprone.xml/LoggerIsNotStaticFinal (deleted) ➡️ use [`ProperLogger`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#properlogger)
+* performance.xml/LongInstantiation (deleted) ➡️ use [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing)
+ and [`PrimitiveWrapperInstantiation`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#primitivewrapperinstantiation)
+* codestyle.xml/MIsLeadingVariableName (deleted) ➡️ use [`FieldNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#fieldnamingconventions),
+ [`FormalParameterNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#formalparameternamingconventions),
+ or [`LocalVariableNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#localvariablenamingconventions)
+* errorprone.xml/MissingBreakInSwitch (deleted) ➡️ use [`ImplicitSwitchFallThrough`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#implicitswitchfallthrough)
+* design.xml/ModifiedCyclomaticComplexity (deleted) ➡️ use [`CyclomaticComplexity`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#cyclomaticcomplexity)
+* design.xml/NcssConstructorCount (deleted) ➡️ use [`NcssCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#ncsscount)
+* design.xml/NcssMethodCount (deleted) ➡️ use [`NcssCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#ncsscount)
+* design.xml/NcssTypeCount (deleted) ➡️ use [`NcssCount`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#ncsscount)
+* bestpractices.xml/PositionLiteralsFirstInCaseInsensitiveComparisons (deleted) ➡️
+ use [`LiteralsFirstInComparisons`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#literalsfirstincomparisons)
+* bestpractices.xml/PositionLiteralsFirstInComparisons (deleted) ➡️
+ use [`LiteralsFirstInComparisons`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#literalsfirstincomparisons)
+* errorprone.xml/ReturnEmptyArrayRatherThanNull (deleted) ➡️
+ use [`ReturnEmptyCollectionRatherThanNull`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_errorprone.html#returnemptycollectionratherthannull)
+* performance.xml/ShortInstantiation (deleted) ➡️ use [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing)
+ and [`PrimitiveWrapperInstantiation`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#primitivewrapperinstantiation)
+* design.xml/SimplifyBooleanAssertion (deleted) ➡️ use [`SimplifiableTestAssertion`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#simplifiabletestassertion)
+* performance.xml/SimplifyStartsWith (deleted) ➡️ not replaced
+* design.xml/StdCyclomaticComplexity (deleted) ➡️ use [`CyclomaticComplexity`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_design.html#cyclomaticcomplexity)
+* codestyle.xml/SuspiciousConstantFieldName (deleted) ➡️ use [`FieldNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#fieldnamingconventions)
+* performance.xml/UnnecessaryWrapperObjectCreation (deleted) ➡️ use the new rule [`UnnecessaryBoxing`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryboxing)
+* multithreading.xml/UnsynchronizedStaticDateFormatter (deleted) ➡️ use [`UnsynchronizedStaticFormatter`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_multithreading.html#unsynchronizedstaticformatter)
+* bestpractices.xml/UnusedImports (deleted) ➡️ use [`UnnecessaryImport`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#unnecessaryimport)
+* bestpractices.xml/UseAssertEqualsInsteadOfAssertTrue (deleted) ➡️ use [`SimplifiableTestAssertion`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#simplifiabletestassertion)
+* bestpractices.xml/UseAssertNullInsteadOfAssertEquals (deleted) ➡️ use [`SimplifiableTestAssertion`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#simplifiabletestassertion)
+* bestpractices.xml/UseAssertSameInsteadOfAssertEquals (deleted) ➡️ use [`SimplifiableTestAssertion`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#simplifiabletestassertion)
+* bestpractices.xml/UseAssertTrueInsteadOfAssertEquals (deleted) ➡️ use [`SimplifiableTestAssertion`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_bestpractices.html#simplifiabletestassertion)
+* codestyle.xml/VariableNamingConventions (deleted) ➡️ use [`FieldNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#fieldnamingconventions),
+ [`FormalParameterNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#formalparameternamingconventions), or [`LocalVariableNamingConventions`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#localvariablenamingconventions)
+* codestyle.xml/WhileLoopsMustUseBraces (deleted) ➡️ use [`ControlStatementBraces`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_java_codestyle.html#controlstatementbraces)
+
+### Removed rulesets
+
+The following previously deprecated rulesets have been removed. These were the left-over rulesets from PMD 5.
+The rules have been moved into categories with PMD 6.
+
+* rulesets/apex/apexunit.xml
+* rulesets/apex/braces.xml
+* rulesets/apex/complexity.xml
+* rulesets/apex/empty.xml
+* rulesets/apex/metrics.xml
+* rulesets/apex/performance.xml
+* rulesets/apex/ruleset.xml
+* rulesets/apex/securty.xml
+* rulesets/apex/style.xml
+* rulesets/java/android.xml
+* rulesets/java/basic.xml
+* rulesets/java/clone.xml
+* rulesets/java/codesize.xml
+* rulesets/java/comments.xml
+* rulesets/java/controversial.xml
+* rulesets/java/coupling.xml
+* rulesets/java/design.xml
+* rulesets/java/empty.xml
+* rulesets/java/finalizers.xml
+* rulesets/java/imports.xml
+* rulesets/java/j2ee.xml
+* rulesets/java/javabeans.xml
+* rulesets/java/junit.xml
+* rulesets/java/logging-jakarta-commons.xml
+* rulesets/java/logging-java.xml
+* rulesets/java/metrics.xml
+* rulesets/java/migrating.xml
+* rulesets/java/migrating_to_13.xml
+* rulesets/java/migrating_to_14.xml
+* rulesets/java/migrating_to_15.xml
+* rulesets/java/migrating_to_junit4.xml
+* rulesets/java/naming.xml
+* rulesets/java/optimizations.xml
+* rulesets/java/strictexception.xml
+* rulesets/java/strings.xml
+* rulesets/java/sunsecure.xml
+* rulesets/java/typeresolution.xml
+* rulesets/java/unnecessary.xml
+* rulesets/java/unusedcode.xml
+* rulesets/ecmascript/basic.xml
+* rulesets/ecmascript/braces.xml
+* rulesets/ecmascript/controversial.xml
+* rulesets/ecmascript/unnecessary.xml
+* rulesets/jsp/basic.xml
+* rulesets/jsp/basic-jsf.xml
+* rulesets/plsql/codesize.xml
+* rulesets/plsql/dates.xml
+* rulesets/plsql/strictsyntax.xml
+* rulesets/plsql/TomKytesDespair.xml
+* rulesets/vf/security.xml
+* rulesets/vm/basic.xml
+* rulesets/pom/basic.xml
+* rulesets/xml/basic.xml
+* rulesets/xsl/xpath.xml
+* rulesets/releases/*
+
+## 💥 Compatibility and Migration Notes
+
+AbstractRule#buildTargetSelector
+ using RuleTargetSelector#forTypes
.
+* The asset filenames of PMD on [GitHub Releases](https://github.com/pmd/pmd/releases) are
+ now `pmd-dist-PMD
is gone.
+
+## 🚨 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.
+
+This however entails some incompatibilities and deprecations.
+
+See [ADR 3 - API evolution principles](pmd_projectdocs_decisions_adr_3.html) and
+[API changes](#api-changes) below.
+
+### Small Changes and cleanups
+
+* [#1648](https://github.com/pmd/pmd/issues/1648): \[apex,vf] Remove CodeClimate dependency - [Robert Sösemann](https://github.com/rsoesemann)
+ Properties "cc_categories", "cc_remediation_points_multiplier", "cc_block_highlighting" can no longer be overridden in rulesets.
+ They were deprecated without replacement.
+
+* The old GUI applications accessible through `run.sh designerold` and `run.sh bgastviewer`
+ (and corresponding Batch scripts) have been removed from the PMD distribution. Please use the newer rule designer
+ with `pmd designer`. The corresponding classes in packages `java.net.sourceforge.pmd.util.viewer` and
+ `java.net.sourceforge.pmd.util.designer` have all been removed.
+
+* All API related to XPath support has been moved to the package net.sourceforge.pmd.lang.rule.xpath
.
+ This includes API that was previously dispersed over `net.sourceforge.pmd.lang`, `net.sourceforge.pmd.lang.ast.xpath`,
+ `net.sourceforge.pmd.lang.rule.xpath`, `net.sourceforge.pmd.lang.rule`, and various language-specific packages
+ (which were made internal).
+
+* The implementation of the Ant integration has been moved from the module `pmd-core` to a new module `pmd-ant`.
+ This involves classes in package net.sourceforge.pmd.ant
. The ant CPDTask class `net.sourceforge.pmd.cpd.CPDTask`
+ has been moved into the same package net.sourceforge.pmd.ant
. You'll need to update your taskdef entries in your
+ build.xml files with the FQCN net.sourceforge.pmd.ant.CPDTask
if you use it anywhere.
+
+* Utility classes in net.sourceforge.pmd.util
, that have previously marked as `@InternalApi` have been finally
+ moved to an internal sub package and are now longer available.
+ This includes ClasspathClassLoader, FileFinder, FileUtil, and IOUtil.
+
+* The following utility classes in net.sourceforge.pmd.util
are now considered public API:
+ * AssertionUtil
+ * CollectionUtil
+ * ContextedAssertionError
+ * ContextedStackOverflowError
+ * GraphUtil
+ * IteratorUtil
+ * StringUtil
+
+* Moved the two classes AntlrCpdLexer
and JavaccCpdLexer
from
+ `internal` package into package net.sourceforge.pmd.cpd.impl
. These two classes are part of the API and
+ are base classes for CPD language implementations. Since 7.0.0-rc2.
+ Note: These two classes have been previously called "AntlrTokenizer" and "JavaCCTokenizer".
+* `AntlrBaseRule` is gone in favor of AbstractVisitorRule
. Since 7.0.0-rc2.
+* The classes `net.sourceforge.pmd.lang.kotlin.ast.KotlinInnerNode` and
+ `net.sourceforge.pmd.lang.swift.ast.SwiftInnerNode` are package-private now. Since 7.0.0-rc2.
+
+### XPath 3.1 support
+
+Support for XPath versions 1.0, 1.0-compatibility, 2.0 was removed. The default
+(and only) supported XPath version is now XPath 3.1. This version of the XPath language is mostly identical to
+XPath 2.0.
+
+Notable changes:
+* The deprecated support for sequence-valued attributes is removed. Sequence-valued properties are still supported.
+* Refer to [the Saxonica documentation](https://www.saxonica.com/html/documentation/expressions/xpath31new.html) for
+ an introduction to new features in XPath 3.1.
+
+### Node stream API for AST traversal
+
+This version includes a powerful API to navigate trees, similar in usage to the Java 8 Stream API:
+```java
+node.descendants(ASTMethodCall.class)
+ .filter(m -> "toString".equals(m.getMethodName()))
+ .map(m -> m.getQualifier())
+ .filter(q -> TypeTestUtil.isA(String.class, q))
+ .foreach(System.out::println);
+```
+
+A pipeline like shown here traverses the tree lazily, which is more efficient than traversing eagerly to put all
+descendants in a list. It is also much easier to change than the old imperative way.
+
+To make this API as accessible as possible, the Node
interface has been fitted with new
+methods producing node streams. Those methods replace previous tree traversal methods like `Node#findDescendantsOfType`.
+In all cases, they should be more efficient and more convenient.
+
+See NodeStream
for more details.
+
+Contributors: [Clément Fournier](https://github.com/oowekyala) (@oowekyala)
+
+### Metrics framework
+
+The metrics framework has been made simpler and more general.
+
+* The metric interface takes an additional type parameter, representing the result type of the metric. This is
+ usually `Integer` or `Double`. It avoids widening the result to a `double` just to narrow it down.
+
+ This makes it so, that `Double.NaN` is not an appropriate sentinel value to represent "not supported" anymore.
+ Instead, `computeFor` may return `null` in that case (or a garbage value). The value `null` may have caused
+ problems with the narrowing casts, which through unboxing, might have thrown an NPE. But when we deprecated
+ the language-specific metrics façades to replace them with the generic MetricsUtil
,
+ we took care of making
+ the new methods throw an exception if the metric cannot be computed on the parameter. This forces you to guard
+ calls to MetricsUtil#computeMetric
(and other overloads)
+ with something like `if (metric.supports(node))`. If you're following
+ this pattern, then you won't observe the undefined behavior.
+
+* The `MetricKey` interface is not so useful and has been merged into the Metric
+ interface and removed. So the Metric
interface has the new method
+ displayName
.
+
+* The framework is not tied to at most 2 node types per language anymore. Previously those were nodes for
+ classes and for methods/constructors. Instead, many metrics support more node types. For example, NCSS can
+ be computed on any code block.
+
+ For that reason, keeping around a hard distinction between "class metrics" and "operation metrics" is not
+ useful. So in the Java framework for example, we removed the interfaces `JavaClassMetric`, `JavaOperationMetric`,
+ abstract classes for those, `JavaClassMetricKey`, and `JavaOperationMetricKey`. Metric constants are now all
+ inside the JavaMetrics
utility class. The same was done in the Apex framework.
+
+ We don't really need abstract classes for metrics now. So `AbstractMetric` is also removed from pmd-core.
+ There is a factory method on the Metric
interface to create a metric easily.
+
+* This makes it so, that LanguageMetricsProvider
does not need type parameters.
+ It can just return a `SetSignature
s, their implementations, and the interface `SignedNode` have been
+ removed. Node streams allow replacing their usages very easily.
+
+### Testing framework
+
+* PMD 7 has been upgraded to use JUnit 5 only. That means, that JUnit4 related classes have been removed, namely
+ * `net.sourceforge.pmd.testframework.PMDTestRunner`
+ * `net.sourceforge.pmd.testframework.RuleTestRunner`
+ * `net.sourceforge.pmd.testframework.TestDescriptor`
+* Rule tests, that use SimpleAggregatorTst
or
+ PmdRuleTst
work as before without change, but use
+ now JUnit5 under the hood. If you added additional JUnit4 tests to your rule test classes, then you'll
+ need to upgrade them to use JUnit5.
+
+### Language Lifecycle and Language Properties
+
+* Language modules now provide a proper lifecycle and can store global information. This enables the implementation
+ of multifile analysis.
+* Language modules can define [custom language properties](pmd_languages_configuration.html)
+ which can be set via environment variables. This allows to add and use language specific configuration options
+ without the need to change pmd-core.
+
+The documentation page has been updated:
+[Adding a new language with JavaCC](pmd_devdocs_major_adding_new_language_javacc.html)
+and [Adding a new language with ANTLR](pmd_devdocs_major_adding_new_language_antlr.html)
+
+Related issue: [[core] Language lifecycle (#3782)](https://github.com/pmd/pmd/issues/3782)
+
+### Rule properties
+
+* The old deprecated classes like `IntProperty` and `StringProperty` 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` and `max` attributes in property definitions in the XML are now optional and can appear separately
+ or be omitted.
+
+### New Programmatic API for CPD
+
+This release introduces a new programmatic API to replace the old class CPD
. The new API uses a similar model to
+PmdAnalysis
and is called CpdAnalysis
. Programmatic execution of CPD should now be
+done with a CPDConfiguration
and a CpdAnalysis
, for instance:
+
+```java
+CPDConfiguration config = new CPDConfiguration();
+config.setMinimumTileSize(100);
+config.setOnlyRecognizeLanguage(config.getLanguageRegistry().getLanguageById("java"));
+config.setSourceEncoding(StandardCharsets.UTF_8);
+config.addInputPath(Path.of("src/main/java")
+
+config.setIgnoreAnnotations(true);
+config.setIgnoreLiterals(false);
+
+config.setRendererName("text");
+
+try (CpdAnalysis cpd = CpdAnalysis.create(config)) {
+ // note: don't use `config` once a CpdAnalysis has been created.
+ // optional: add more files
+ cpd.files().addFile(Paths.get("src", "main", "more-java", "ExtraSource.java"));
+
+ cpd.performAnalysis();
+}
+```
+
+CPD can of course still be called via command line or using the module `pmd-cli`. But for tight integration
+this new programmatic API is recommended.
+
+See [PR #4397](https://github.com/pmd/pmd/pull/4397) for details.
+
+### API changes
+
+#### 7.0.0
+
+These are the changes between 7.0.0-rc4 and final 7.0.0.
+
+**pmd-java**
+
+* Support for Java 20 preview language features have been removed. The version "20-preview" is no longer available.
+* ASTPattern
, ASTRecordPattern
,
+ ASTTypePattern
, ASTUnnamedPattern
+ - method `getParenthesisDepth()` has been removed.
+* ASTTemplateFragment
: To get the content of the template, use now
+ getContent
or `@Content` instead of `getImage()`/`@Image`.
+* ASTUnnamedPattern
is not experimental anymore. The language feature
+ has been standardized with Java 22.
+
+**New API**
+
+The API around TreeRenderer
has been declared as stable. It was previously
+experimental. It can be used via the CLI subcommand `ast-dump` or programmatically, as described
+on [Creating XML dump of the AST](pmd_userdocs_extending_ast_dump.html).
+
+**General AST Changes to avoid `@Image`**
+
+See [General AST Changes to avoid @Image](pmd_userdocs_migrating_to_pmd7.html#general-ast-changes-to-avoid-image)
+in the migration guide for details.
+
+**XPath Rules**
+
+* The property `version` was already deprecated and has finally been removed. Please don't define the version
+ property anymore in your custom XPath rules. By default, the latest XPath version will be used, which
+ is XPath 3.1.
+
+**Moved classes/consolidated packages**
+
+* pmd-core
+ * Many types have been moved from the base package `net.sourceforge.pmd` into subpackage net.sourceforge.pmd.lang.rule
+ * Rule
+ * RulePriority
+ * RuleSet
+ * `RuleSetFactory`
+ * RuleSetLoader
+ * RuleSetLoadException
+ * RuleSetWriter
+ * Many types have been moved from the base package `net.sourceforge.pmd` into subpackage net.sourceforge.pmd.reporting
+ * Report
+ * RuleContext
+ * RuleViolation
+ * ViolationSuppressor
+ * XPathRule
has been moved into subpackage net.sourceforge.pmd.lang.rule.xpath
.
+* pmd-html
+ * `net.sourceforge.pmd.lang.html.ast.HtmlCpdLexer` moved into package `cpd`: HtmlCpdLexer
.
+* pmd-lang-test: All types have been moved under the new base package net.sourceforge.pmd.lang.test
:
+ * AbstractMetricTestRule
(moved from `net.sourceforge.pmd.test.AbstractMetricTestRule`)
+ * BaseTextComparisonTest
(moved from `net.sourceforge.pmd.test.BaseTextComparisonTest`)
+ * CpdTextComparisonTest
(moved from `net.sourceforge.pmd.cpd.test.CpdTextComparisonTest`)
+ * BaseTreeDumpTest
(moved from `net.sourceforge.pmd.lang.ast.test.BaseTreeDumpTest`)
+ * And many other types have been moved from `net.sourceforge.pmd.lang.ast.test` to `net.sourceforge.pmd.lang.test`.
+* pmd-scala
+ * ScalaCpdLexer
(moved from `net.sourceforge.pmd.lang.scala.cpd.ScalaCpdLexer`)
+ * ScalaTokenAdapter
(moved from `net.sourceforge.pmd.lang.scala.cpd.ScalaTokenAdapter`)
+* pmd-test
+ * AbstractRuleSetFactoryTest
(moved from `net.sourceforge.pmd.lang.rule.AbstractRuleSetFactoryTest`)
+ * AbstractAntTestHelper
(moved from `net.sourceforge.pmd.ant.AbstractAntTestHelper`)
+ * AbstractLanguageVersionTest
(moved from `net.sourceforge.pmd.AbstractLanguageVersionTest`)
+ * PmdRuleTst
(moved from `net.sourceforge.pmd.testframework.PmdRuleTst`)
+ * RuleTst
(moved from `net.sourceforge.pmd.testframework.RuleTst`)
+ * SimpleAggregatorTst
(moved from `net.sourceforge.pmd.testframework.SimpleAggregatorTst`)
+* pmd-xml
+ * PomLanguageModule
(moved from `net.sourceforge.pmd.lang.pom.PomLanguageModule`)
+ * WsdlLanguageModule
(moved from `net.sourceforge.pmd.lang.wsdl.WsdlLanguageModule`)
+ * XslLanguageModule
(moved from `net.sourceforge.pmd.lang.xsl.XslLanguageModule`)
+* pmd-visualforce
+ * The package `net.sourceforge.pmd.lang.vf` has been renamed to net.sourceforge.pmd.lang.visualforce
.
+ * The language id of visualforce has been changed to `visualforce` (it was previously just "vf")
+ * The ruleset changed: `category/vf/security.xml` ➡️ `category/visualforce/security.xml`
+* pmd-velocity (renamed from pmd-vm)
+ * The package `net.sourceforge.pmd.lang.vm` has been renamed to net.sourceforge.pmd.lang.velocity
.
+ * The language id of the Velocity module has been changed to `velocity` (it was previously just "vm")
+ * The rulesets changed: `category/vm/...` ➡️ `category/velocity/...`
+ * Many classes used the prefix `Vm`, e.g. `VmLanguageModule`. This has been changed to be `Vtl`:
+ * VtlLanguageModule
+ * VtlNode
+ * VtlParser
+ * VtlCpdLexer
+ * AbstractVtlRule
+
+**Internalized classes and interfaces and methods**
+
+The following classes/methods have been marked as @InternalApi before and are now moved into a `internal`
+package or made (package) private and are _not accessible_ anymore.
+
+* pmd-core
+ * `net.sourceforge.pmd.cache.AbstractAnalysisCache` (moved to internal, now package private)
+ * `net.sourceforge.pmd.cache.AnalysisCache` (moved to internal)
+ * `net.sourceforge.pmd.cache.AnalysisCacheListener` (moved to internal)
+ * `net.sourceforge.pmd.cache.AnalysisResult` (moved to internal)
+ * `net.sourceforge.pmd.cache.CachedRuleMapper` (moved to internal, now package private)
+ * `net.sourceforge.pmd.cache.CachedRuleViolation` (moved to internal, now package private)
+ * `net.sourceforge.pmd.cache.ChecksumAware` (moved to internal)
+ * `net.sourceforge.pmd.cache.FileAnalysisCache` (moved to internal)
+ * `net.sourceforge.pmd.cache.NoopAnalysisCache` (moved to internal)
+ * `net.sourceforge.pmd.util.ResourceLoader` (moved to internal)
+ * net.sourceforge.pmd.cpd.Tokens
+ * Constructor is now package private.
+ * net.sourceforge.pmd.lang.LanguageProcessor.AnalysisTask
+ * Constructor is now package private.
+ * Method `withFiles(java.util.List)` is now package private. Note: it was not previously marked with @InternalApi.
+ * net.sourceforge.pmd.lang.rule.RuleTargetSelector
+ * Method `isRuleChain()` has been removed.
+ * net.sourceforge.pmd.renderers.AbstractAccumulatingRenderer
+ * renderFileReport
- this method is now final
+ and can't be overridden anymore.
+ * net.sourceforge.pmd.reporting.Report
+ * Constructor as well as the methods `addRuleViolation`, `addConfigError`, `addError` are now private.
+ * net.sourceforge.pmd.reporting.RuleContext
+ * Method `getRule()` is now package private.
+ * Method `create(FileAnalysisListener listener, Rule rule)` has been removed.
+ * `net.sourceforge.pmd.rules.RuleFactory`: moved into subpackage `lang.rule` and made package private.
+ It has now been hidden completely from public API.
+ * Many types have been moved from into subpackage `lang.rule.internal`.
+ * `net.sourceforge.pmd.RuleSetReference`
+ * `net.sourceforge.pmd.RuleSetReferenceId`
+ * `net.sourceforge.pmd.RuleSets`
+ * `net.sourceforge.pmd.lang.rule.ParametricRuleViolation` is now package private and moved to `net.sourceforge.pmd.reporting.ParametricRuleViolation`.
+ The only public API is RuleViolation
.
+ * net.sourceforge.pmd.lang.rule.RuleSet
+ * Method `applies(Rule,LanguageVersion)` is now package private.
+ * Method `applies(TextFile)` has been removed.
+ * Method `applies(FileId)` is now package private.
+ * net.sourceforge.pmd.lang.rule.RuleSetLoader
+ * Method `loadRuleSetsWithoutException(java.util.List)` is now package private.
+ * net.sourceforge.pmd.lang.rule.RuleSetLoadException
+ * All constructors are package private now.
+ * net.sourceforge.pmd.lang.ast.LexException
- the constructor `LexException(boolean, String, int, int, String, char)` is now package private.
+ It is only used by JavaCC-generated token managers.
+ * net.sourceforge.pmd.PMDConfiguration
+ * Method `setAnalysisCache(AnalysisCache)` is now package private. Use setAnalysisCacheLocation
instead.
+ * Method `getAnalysisCache()` is now package private.
+ * net.sourceforge.pmd.lang.document.FileCollector
+ * Method `newCollector(LanguageVersionDiscoverer, PmdReporter)` is now package private.
+ * Method `newCollector(PmdReporter)` is now package private.
+ * In order to create a FileCollector, use files
instead.
+ * net.sourceforge.pmd.lang.rule.xpath.Attribute
+ * Method `replacementIfDeprecated()` is now package private.
+ * `net.sourceforge.pmd.properties.PropertyTypeId` - moved in subpackage `internal`.
+ * net.sourceforge.pmd.properties.PropertyDescriptor
- method `getTypeId()` is now package private.
+* pmd-doc
+ * The whole maven module `pmd-doc` is now considered internal API even though it was not declared so before.
+ It's used to generate the rule documentation for the built-in rules.
+ * All the classes have been moved into package `net.sourceforge.pmd.doc.internal`.
+* pmd-ant
+ * net.sourceforge.pmd.ant.Formatter
+ * Method `getRenderer()` has been removed.
+ * Method `start(String)` is private now.
+ * Method `end(Report)` has been removed.
+ * Method `isNoOutputSupplied()` is now package private.
+ * Method `newListener(Project)` is now package private.
+ * net.sourceforge.pmd.ant.PMDTask
+ * Method `getRelativizeRoots()` has been removed.
+ * `net.sourceforge.pmd.ant.ReportException` is now package private. Note: It was not marked with @InternalApi before.
+* pmd-apex
+ * net.sourceforge.pmd.lang.apex.ast.ApexNode
+ * Method `getNode()` has been removed. It was only deprecated before and not marked with @InternalApi.
+ However, it gave access to the wrapped Jorje node and was thus internal API.
+ * `net.sourceforge.pmd.lang.apex.ast.AbstractApexNode`
+ * Method `getNode()` is now package private.
+ * net.sourceforge.pmd.lang.apex.multifile.ApexMultifileAnalysis
+ * Constructor is now package private.
+ * `net.sourceforge.pmd.lang.apex.rule.design.AbstractNcssCountRule` (now package private)
+ * `net.sourceforge.pmd.lang.apex.rule.AbstractApexUnitTestRule` (moved to package `net.sourceforge.pmd.apex.rule.bestpractices`, now package private)
+* pmd-java
+ * `net.sourceforge.pmd.lang.java.rule.AbstractIgnoredAnnotationRule` (moved to internal)
+ * `net.sourceforge.pmd.lang.java.types.ast.LazyTypeResolver` (moved to internal)
+ * net.sourceforge.pmd.lang.java.types.JMethodSig
+ * Method `internalApi()` has been removed.
+ * net.sourceforge.pmd.lang.java.types.TypeOps
+ * Method `isSameTypeInInference(JTypeMirror,JTypeMirror)` is now package private.
+* pmd-jsp
+ * net.sourceforge.pmd.lang.jsp.ast.JspParser
+ * Method `getTokenBehavior()` has been removed.
+* pmd-modelica
+ * net.sourceforge.pmd.lang.modelica.ast.InternalApiBridge
renamed from `InternalModelicaNodeApi`.
+ * net.sourceforge.pmd.lang.modelica.resolver.InternalApiBridge
renamed from `InternalModelicaResolverApi`.
+ * `net.sourceforge.pmd.lang.modelica.resolver.ModelicaSymbolFacade` has been removed.
+ * `net.sourceforge.pmd.lang.modelica.resolver.ResolutionContext` (moved to internal)
+ * `net.sourceforge.pmd.lang.modelica.resolver.ResolutionState` (moved to internal). Note: it was not previously marked with @InternalApi.
+ * `net.sourceforge.pmd.lang.modelica.resolver.Watchdog` (moved to internal). Note: it was not previously marked with @InternalApi.
+* pmd-plsql
+ * `net.sourceforge.pmd.lang.plsql.rule.design.AbstractNcssCountRule` is now package private.
+* pmd-scala
+ * net.sourceforge.pmd.lang.scala.ScalaLanguageModule
+ * Method `dialectOf(LanguageVersion)` has been removed.
+
+**Removed classes and members (previously deprecated)**
+
+The annotation `@DeprecatedUntil700` has been removed.
+
+* pmd-core
+ * CpdLanguageProperties
. The field `DEFAULT_SKIP_BLOCKS_PATTERN` has been removed.
+ * BaseAntlrNode
- method `joinTokenText()` has been removed.
+ * Node
- many methods have been removed:
+ * `getNthParent(int)` - Use ancestors
instead, e.g. `node.ancestors().get(n-1)`
+ * `getFirstParentOfType(Class)` - Use ancestors
instead, e.g. `node.ancestors(parentType).first()`
+ * `getParentsOfType(Class)` - Use ancestors
instead, e.g. `node.ancestors(parentType).toList()`
+ * `findChildrenOfType(Class)` - Use children
instead, e.g. `node.children(childType).toList()`
+ * `findDescendantsOfType(Class)` - Use descendants
instead, e.g. `node.descendants(targetType).toList()`
+ * `findDescendantsOfType(Class,boolean)` - Use descendants
instead, e.g. `node.descendants(targetType).crossFindBoundaries(b).toList()`
+ * `getFirstChildOfType(Class)` - Use firstChild
instead
+ * `getFirstDescendantOfType(Class)` - Use descendants
instead, e.g. `node.descendants(targetType).first()`
+ * `hasDescendantOfType(Class)` - Use descendants
instead, e.g. `node.descendants(targetType).nonEmpty()`
+ * `findChildNodesWithXPath(String)` - Use the NodeStream
API instead.
+ * GenericNode
- method `getNthParent(int)` has been removed. Use ancestors
instead, e.g. `node.ancestors().get(n-1)`
+ * FileCollector
- method `addZipFile(java.nio.file.Path)` has been removed. Use addZipFileWithContent
instead
+ * TextDocument
- method `readOnlyString(CharSequence,String,LanguageVersion)` has been removed.
+ Use readOnlyString
instead.
+ * TextFile
- method `dataSourceCompat(DataSource,PMDConfiguration)` has been removed.
+ Use TextFile
directly, e.g. forPath
+ * XPathVersion
+ * `XPATH_1_0`
+ * `XPATH_1_0_COMPATIBILITY`
+ * `XPATH_2_0`
+ * Only XPath version 3.1 is now supported. This version of the XPath language is mostly identical to
+ XPath 2.0. XPath rules by default use now XPATH_3_1
.
+ * `net.sourceforge.pmd.lang.rule.AbstractDelegateRule` removed. It has been merged with RuleReference
.
+ * AbstractRule
- the following methods have been removed:
+ * `deepCopyValuesTo(AbstractRule)` - use deepCopy
instead.
+ * `addRuleChainVisit(Class)` - override buildTargetSelector
in order to register nodes for rule chain visits.
+ * `addViolation(...)` - use addViolation
instead, e.g. via `asCtx(data).addViolation(...)`.
+ Note: These methods were only marked as deprecated in javadoc.
+ * `addViolationWithMessage(...)` - use addViolationWithMessage
instead, e.g. via
+ `asCtx(data).addViolationWithMessage(...)`. Note: These methods were only marked as deprecated in javadoc.
+ * RuleReference
- the following methods have been removed:
+ * `setRuleSetReference(RuleSetReference)` - without replacement. Just construct new RuleReference
instead.
+ * `hasOverriddenProperty(PropertyDescriptor)` - use isPropertyOverridden
instead.
+ * XPathRule
+ * The constant `XPATH_DESCRIPTOR` has been made private and is not accessible anymore.
+ * The default constructor has been made package-private and is not accessible anymore.
+ * Language
- method `getTerseName()` removed. Use getId
instead.
+ * LanguageModuleBase
- method `getTerseName()` removed. Use getId
instead.
+ * LanguageRegistry
- the following methods have been removed:
+ * `getLanguage(String)` - use getLanguageByFullName
+ via PMD
or CPD
instead.
+ * `findLanguageByTerseName(String)` - use getLanguageById
+ via PMD
or CPD
instead.
+ * `findByExtension(String)` - removed without replacement.
+ * LanguageVersionDiscoverer
- method `getLanguagesForFile(java.io.File)` removed.
+ Use getLanguagesForFile
instead.
+ * AbstractPropertySource
+ * field `propertyDescriptors` has been made private and is not accessible anymore.
+ Use getPropertyDescriptors
instead.
+ * field `propertyValuesByDescriptor` has been made private and is not accessible anymore.
+ Use getPropertiesByPropertyDescriptor
+ or getOverriddenPropertiesByPropertyDescriptor
instead.
+ * method `copyPropertyDescriptors()` has been removed. Use getPropertyDescriptors
instead.
+ * method `copyPropertyValues()` has been removed. Use getPropertiesByPropertyDescriptor
+ or getOverriddenPropertiesByPropertyDescriptor
instead.
+ * Reportable
- the following methods have been removed. Use getReportLocation
instead
+ * `getBeginLine()`
+ * `getBeginColumn()`
+ * `getEndLine()`
+ * `getEndColumn()`
+ * `net.sourceforge.pmd.util.datasource.DataSource` - use TextFile
instead.
+ * `net.sourceforge.pmd.util.datasource.FileDataSource`
+ * `net.sourceforge.pmd.util.datasource.ReaderDataSource`
+ * `net.sourceforge.pmd.util.datasource.ZipDataSource`
+ * CollectionUtil
+ * method `invertedMapFrom(...)` has been removed.
+ * method `mapFrom(...)` has been removed.
+ * AbstractConfiguration
- the following methods have been removed:
+ * `setIgnoreFilePath(String)` - use setIgnoreFilePath
instead.
+ * `setInputFilePath(String)` - use setInputFilePath
instead.
+ * `setInputPaths(String)` - use setInputPathList
or
+ addInputPath
instead.
+ * `setInputUri(String)` - use setInputUri
instead.
+ * PMDConfiguration
- the following methods have been removed
+ * `prependClasspath(String)` - use prependAuxClasspath
instead.
+ * `getRuleSets()` - use getRuleSetPaths
instead.
+ * `setRuleSets(String)` - use setRuleSets
or
+ addRuleSet
instead.
+ * `setReportFile(String)` - use setReportFile
instead.
+ * `getReportFile()` - use getReportFilePath
instead.
+ * Report
- method `merge(Report)` has been removed. Use union
instead.
+ * RuleSetLoader
- method `toFactory()` has been made package private and is not accessible anymore.
+ * RuleViolation
- the following methods have been removed:
+ * `getPackageName()` - use getAdditionalInfo
with PACKAGE_NAME
instead, e.g. `getAdditionalInfo().get(PACKAGE_NAME)`.
+ * `getClassName()` - use getAdditionalInfo
with CLASS_NAME
instead, e.g. `getAdditionalInfo().get(CLASS_NAME)`.
+ * `getMethodName()` - use getAdditionalInfo
with METHOD_NAME
instead, e.g. `getAdditionalInfo().get(METHOD_NAME)`.
+ * `getVariableName()` - use getAdditionalInfo
with VARIABLE_NAME
instead, e.g. `getAdditionalInfo().get(VARIABLE_NAME)`.
+* pmd-apex
+ * ApexNode
and ASTApexFile
+ * `#getApexVersion()`: In PMD 6, this method has been deprecated but was defined in the class `ApexRootNode`.
+ The version returned is always "Version.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.
+
+ If the current version is needed, then `Node.getTextDocument().getLanguageVersion()` can be used. This
+ is the version that has been selected via CLI `--use-version` parameter.
+ * ApexNode
+ * method `jjtAccept()` has been removed.
+ Use acceptVisitor
instead.
+ * method `getNode()` has been removed. The underlying node is only available in AST nodes, but not in rule implementations.
+ * AbstractApexNode
- method `getNode()` is now package private.
+ AST nodes still have access to the underlying Jorje node via the protected property `node`.
+ * `net.sourceforge.pmd.lang.apex.ast.ApexParserVisitor`
+ Use ApexVisitor
or ApexVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.apex.ast.ApexParserVisitorAdapter`
+ * ASTAssignmentExpression
- method `getOperator()` removed.
+ Use getOp
instead.
+ * ASTBinaryExpression
- method `getOperator()` removed.
+ Use getOp
instead.
+ * ASTBooleanExpression
- method `getOperator()` removed.
+ Use getOp
instead.
+ * ASTPostfixExpression
- method `getOperator()` removed.
+ Use getOp
instead.
+ * ASTPrefixExpression
- method `getOperator()` removed.
+ Use getOp
instead.
+ * `net.sourceforge.pmd.lang.apex.rule.security.Helper` removed. This was actually internal API.
+* pmd-java
+ * AbstractPackageNameModuleDirective
- method `getImage()` has been removed.
+ Use getPackageName
instead.
+ * `AbstractTypeDeclaration` - method `getImage()` has been removed.
+ Use `getSimpleName()` instead.
+ * ASTAnnotation
- method `getAnnotationName()` has been removed.
+ * ASTClassType
+ * constructor `ASTClassType(java.lang.String)` has been removed.
+ * method `getImage()` has been removed.
+ * method `isReferenceToClassSameCompilationUnit()` has been removed.
+ * ASTFieldDeclaration
- method `getVariableName()` has been removed.
+ * ASTLiteral
- the following methods have been removed:
+ * `isStringLiteral()` - use `node instanceof ASTStringLiteral` instead.
+ * `isCharLiteral()` - use `node instanceof ASTCharLiteral` instead.
+ * `isNullLiteral()` - use `node instanceof ASTNullLiteral` instead.
+ * `isBooleanLiteral()` - use `node instanceof ASTBooleanLiteral` instead.
+ * `isNumericLiteral()` - use `node instanceof ASTNumericLiteral` instead.
+ * `isIntLiteral()` - use isIntLiteral
instead.
+ * `isLongLiteral()` - use isLongLiteral
instead.
+ * `isFloatLiteral()` - use isFloatLiteral
instead.
+ * `isDoubleLiteral()` - use isDoubleLiteral
instead.
+ * ASTMethodDeclaration
- methods `getImage()` and `getMethodName()` have been removed.
+ Use getName
instead.
+ * ASTMethodReference
- method `getImage()` has been removed.
+ * ASTModuleName
- method `getImage()` has been removed.
+ * ASTPrimitiveType
- method `getImage()` has been removed.
+ * ASTType
+ * `getTypeImage()` has been removed.
+ * `getArrayDepth()` has been removed. It's only available for arrays: getArrayDepth
.
+ * `isPrimitiveType()` - use `node instanceof ASTPrimitiveType` instead.
+ * `isArrayType()` - use `node instanceof ASTArrayType` instead.
+ * `isClassOrInterfaceType()` - use `node instanceof ASTClassType` instead.
+ * ASTTypeDeclaration
- method `getImage()` has been removed.
+ * ASTUnaryExpression
- method `isPrefix()` has been removed.
+ Use getOperator
`.isPrefix()` instead.
+ * ASTVariableId
- methods `getImage()` and `getVariableName()` have been removed.
+ Use getName
instead.
+ * JavaComment
- method `getImage()` has been removed.
+ Use getText
instead.
+ * JavaNode
- method `jjtAccept()` has been removed.
+ Use acceptVisitor
instead.
+ * `net.sourceforge.pmd.lang.java.ast.JavaParserVisitor`
+ Use JavaVisitor
or JavaVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.java.ast.JavaParserVisitorAdapter`
+ * ModifierOwner
+ * `isFinal()` - This is still available in various subtypes, where it makes sense, e.g. isFinal
.
+ * `isAbstract()` - This is still available in subtypes, e.g. isAbstract
.
+ * `isStrictfp()` - Use hasModifiers
instead, e.g. `hasModifiers(STRICTFP)`.
+ * `isSynchronized()` - Use hasModifiers
instead, e.g. `hasModifiers(SYNCHRONIZED)`.
+ * `isNative()` - Use hasModifiers
instead, e.g. `hasModifiers(NATIVE)`.
+ * `isStatic()` - This is still available in subtypes, e.g. isStatic
.
+ * `isVolatile()` - Use hasModifiers
instead, e.g. `hasModifiers(VOLATILE)`.
+ * `isTransient()` - Use hasModifiers
instead, e.g. `hasModifiers(TRANSIENT)`.
+ * `isPrivate()` - Use getVisibility
instead, e.g. `getVisibility() == Visibility.V_PRIVATE`.
+ * `isPublic()` - Use getVisibility
instead, e.g. `getVisibility() == Visibility.V_PUBLIC`.
+ * `isProtected()` - Use getVisibility
instead, e.g. `getVisibility() == Visibility.V_PROTECTED`.
+ * `isPackagePrivate()` - Use getVisibility
instead, e.g. `getVisibility() == Visibility.V_PACKAGE`.
+ * `isSyntacticallyAbstract()` - Use hasExplicitModifiers
instead, e.g. `hasExplicitModifiers(ABSTRACT)`.
+ * `isSyntacticallyPublic()` - Use hasExplicitModifiers
instead, e.g. `hasExplicitModifiers(PUBLIC)`.
+ * `isSyntacticallyStatic()` - Use hasExplicitModifiers
instead, e.g. `hasExplicitModifiers(STATIC)`.
+ * `isSyntacticallyFinal()` - Use hasExplicitModifiers
instead, e.g. `hasExplicitModifiers(FINAL)`.
+ * TypeNode
- method `getType()` has been removed. Use getTypeMirror
instead.
+* pmd-javascript
+ * AbstractEcmascriptNode
- method `getNode()` has been removed.
+ AST nodes still have access to the underlying Rhino node via the protected property `node`.
+ * ASTFunctionNode
- method `getBody(int)` removed.
+ Use getBody
instead.
+ * ASTTryStatement
+ * method `isCatch()` has been removed. Use hasCatch
instead.
+ * method `isFinally()` has been removed. Use hasFinally
instead.
+ * EcmascriptNode
+ * method `jjtAccept()` has been removed. Use acceptVisitor
instead.
+ * method `getNode()` has been removed. The underlying node is only available in AST nodes, but not in rule implementations.
+ * `net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptParserVisitor`
+ Use EcmascriptVisitor
or EcmascriptVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptParserVisitorAdapter`
+* pmd-jsp
+ * `net.sourceforge.pmd.lang.jsp.ast.JspParserVisitor`
+ Use JspVisitor
or JspVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.jsp.ast.JspParserVisitorAdapter`
+ * JspNode
- method `jjtAccept()` has been removed.
+ Use acceptVisitor
instead.
+* pmd-modelica
+ * `net.sourceforge.pmd.lang.modelica.ast.ModelicaParserVisitor`
+ Use ModelicaVisitor
or ModelicaVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.modelica.ast.ModelicaParserVisitorAdapter`
+ * ModelicaNode
- method `jjtAccept()` has been removed.
+ Use acceptVisitor
instead.
+ * `net.sourceforge.pmd.lang.modelica.rule.AmbiguousResolutionRule`
+ Use AmbiguousResolutionRule
instead.
+ * `net.sourceforge.pmd.lang.modelica.rule.ConnectUsingNonConnector`
+ Use ConnectUsingNonConnectorRule
+* pmd-plsql
+ * `net.sourceforge.pmd.lang.plsql.ast.PLSQLParserVisitor`
+ Use PlsqlVisitor
or PlsqlVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.plsql.ast.PLSQLParserVisitorAdapter`
+ * PLSQLNode
- method `jjtAccept()` has been removed.
+ Use acceptVisitor
instead.
+* pmd-scala
+ * The maven module `pmd-scala` has been removed. Use `pmd-scala_2.13` or `pmd-scala_2.12` instead.
+ * ScalaNode
+ * Method `accept()` has been removed. Use acceptVisitor
instead.
+ * Method `getNode()` has been removed. The underlying node is only available in AST nodes, but not in rule implementations.
+ * `AbstractScalaNode` - method `getNode()` has been removed. AST nodes still have access
+ to the underlying Scala node via the protected property `node`.
+* pmd-visualforce
+ * VfNode
- method `jjtAccept()` has been removed.
+ Use acceptVisitor
instead.
+ * `net.sourceforge.pmd.lang.vf.ast.VfParserVisitor`
+ Use VfVisitor
or VfVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.vf.ast.VfParserVisitorAdapter`
+ * DataType
- method `fromBasicType(BasicType)` has been removed.
+ Use fromTypeName
instead.
+* pmd-velocity (previously pmd-vm)
+ * VtlNode
- method `jjtAccept()` has been removed.
+ Use acceptVisitor
instead.
+ * `net.sourceforge.pmd.lang.vm.ast.VmParserVisitor`
+ Use VtlVisitor
or VtlVisitorBase
instead.
+ * `net.sourceforge.pmd.lang.vm.ast.VmParserVisitorAdapter`
+
+**Removed classes, interfaces and methods (not previously deprecated)**
+
+* pmd-apex
+ * The method `isSynthetic()` in ASTMethod
has been removed.
+ With the switch from Jorje to Summit AST as underlying parser, no synthetic methods are generated by the
+ parser anymore. This also means, that there is no XPath attribute `@Synthetic` anymore.
+ * The constant `STATIC_INITIALIZER_METHOD_NAME` in FieldDeclarationsShouldBeAtStartRule
+ has been removed. It was used to filter out synthetic methods, but these are not generated anymore with the
+ new parser.
+ * The method `getContext()` in ASTReferenceExpression
has been removed.
+ It was not used and always returned `null`.
+ * The method `getNamespace()` in all AST nodes (defined in ApexNode
) has
+ been removed, as it was never fully implemented. It always returned an empty string.
+ * The method `getNameSpace()` in ApexQualifiedName
has been removed.
+ * The class `net.sourceforge.pmd.lang.apex.ast.ASTBridgeMethodCreator` has been removed. This was a node that has
+ been generated by the old Jorje parser only.
+* pmd-apex-jorje
+ * With the switch from Jorje to Summit AST, this maven module is no longer needed and has been removed.
+* pmd-core
+ * `net.sourceforge.pmd.util.Predicate` has been removed. It was marked as Experimental before. Use
+ `java.util.function.Predicate` instead.
+* pmd-java
+ * The interface `FinalizableNode` (introduced in 7.0.0-rc1) has been removed.
+ Its method `isFinal()` has been moved down to the
+ nodes where needed, e.g. ASTLocalVariableDeclaration#isFinal
.
+ * The method `isPackagePrivate()` in ASTClassDeclaration
(formerly ASTClassOrInterfaceDeclaration)
+ has been removed.
+ Use hasVisibility
instead,
+ which can correctly differentiate between local and package private classes.
+
+**Renamed classes, interfaces, methods**
+
+* pmd-core
+ * MessageReporter
has been renamed to PmdReporter
+ * TokenMgrError
has been renamed to LexException
+ * Tokenizer
has been renamed to CpdLexer
. Along with this rename,
+ all the implementations have been renamed as well (`Tokenizer` -> `CpdLexer`), e.g. "CppCpdLexer", "JavaCpdLexer".
+ This affects all language modules.
+ * AnyTokenizer
has been renamed to AnyCpdLexer
.
+
+* pmd-java
+ * The interface `AccessNode` has been renamed to ModifierOwner
. This is only relevant
+ for Java rules, which use that type directly e.g. through downcasting.
+ Or when using the XPath function `pmd-java:nodeIs()`.
+ * The node `ASTClassOrInterfaceType` has been renamed to ASTClassType
. XPath rules
+ need to be adjusted.
+ * The node `ASTClassOrInterfaceDeclaration` has been renamed to ASTClassDeclaration
.
+ XPath rules need to be adjusted.
+ * The interface `ASTAnyTypeDeclaration` has been renamed to ASTTypeDeclaration
.
+ This is only relevant for Java rules, which use that type directly, e.g. through downcasting.
+ Or when using the XPath function `pmd-java:nodeIs()`.
+ * The interface `ASTMethodOrConstructorDeclaration` has been renamed to
+ ASTExecutableDeclaration
. This is only relevant for Java rules, which use that type
+ directly, e.g. through downcasting. Or when using the XPath function `pmd-java:nodeIs()`.
+ * The node `ASTVariableDeclaratorId` has been renamed to ASTVariableId
. XPath rules
+ need to be adjusted.
+ * The node `ASTClassOrInterfaceBody` has been renamed to ASTClassBody
. XPath rules
+ need to be adjusted.
+* pmd-scala
+ * The interface `ScalaParserVisitor` has been renamed to ScalaVisitor
in order
+ to align the naming scheme for the different language modules.
+ * The class `ScalaParserVisitorAdapter` has been renamed to ScalaVisitorBase
in order
+ to align the naming scheme for the different language modules.
+
+**New API**
+
+These were annotated with `@Experimental`, but can now be considered stable.
+
+* pmd-apex
+ * ASTCommentContainer
+ * ApexMultifileAnalysis
+* pmd-core
+ * CPDReport#filterMatches
+ * AntlrToken#getKind
+ * AbstractJjtreeNode
+ * TokenDocument
+ * AstInfo#getSuppressionComments
+ * AstInfo#withSuppressMap
+ * GenericToken#getKind
+ * FileCollector#addZipFileWithContent
+ * net.sourceforge.pmd.lang.document
+ * LanguageVersionHandler#getLanguageMetricsProvider
+ * LanguageVersionHandler#getDesignerBindings
+ * PlainTextLanguage
+ * PropertyConstraint#getXmlConstraint
+ * PropertyConstraint#toOptionalConstraint
+ * PropertyConstraint#fromPredicate
+ * PropertyConstraint#fromPredicate
+ * AbstractRenderer#setReportFile
+ * Renderer#setReportFile
+ * DesignerBindings
+ * DesignerBindings.TreeIconId
+ * RelatedNodesSelector
+ * Report#filterViolations
+ * Report#union
+* pmd-groovy
+ * GroovyToken#getKind
+* pmd-html
+ * net.sourceforge.pmd.lang.html
+* pmd-java
+ * ASTExpression#getConversionContext
+ * AbstractJavaRulechainRule#<init>
+ * JSymbolTable
+ * JElementSymbol
+ * net.sourceforge.pmd.lang.java.symbols
+ * ExprContext
+ * JIntersectionType#getInducedClassType
+ * JTypeMirror#streamMethods
+ * JTypeMirror#streamDeclaredMethods
+ * JTypeMirror#getConstructors
+* pmd-kotlin
+ * KotlinLanguageModule
+* pmd-test-schema
+ * TestSchemaParser
+
+**Removed functionality**
+
+* The CLI parameter `--no-ruleset-compatibility` has been removed. It was only used to allow loading
+ some rulesets originally written for PMD 5 also in PMD 6 without fixing the rulesets.
+* The class RuleSetFactoryCompatibility
has been removed without replacement.
+ The different ways to enable/disable this filter in PMDConfiguration
+ (Property "RuleSetFactoryCompatibilityEnabled") and
+ PMDTask
(Property "noRuleSetCompatibility") have been removed as well.
+* `textcolor` renderer (TextColorRenderer
) now renders always in color.
+ The property `color` has been removed. The possibility to override this with the system property `pmd.color`
+ has been removed as well. If you don't want colors, use `text` renderer (TextRenderer
).
+
+#### 7.0.0-rc4
+
+**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` and `StringProperty` 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` and `max` 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](pmd_release_notes_pmd7.html#new-programmatic-api-for-cpd)
+and [PR #4397](https://github.com/pmd/pmd/pull/4397) for details.
+
+**Removed classes and methods**
+
+The following previously deprecated classes have been removed:
+
+* pmd-core
+ * `net.sourceforge.pmd.cpd.AbstractTokenizer` ➡️ use AnyCpdLexer
instead (previously known as AnyTokenizer)
+ * `net.sourceforge.pmd.cpd.CPD` ➡️ use PmdCli
from `pmd-cli` module for CLI support or use
+ CpdAnalysis
for programmatic API
+ * `net.sourceforge.pmd.cpd.GridBagHelper` (now package private)
+ * `net.sourceforge.pmd.cpd.TokenEntry.State`
+ * `net.sourceforge.pmd.lang.document.CpdCompat`
+ * `net.sourceforge.pmd.properties.BooleanMultiProperty`
+ * `net.sourceforge.pmd.properties.BooleanProperty`
+ * `net.sourceforge.pmd.properties.CharacterMultiProperty`
+ * `net.sourceforge.pmd.properties.CharacterProperty`
+ * `net.sourceforge.pmd.properties.DoubleMultiProperty`
+ * `net.sourceforge.pmd.properties.DoubleProperty`
+ * `net.sourceforge.pmd.properties.EnumeratedMultiProperty`
+ * `net.sourceforge.pmd.properties.EnumeratedProperty`
+ * `net.sourceforge.pmd.properties.EnumeratedPropertyDescriptor`
+ * `net.sourceforge.pmd.properties.FileProperty` (note: without replacement)
+ * `net.sourceforge.pmd.properties.FloatMultiProperty`
+ * `net.sourceforge.pmd.properties.FloatProperty`
+ * `net.sourceforge.pmd.properties.IntegerMultiProperty`
+ * `net.sourceforge.pmd.properties.IntegerProperty`
+ * `net.sourceforge.pmd.properties.LongMultiProperty`
+ * `net.sourceforge.pmd.properties.LongProperty`
+ * `net.sourceforge.pmd.properties.MultiValuePropertyDescriptor`
+ * `net.sourceforge.pmd.properties.NumericPropertyDescriptor`
+ * `net.sourceforge.pmd.properties.PropertyDescriptorField`
+ * `net.sourceforge.pmd.properties.RegexProperty`
+ * `net.sourceforge.pmd.properties.SingleValuePropertyDescriptor`
+ * `net.sourceforge.pmd.properties.StringMultiProperty`
+ * `net.sourceforge.pmd.properties.StringProperty`
+ * `net.sourceforge.pmd.properties.ValueParser`
+ * `net.sourceforge.pmd.properties.ValueParserConstants`
+ * `net.sourceforge.pmd.properties.builders.MultiNumericPropertyBuilder`
+ * `net.sourceforge.pmd.properties.builders.MultiPackagedPropertyBuilder`
+ * `net.sourceforge.pmd.properties.builders.MultiValuePropertyBuilder`
+ * `net.sourceforge.pmd.properties.builders.PropertyDescriptorBuilder`
+ * `net.sourceforge.pmd.properties.builders.PropertyDescriptorBuilderConversionWrapper`
+ * `net.sourceforge.pmd.properties.builders.PropertyDescriptorExternalBuilder`
+ * `net.sourceforge.pmd.properties.builders.SingleNumericPropertyBuilder`
+ * `net.sourceforge.pmd.properties.builders.SinglePackagedPropertyBuilder`
+ * `net.sourceforge.pmd.properties.builders.SingleValuePropertyBuilder`
+ * `net.sourceforge.pmd.properties.modules.EnumeratedPropertyModule`
+ * `net.sourceforge.pmd.properties.modules.NumericPropertyModule`
+
+The following previously deprecated methods have been removed:
+
+* pmd-core
+ * `net.sourceforge.pmd.properties.PropertyBuilder.GenericCollectionPropertyBuilder#delim(char)`
+ * `net.sourceforge.pmd.properties.PropertySource#setProperty(...)`
+ * `net.sourceforge.pmd.properties.internal.PropertyTypeId#factoryFor(...)`
+ * `net.sourceforge.pmd.properties.internal.PropertyTypeId#typeIdFor(...)`
+ * `net.sourceforge.pmd.properties.PropertyDescriptor`: removed methods errorFor, type, isMultiValue,
+ uiOrder, compareTo, isDefinedExternally, valueFrom, asDelimitedString
+
+The following methods have been removed:
+
+* pmd-core
+ * CPDConfiguration
+ * `#sourceCodeFor(File)`, `#postConstruct()`, `#tokenizer()`, `#filenameFilter()` removed
+ * Mark
+ * `#getSourceSlice()`, `#setLineCount(int)`, `#getLineCount()`, `#setSourceCode(SourceCode)` removed
+ * `#getBeginColumn()`, `#getBeginLine()`, `#getEndLine()`, `#getEndColumn()` removed
+ ➡️ use getLocation
instead
+ * Match
+ * `#LABEL_COMPARATOR` removed
+ * `#setMarkSet(...)`, `#setLabel(...)`, `#getLabel()`, `#addTokenEntry(...)` removed
+ * `#getSourceCodeSlice()` removed
+ ➡️ use CPDReport#getSourceCodeSlice
instead
+ * TokenEntry
+ * `#getEOF()`, `#clearImages()`, `#getIdentifier()`, `#getIndex()`, `#setHashCode(int)` removed
+ * `#EOF` removed ➡️ use isEof
instead
+ * Parser.ParserTask
+ * `#getFileDisplayName()` removed ➡️ use getFileId
instead
+ (`getFileId().getAbsolutePath()`)
+
+The following classes have been removed:
+
+* pmd-core
+ * `net.sourceforge.pmd.cpd.AbstractLanguage`
+ * `net.sourceforge.pmd.cpd.AnyLanguage`
+ * `net.sourceforge.pmd.cpd.Language`
+ * `net.sourceforge.pmd.cpd.LanguageFactory`
+ * `net.sourceforge.pmd.cpd.MatchAlgorithm` (now package private)
+ * `net.sourceforge.pmd.cpd.MatchCollector` (now package private)
+ * `net.sourceforge.pmd.cpd.SourceCode` (and all inner classes like `FileCodeLoader`, ...)
+ * `net.sourceforge.pmd.cpd.token.TokenFilter`
+
+**Moved packages**
+
+* pmd-core
+ * NumericConstraints
(old package: `net.sourceforge.pmd.properties.constraints.NumericConstraints`)
+ * PropertyConstraint
(old package: `net.sourceforge.pmd.properties.constraints.PropertyConstraint`)
+ * not experimental anymore
+ * ReportException
(old package: `net.sourceforge.pmd.cpd`, moved to module `pmd-ant`)
+ * it is now a RuntimeException
+ * CPDReportRenderer
(old package: `net.sourceforge.pmd.cpd.renderer`)
+ * AntlrTokenFilter
(old package: `net.sourceforge.pmd.cpd.token`)
+ * BaseTokenFilter
(old package: `net.sourceforge.pmd.cpd.token.internal`)
+ * JavaCCTokenFilter
(old package: `net.sourceforge.pmd.cpd.token`)
+
+**Changed types and other changes**
+
+* pmd-core
+ * PropertyDescriptor
is now a class (was an interface)
+ and it is not comparable anymore.
+ * AbstractConfiguration#setSourceEncoding
+ * previously this method took a simple String for the encoding.
+ * PMDConfiguration
and CPDConfiguration
+ * many getters and setters have been moved to the parent class AbstractConfiguration
+ * CPDListener#addedFile
+ * no `File` parameter anymore
+ * CPDReport#getNumberOfTokensPerFile
returns a `Map` of `FileId,Integer` instead of `String`
+ * CPDReport#filterMatches
now takes a `java.util.function.Predicate`
+ as parameter
+ * CpdLexer
+ * Note: CpdLexer was previously named Tokenizer.
+ * constants are now PropertyDescriptor
instead of `String`,
+ to be used as language properties
+ * tokenize
+ changed parameters. Now takes a TextDocument
and a TokenFactory
+ (instead of `SourceCode` and `Tokens`).
+ * Language
+ * method `#createProcessor(LanguagePropertyBundle)` moved to PmdCapableLanguage
+ * StringUtil#linesWithTrimIndent
now takes a `Chars`
+ instead of a `String`.
+* All language modules (like pmd-apex, pmd-cpp, ...)
+ * consistent package naming: `net.sourceforge.pmd.lang.CpdCapableLanguage
+ * consistent static method `#getInstance()`
+ * removed constants like `ID`, `TERSE_NAME` or `NAME`. Use `getInstance().getName()` etc. instead
+
+**Internal APIs**
+
+* `net.sourceforge.pmd.properties.internal.PropertyTypeId`
+
+**Deprecated API**
+
+* Language#getTerseName
➡️ use getId
instead
+
+* The method ASTPattern#getParenthesisDepth
has been deprecated and will be removed.
+ It was introduced for supporting parenthesized patterns, but that was removed with Java 21. It is only used when
+ parsing code as java-19-preview.
+
+**Experimental APIs**
+
+* To support the Java preview language features "String Templates" and "Unnamed Patterns and Variables", the following
+ AST nodes have been introduced as experimental:
+ * ASTTemplateExpression
+ * ASTTemplate
+ * ASTTemplateFragment
+ * ASTUnnamedPattern
+* The AST nodes for supporting "Record Patterns" and "Pattern Matching for switch" are not experimental anymore:
+ * ASTRecordPattern
+ * ASTPatternList
(Note: it was renamed from `ASTComponentPatternList`)
+ * ASTGuard
(Note: it was renamed from `ASTSwitchGuard`)
+
+#### 7.0.0-rc3
+
+**PMD Distribution**
+
+* The asset filenames of PMD on [GitHub Releases](https://github.com/pmd/pmd/releases) are
+ now `pmd-dist-RuleViolation#getFileId
, that returns a
+ FileId
. This is an identifier for a TextFile
+ 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
+ (see Renderer#setFileNameRenderer
and
+ ConfigurableFileNameRenderer
). Many places where we used a simple String for
+ a path-like name before have been adapted to use the new FileId
.
+
+ See [PR #4425](https://github.com/pmd/pmd/pull/4425) for details.
+
+#### 7.0.0-rc2
+
+**Removed classes and methods**
+
+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`
+
+**CLI**
+
+* 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.
+
+#### 7.0.0-rc1
+
+**CLI**
+
+* The CLI option `--stress` (or `-stress`) has been removed without replacement.
+* The CLI option `--minimum-priority` now takes one of the following values instead of an integer:
+ High, Medium High, Medium, Medium Low, Low.
+
+#### 6.55.0
+
+**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:
+ * GoLanguageModule
+
+**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.
+
+#### 6.54.0
+
+**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
+ always `Version.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
+ for `CPDConfiguration` which extends `AbstractConfiguration`.
+* BaseCLITest
and BaseCPDCLITest
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.
+* CPDConfiguration.LanguageConverter
+
+* FileCollector#addZipFile
has been deprecated. It is replaced
+ by FileCollector#addZipFileWithContent
which directly adds the
+ content of the zip file for analysis.
+
+* PMDConfiguration#setReportShortNames
and
+ PMDConfiguration#isReportShortNames
have been deprecated for removal.
+ Use AbstractConfiguration#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.
+
+#### 6.53.0
+
+**Deprecated APIs**
+
+**For removal**
+
+These classes / APIs have been deprecated and will be removed with PMD 7.0.0.
+
+* ExcessiveLengthRule
(Java)
+
+#### 6.52.0
+
+**PMD CLI**
+
+* PMD now supports a new `--use-version` flag, which receives a language-version pair (such as `java-8` or `apex-54`).
+ This supersedes the usage of `-language` / `-l` and `-version` / `-v`, allowing for multiple versions to be set in a single run.
+ PMD 7 will completely remove support for `-language` and `-version` in favor of this new flag.
+
+* Support for `-V` is being deprecated in favor of `--verbose` in preparation for PMD 7.
+ In PMD 7, `-v` will enable verbose mode and `-V` will show the PMD version for consistency with most Unix/Linux tools.
+
+* Support for `-min` is being deprecated in favor of `--minimum-priority` for consistency with most Unix/Linux tools, where `-min` would be equivalent to `-m -i -n`.
+
+**CPD CLI**
+
+* CPD now supports using `-d` or `--dir` as an alias to `--files`, in favor of consistency with PMD.
+ PMD 7 will remove support for `--files` in favor of these new flags.
+
+**Linux run.sh parameters**
+
+* Using `run.sh cpdgui` will now warn about it being deprecated. Use `run.sh cpd-gui` instead.
+
+* The old designer (`run.sh designerold`) is completely deprecated and will be removed in PMD 7. Switch to the new JavaFX designer: `run.sh designer`.
+
+* The old visual AST viewer (`run.sh bgastviewer`) is completely deprecated and will be removed in PMD 7. Switch to the new JavaFX designer: `run.sh designer` for a visual tool, or use `run.sh ast-dump` for a text-based alternative.
+
+**Deprecated API**
+
+* The following core APIs have been marked as deprecated for removal in PMD 7:
+ - PMD
and `PMD.StatusCode` - PMD 7 will ship with a revamped CLI split from pmd-core. To programmatically launch analysis you can use PmdAnalysis
.
+ - PMDConfiguration#getAllInputPaths
- It is now superseded by PMDConfiguration#getInputPathList
+ - PMDConfiguration#setInputPaths
- It is now superseded by PMDConfiguration#setInputPathList
+ - PMDConfiguration#addInputPath
- It is now superseded by PMDConfiguration#addInputPath
+ - PMDConfiguration#getInputFilePath
- It is now superseded by PMDConfiguration#getInputFile
+ - PMDConfiguration#getIgnoreFilePath
- It is now superseded by PMDConfiguration#getIgnoreFile
+ - PMDConfiguration#setInputFilePath
- It is now superseded by PMDConfiguration#setInputFilePath
+ - PMDConfiguration#setIgnoreFilePath
- It is now superseded by PMDConfiguration#setIgnoreFilePath
+ - PMDConfiguration#getInputUri
- It is now superseded by PMDConfiguration#getUri
+ - PMDConfiguration#setInputUri
- It is now superseded by PMDConfiguration#setInputUri
+ - PMDConfiguration#getReportFile
- It is now superseded by PMDConfiguration#getReportFilePath
+ - PMDConfiguration#setReportFile
- It is now superseded by PMDConfiguration#setReportFile
+ - PMDConfiguration#isStressTest
and PMDConfiguration#setStressTest
- Will be removed with no replacement.
+ - PMDConfiguration#isBenchmark
and PMDConfiguration#setBenchmark
- Will be removed with no replacement, the CLI will still support it.
+ - CPD
and `CPD.StatusCode` - PMD 7 will ship with a revamped CLI split from pmd-core. An alternative to programmatically launch CPD analysis will be added in due time.
+
+* In order to reduce the dependency on Apex Jorje classes, the method DataType#fromBasicType
+ has been deprecated. The equivalent method fromTypeName
should be used instead.
+
+#### 6.51.0
+
+No changes.
+
+#### 6.50.0
+
+**CPD CLI**
+
+* CPD now supports the `--ignore-literal-sequences` argument when analyzing Lua code.
+
+#### 6.49.0
+
+**Deprecated API**
+
+* In order to reduce the dependency on Apex Jorje classes, the following methods have been deprecated.
+ These methods all leaked internal Jorje enums. These enums have been replaced now by enums the
+ PMD's AST package.
+ * ASTAssignmentExpression#getOperator
+ * ASTBinaryExpression#getOperator
+ * ASTBooleanExpression#getOperator
+ * ASTPostfixExpression#getOperator
+ * ASTPrefixExpression#getOperator
+
+ All these classes have now a new `getOp()` method. Existing code should be refactored to use this method instead.
+ It returns the new enums, like AssignmentOperator
, and avoids
+ the dependency to Jorje.
+
+#### 6.48.0
+
+**CPD CLI**
+
+* CPD has a new CLI option `--debug`. This option has the same behavior as in PMD. It enables more verbose
+ logging output.
+
+**Rule Test Framework**
+
+* The module "pmd-test", which contains support classes to write rule tests, now **requires Java 8**. If you depend on
+ this module for testing your own custom rules, you'll need to make sure to use at least Java 8.
+* The new module "pmd-test-schema" contains now the XSD schema and the code to parse the rule test XML files. The
+ schema has been extracted in order to easily share it with other tools like the Rule Designer or IDE plugins.
+* Test schema changes:
+ * The attribute `isRegressionTest` of `test-code` is deprecated. The new
+ attribute `disabled` should be used instead for defining whether a rule test should be skipped or not.
+ * The attributes `reinitializeRule` and `useAuxClasspath` of `test-code` are deprecated and assumed true.
+ They will not be replaced.
+ * The new attribute `focused` of `test-code` allows disabling all tests except the focused one temporarily.
+* More information about the rule test framework can be found in the documentation:
+ [Testing your rules](pmd_userdocs_extending_testing.html)
+
+**Deprecated API**
+
+* The experimental Java AST class `net.sourceforge.pmd.lang.java.ast.ASTGuardedPattern` has been deprecated and
+ will be removed. It was introduced for Java 17 and Java 18 Preview as part of pattern matching for switch,
+ but it is no longer supported with Java 19 Preview.
+* The interface CPDRenderer
is deprecated. For custom CPD renderers
+ the new interface CPDReportRenderer
should be used.
+* The class TestDescriptor
is deprecated, replaced with RuleTestDescriptor
.
+* Many methods of RuleTst
have been deprecated as internal API.
+
+**Experimental APIs**
+
+* To support the Java preview language features "Pattern Matching for Switch" and "Record Patterns", the following
+ AST nodes have been introduced as experimental:
+ * ASTSwitchGuard
+ * ASTRecordPattern
+ * ASTComponentPatternList
+
+**Internal API**
+
+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.
+
+* CPDConfiguration#setRenderer
+* CPDConfiguration#setCPDRenderer
+* CPDConfiguration#getRenderer
+* CPDConfiguration#getCPDRenderer
+* CPDConfiguration#getRendererFromString
+* CPDConfiguration#getCPDRendererFromString
+* CPDRendererAdapter
+
+#### 6.47.0
+
+No changes.
+
+#### 6.46.0
+
+**Deprecated ruleset references**
+
+Ruleset references with the following formats are now deprecated and will produce a warning
+when used on the CLI or in a ruleset XML file:
+- `toString
is now deprecated. The format of this
+ method will remain the same until PMD 7. The deprecation is intended to steer users
+ away from relying on this format, as it may be changed in PMD 7.
+- getInputPaths
and
+ setInputPaths
are now deprecated.
+ A new set of methods have been added, which use lists and do not rely on comma splitting.
+
+**Internal API**
+
+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.
+
+- CPDCommandLineInterface
has been internalized. In order to execute CPD either
+ CPD#runCpd
or CPD#main
+ should be used.
+- Several members of BaseCPDCLITest
have been deprecated with replacements.
+- The methods Formatter#start
,
+ Formatter#end
, Formatter#getRenderer
,
+ and Formatter#isNoOutputSupplied
have been internalized.
+
+#### 6.45.0
+
+**Experimental APIs**
+
+* Report has two new methods which allow limited mutations of a given report:
+ * Report#filterViolations
creates a new report with
+ some violations removed with a given predicate based filter.
+ * Report#union
can combine two reports into a single new Report.
+* net.sourceforge.pmd.util.Predicate
will be replaced in PMD7 with the standard Predicate interface from java8.
+* The module `pmd-html` is entirely experimental right now. Anything in the package
+ `net.sourceforge.pmd.lang.html` should be used cautiously.
+
+#### 6.44.0
+
+**Deprecated API**
+
+* Several members of PMD
have been newly deprecated, including:
+ - `PMD#EOL`: use `System#lineSeparator()`
+ - `PMD#SUPPRESS_MARKER`: use DEFAULT_SUPPRESS_MARKER
+ - `PMD#processFiles`: use the new programmatic API
+ - `PMD#getApplicableFiles`: is internal
+* PMDConfiguration#prependClasspath
is deprecated
+ in favour of prependAuxClasspath
.
+* PMDConfiguration#setRuleSets
and
+ getRuleSets
are deprecated. Use instead
+ setRuleSets
,
+ addRuleSet
,
+ and getRuleSetPaths
.
+* Several members of BaseCLITest
have been deprecated with replacements.
+* Several members of PMDCommandLineInterface
have been explicitly deprecated.
+ The whole class however was deprecated long ago already with 6.30.0. It is internal API and should
+ not be used.
+
+* In modelica, the rule classes AmbiguousResolutionRule
+ and ConnectUsingNonConnector
have been deprecated,
+ since they didn't comply to the usual rule class naming conventions yet.
+ The replacements are in the subpackage `bestpractices`.
+
+**Experimental APIs**
+
+* Together with the new programmatic API the interface
+ TextFile
has been added as *experimental*. It intends
+ to replace DataSource
and SourceCode
in the long term.
+
+ This interface will change in PMD 7 to support read/write operations
+ and other things. You don't need to use it in PMD 6, as FileCollector
+ decouples you from this. A file collector is available through PmdAnalysis#files
.
+
+#### 6.43.0
+
+**Deprecated API**
+
+Some API deprecations were performed in core PMD classes, to improve compatibility with PMD 7.
+- Report
: the constructor and other construction methods like addViolation or createReport
+- RuleContext
: all constructors, getters and setters. A new set
+ of stable methods, matching those in PMD 7, was added to replace the `addViolation`
+ overloads of AbstractRule
. In PMD 7, `RuleContext` will
+ be the API to report violations, and it can already be used as such in PMD 6.
+- The field configuration
is unused and will be removed.
+
+**Internal API**
+
+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.
+
+- RuleSet
: methods that serve to apply rules, including `apply`, `start`, `end`, `removeDysfunctionalRules`
+- AbstractAccumulatingRenderer#renderFileReport
is internal API
+ and should not be overridden in own renderers.
+
+**Changed API**
+
+It is now forbidden to report a violation:
+- With a `null` node
+- With a `null` message
+- With a `null` set of format arguments (prefer a zero-length array)
+
+Note that the message is set from the XML rule declaration, so this is only relevant
+if you instantiate rules manually.
+
+RuleContext
now requires setting the current rule before calling
+apply
. This is
+done automatically by `RuleSet#apply` and such. Creating and configuring a
+`RuleContext` manually is strongly advised against, as the lifecycle of `RuleContext`
+will change drastically in PMD 7.
+
+#### 6.42.0
+
+No changes.
+
+#### 6.41.0
+
+**Command Line Interface**
+
+The command line options for PMD and CPD now use GNU-syle long options format. E.g. instead of `-rulesets` the
+preferred usage is now `--rulesets`. Alternatively one can still use the short option `-R`.
+Some options also have been renamed to a more consistent casing pattern at the same time
+(`--fail-on-violation` instead of `-failOnViolation`).
+The old single-dash options are still supported but are deprecated and will be removed with PMD 7.
+This change makes the command line interface more consistent within PMD and also less surprising
+compared to other cli tools.
+
+The changes in detail for PMD:
+
+| old option | new option |
+|---------------------------|------------------------------|
+| `-rulesets` | `--rulesets` (or `-R`) |
+| `-uri` | `--uri` |
+| `-dir` | `--dir` (or `-d`) |
+| `-filelist` | `--file-list` |
+| `-ignorelist` | `--ignore-list` |
+| `-format` | `--format` (or `-f`) |
+| `-debug` | `--debug` |
+| `-verbose` | `--verbose` |
+| `-help` | `--help` |
+| `-encoding` | `--encoding` |
+| `-threads` | `--threads` |
+| `-benchmark` | `--benchmark` |
+| `-stress` | `--stress` |
+| `-shortnames` | `--short-names` |
+| `-showsuppressed` | `--show-suppressed` |
+| `-suppressmarker` | `--suppress-marker` |
+| `-minimumpriority` | `--minimum-priority` |
+| `-property` | `--property` |
+| `-reportfile` | `--report-file` |
+| `-force-language` | `--force-language` |
+| `-auxclasspath` | `--aux-classpath` |
+| `-failOnViolation` | `--fail-on-violation` |
+| `--failOnViolation` | `--fail-on-violation` |
+| `-norulesetcompatibility` | `--no-ruleset-compatibility` |
+| `-cache` | `--cache` |
+| `-no-cache` | `--no-cache` |
+
+The changes in detail for CPD:
+
+| old option | new option |
+|---------------------|-----------------------|
+| `--failOnViolation` | `--fail-on-violation` |
+| `-failOnViolation` | `--fail-on-violation` |
+| `--filelist` | `--file-list` |
+
+#### 6.40.0
+
+**Experimental APIs**
+
+* The interface ASTCommentContainer
has been added to the Apex AST.
+ It provides a way to check whether a node contains at least one comment. Currently, this is only implemented for
+ ASTCatchBlockStatement
and used by the rule
+ [`EmptyCatchBlock`](https://docs.pmd-code.org/pmd-doc-7.0.0/pmd_rules_apex_errorprone.html#emptycatchblock).
+ This information is also available via XPath attribute `@ContainsComment`.
+
+#### 6.39.0
+
+No changes.
+
+#### 6.38.0
+
+No changes.
+
+#### 6.37.0
+
+**PMD CLI**
+
+* PMD has a new CLI option `-force-language`. With that a language can be forced to be used for all input files,
+ irrespective of filenames. When using this option, the automatic language selection by extension is disabled
+ and all files are tried to be parsed with the given language. Parsing errors are ignored and unparsable files
+ are skipped.
+
+ This option allows to use the xml language for files, that don't use xml as extension.
+ See also the examples on [PMD CLI reference](pmd_userdocs_cli_reference.html#analyze-other-xml-formats).
+
+**Experimental APIs**
+
+* The AST types and APIs around Sealed Classes are not experimental anymore:
+* ASTClassOrInterfaceDeclaration#isSealed
,
+ ASTClassOrInterfaceDeclaration#isNonSealed
,
+ ASTClassOrInterfaceDeclaration#getPermittedSubclasses
+* ASTPermitsList
+
+**Internal API**
+
+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.
+
+* The inner class net.sourceforge.pmd.cpd.TokenEntry.State
is considered to be internal API.
+ It will probably be moved away with PMD 7.
+
+#### 6.36.0
+
+No changes.
+
+#### 6.35.0
+
+**Deprecated API**
+
+* PMD#doPMD
is deprecated.
+ Use PMD#runPmd
instead.
+* PMD#run
is deprecated.
+ Use PMD#runPmd
instead.
+* ThreadSafeReportListener
and the methods to use them in Report
+ (addListener
,
+ getListeners
, addListeners
)
+ are deprecated. This functionality will be replaced by another TBD mechanism in PMD 7.
+
+#### 6.34.0
+
+No changes.
+
+#### 6.33.0
+
+No changes.
+
+#### 6.32.0
+
+**Experimental APIs**
+
+* The experimental class `ASTTypeTestPattern` has been renamed to ASTTypePattern
+ in order to align the naming to the JLS.
+* The experimental class `ASTRecordConstructorDeclaration` has been renamed to ASTCompactConstructorDeclaration
+ in order to align the naming to the JLS.
+* The AST types and APIs around Pattern Matching and Records are not experimental anymore:
+* ASTVariableId#isPatternBinding
+* ASTPattern
+* ASTTypePattern
+* ASTRecordDeclaration
+* ASTRecordComponentList
+* ASTRecordComponent
+* ASTRecordBody
+* ASTCompactConstructorDeclaration
+
+**Internal API**
+
+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.
+
+* The protected or public member of the Java rule AvoidUsingHardCodedIPRule
+ are deprecated and considered to be internal API. They will be removed with PMD 7.
+
+#### 6.31.0
+
+**Deprecated API**
+
+* AbstractDomXmlRule
+* AbstractWsdlRule
+* A few methods of AbstractXmlRule
+
+**Experimental APIs**
+
+* The method GenericToken#getKind
has been added as experimental. This
+ unifies the token interface for both JavaCC and Antlr. The already existing method
+ AntlrToken#getKind
is therefore experimental as well. The
+ returned constant depends on the actual language and might change whenever the grammar
+ of the language is changed.
+
+#### 6.30.0
+
+**Deprecated API**
+
+**Around RuleSet parsing**
+
+* RuleSetFactory
and RulesetsFactoryUtils
have been deprecated in favor of RuleSetLoader
. This is easier to configure, and more maintainable than the multiple overloads of `RulesetsFactoryUtils`.
+* Some static creation methods have been added to RuleSet
for simple cases, eg forSingleRule
. These replace some counterparts in RuleSetFactory
+* Since RuleSets
is also deprecated, many APIs that require a RuleSets instance now are deprecated, and have a counterpart that expects a `ListRuleSetReferenceId
, RuleSetReference
, RuleSetFactoryCompatibility
are deprecated. They are most likely not relevant outside of the implementation of pmd-core.
+
+**Around the `PMD` class**
+
+Many classes around PMD's entry point (PMD
) have been deprecated as internal, including:
+* The contents of the packages net.sourceforge.pmd.cli
in pmd-core, net.sourceforge.pmd.processor
+* SourceCodeProcessor
+* The constructors of PMD
(the class will be made a utility class)
+
+**Miscellaneous**
+
+* ASTPackageDeclaration#getPackageNameImage
,
+ ASTTypeParameter#getParameterName
+ and the corresponding XPath attributes. In both cases they're replaced with a new method `getName`,
+ the attribute is `@Name`.
+* ASTClassOrInterfaceBody#isAnonymousInnerClass
,
+ and ASTClassOrInterfaceBody#isEnumChild
,
+ refs [#905](https://github.com/pmd/pmd/issues/905)
+
+**Internal API**
+
+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.
+
+* net.sourceforge.pmd.lang.ecmascript.Ecmascript3Handler
+* net.sourceforge.pmd.lang.ecmascript.Ecmascript3Parser
+* EcmascriptParser#parserOptions
+* EcmascriptParser#getSuppressMap
+* net.sourceforge.pmd.lang.rule.ParametricRuleViolation
+* ParserOptions#suppressMarker
+* net.sourceforge.pmd.lang.modelica.rule.ModelicaRuleViolationFactory
+
+#### 6.29.0
+
+No changes.
+
+#### 6.28.0
+
+**Deprecated API**
+
+**For removal**
+
+* net.sourceforge.pmd.RuleViolationComparator
. Use RuleViolation#DEFAULT_COMPARATOR
instead.
+* net.sourceforge.pmd.cpd.AbstractTokenizer
. Use net.sourceforge.pmd.cpd.AnyCpdLexer
instead (previously called AnyTokenizer).
+* net.sourceforge.pmd.cpd.FortranTokenizer
. Was replaced by an AnyCpdLexer
. Use FortranLanguageModule#createCpdLexer
anyway.
+* net.sourceforge.pmd.cpd.PerlTokenizer
. Was replaced by an AnyCpdLexer
. Use PerlLanguageModule#createCpdLexer
anyway.
+* net.sourceforge.pmd.cpd.RubyTokenizer
. Was replaced by an AnyCpdLexer
. Use RubyLanguageModule#createCpdLexer
anyway.
+* RuleReference#getOverriddenLanguage
and
+ RuleReference#setLanguage
+* Antlr4 generated lexers:
+ * net.sourceforge.pmd.lang.cs.antlr4.CSharpLexer
will be moved to package `net.sourceforge.pmd.lang.cs.ast` with PMD 7.
+ * net.sourceforge.pmd.lang.dart.antlr4.Dart2Lexer
will be renamed to `DartLexer` and moved to package
+ `net.sourceforge.pmd.lang.dart.ast` with PMD 7. All other classes in the old package will be removed.
+ * net.sourceforge.pmd.lang.go.antlr4.GolangLexer
will be moved to package
+ `net.sourceforge.pmd.lang.go.ast` with PMD 7. All other classes in the old package will be removed.
+ * net.sourceforge.pmd.lang.kotlin.antlr4.Kotlin
will be renamed to `KotlinLexer` and moved to package
+ `net.sourceforge.pmd.lang.kotlin.ast` with PMD 7.
+ * net.sourceforge.pmd.lang.lua.antlr4.LuaLexer
will be moved to package
+ `net.sourceforge.pmd.lang.lua.ast` with PMD 7. All other classes in the old package will be removed.
+
+#### 6.27.0
+
+* XML rule definition in rulesets: In PMD 7, the `language` attribute will be required on all `rule`
+ elements that declare a new rule. Some base rule classes set the language implicitly in their
+ constructor, and so this is not required in all cases for the rule to work. But this
+ behavior will be discontinued in PMD 7, so missing `language` attributes are now
+ reported as a forward compatibility warning.
+
+**Deprecated API**
+
+**For removal**
+
+* Rule#getParserOptions
+* Parser#getParserOptions
+* AbstractParser
+* RuleContext#removeAttribute
+* RuleContext#getAttribute
+* RuleContext#setAttribute
+* ApexParserOptions
+* ASTThrowStatement#getFirstClassOrInterfaceTypeImage
+* EcmascriptParserOptions
+* EcmascriptXPathRule
+* XmlParserOptions
+* XmlXPathRule
+* Properties of AbstractXmlRule
+
+* net.sourceforge.pmd.Report.ReadableDuration
+* Many methods of net.sourceforge.pmd.Report
. They are replaced by accessors
+ that produce a List. For example, iterator()
+ (and implementing Iterable) and isEmpty()
are both
+ replaced by getViolations()
.
+
+* The dataflow codebase is deprecated for removal in PMD 7. This includes all code in the following packages, and their subpackages:
+ * net.sourceforge.pmd.lang.plsql.dfa
+ * net.sourceforge.pmd.lang.java.dfa
+ * net.sourceforge.pmd.lang.dfa
+ * and the class PLSQLDataFlowHandler
+
+* VfSimpleCharStream
+
+* ASTJspDeclarations
+* ASTJspDocument
+* ScalaParserVisitorAdapter#zero
+* ScalaParserVisitorAdapter#combine
+* ApexParserVisitorReducedAdapter
+* JavaParserVisitorReducedAdapter
+
+* TypeHelper
is deprecated in
+ favor of TypeTestUtil
, which has the
+ same functionality, but a slightly changed API.
+* Many of the classes in net.sourceforge.pmd.lang.java.symboltable
+ are deprecated as internal API.
+
+#### 6.26.0
+
+**Deprecated API**
+
+**For removal**
+
+* RuleChainVisitor
and all implementations in language modules
+* AbstractRuleChainVisitor
+* Language#getRuleChainVisitorClass
+* BaseLanguageModule#<init>
+* ImportWrapper
+
+#### 6.25.0
+
+* The maven module `net.sourceforge.pmd:pmd-scala` is deprecated. Use `net.sourceforge.pmd:pmd-scala_2.13`
+ or `net.sourceforge.pmd:pmd-scala_2.12` instead.
+
+* Rule implementation classes are internal API and should not be used by clients directly.
+ The rules should only be referenced via their entry in the corresponding category ruleset
+ (e.g. `AbstractIgnoredAnnotationRule
(Java)
+* AbstractInefficientZeroCheck
(Java)
+* AbstractJUnitRule
(Java)
+* AbstractJavaMetricsRule
(Java)
+* AbstractLombokAwareRule
(Java)
+* AbstractPoorMethodCall
(Java)
+* AbstractSunSecureRule
(Java)
+* AbstractNcssCountRule
(Java)
+* AbstractCommentRule
(Java)
+* AbstractOptimizationRule
(Java)
+* RegexHelper
(Java)
+* AbstractApexUnitTestRule
(Apex)
+* AbstractNcssCountRule
(Apex)
+* AbstractNcssCountRule
(PLSQL)
+* ApexParser
+* ApexHandler
+* RuleChain
+* RuleSets
+* RulesetsFactoryUtils#getRuleSets
+
+**For removal**
+
+* TokenEntry#TokenEntry
+* AbstractTokenizerTest
. Use CpdTextComparisonTest in module pmd-lang-test instead.
+ For details see
+ [Testing your implementation](pmd_devdocs_major_adding_new_cpd_language.html#testing-your-implementation)
+ in the developer documentation.
+* ASTAnnotation#suppresses
(Apex)
+* ApexXPathRule
(Apex)
+* SymbolTableTestRule
(Java)
+* InefficientStringBufferingRule#isInStringBufferOperation
+
+#### 6.24.0
+
+**Deprecated APIs**
+
+* BaseLanguageModule#addVersion(String, LanguageVersionHandler, boolean)
+* Some members of TokenMgrError
, in particular, a new constructor is available
+ that should be preferred to the old ones
+* ANTLRSyntaxError
+
+**Experimental APIs**
+
+**Note:** Experimental APIs are identified with the annotation Experimental
,
+see its javadoc for details
+
+* The experimental methods in BaseLanguageModule
have been replaced by a
+ definitive API.
+
+#### 6.23.0
+
+**Deprecated APIs**
+
+**Internal API**
+
+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.
+
+* AbstractXPathRuleQuery
+* JaxenXPathRuleQuery
+* SaxonXPathRuleQuery
+* XPathRuleQuery
+
+**In ASTs**
+
+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:
+
+* Manual instantiation of nodes. **Constructors of node classes are deprecated** and
+ marked 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.
+* **Subclassing of abstract node classes, or usage of their type**. The base classes are internal API
+ and will be hidden in version 7.0.0. You should not couple your code to them.
+* In the meantime you should use interfaces like VfNode
or
+ Node
, or the other published interfaces in this package,
+ to refer to nodes generically.
+* Concrete node classes will **be made final** with 7.0.0.
+* Setters found in any node class or interface. **Rules should consider the AST immutable**.
+ We will make those setters package private with 7.0.0.
+* The implementation classes of Parser
(eg VfParser
) are deprecated and should not be used directly.
+ Use LanguageVersionHandler#getParser
instead.
+* The implementation classes of 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.
+* Apex: net.sourceforge.pmd.lang.apex.ast
+* Javascript: net.sourceforge.pmd.lang.ecmascript.ast
+* PL/SQL: net.sourceforge.pmd.lang.plsql.ast
+* Scala: net.sourceforge.pmd.lang.scala.ast
+* Visualforce: net.sourceforge.pmd.lang.vf.ast
+
+These deprecations have already been rolled out in a previous version for the
+following languages:
+* Java: net.sourceforge.pmd.lang.java.ast
+* Java Server Pages: net.sourceforge.pmd.lang.jsp.ast
+* Velocity Template Language: 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()` instead
+* ASTVariableDeclaratorId#getImage
- use `getName()` instead
+* ASTVariableDeclaratorId#getVariableName
- use `getName()` instead
+
+**For removal**
+
+* Parser#getTokenManager
+* TokenManager#setFileName
+* AbstractTokenManager#setFileName
+* AbstractTokenManager#getFileName
+* AntlrToken#getType
- use `getKind()` instead.
+* ImmutableLanguage
+* MockRule
+* Node#getFirstParentOfAnyType
+* Node#getAsDocument
+* AbstractNode#hasDescendantOfAnyType
+* ASTRecordDeclaration#getComponentList
+* Multiple fields, constructors and methods in XPathRule
. See javadoc for details.
+
+#### 6.22.0
+
+**Deprecated APIs**
+
+**Internal API**
+
+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.
+
+* JavaLanguageHandler
+* JavaLanguageParser
+* JavaDataFlowHandler
+* Implementations of RuleViolationFactory
in each
+ language module, eg JavaRuleViolationFactory
.
+ See javadoc of RuleViolationFactory
.
+* Implementations of RuleViolation
in each language module,
+ eg JavaRuleViolation
. See javadoc of
+ RuleViolation
.
+
+* RuleFactory
+* RuleBuilder
+* Constructors of RuleSetFactory
, use factory methods from RulesetsFactoryUtils
instead
+* getRulesetFactory
+
+* AbstractApexNode
+* AbstractApexNodeBase
, and the related `visit`
+ methods on ApexParserVisitor
and its implementations.
+ Use ApexNode
instead, now considers comments too.
+
+**For removal**
+
+* pmd-core
+ * DFAGraphRule
and its implementations
+ * DFAGraphMethod
+ * Many methods on the Node
interface
+ and AbstractNode
base class. See their javadoc for details.
+ * Node#isFindBoundary
is deprecated for XPath queries.
+ * Many APIs of `net.sourceforge.pmd.lang.metrics`, though most of them were internal and
+ probably not used directly outside of PMD. Use MetricsUtil
as
+ a replacement for the language-specific façades too.
+ * QualifiableNode
, QualifiedName
+* pmd-java
+ * AbstractJavaParser
+ * AbstractJavaHandler
+ * [`ASTAnyTypeDeclaration.TypeKind`](https://docs.pmd-code.org/apidocs/pmd-java/6.55.0/net/sourceforge/pmd/lang/java/ast/ASTAnyTypeDeclaration.TypeKind.html)
+ * ASTAnyTypeDeclaration#getTypeKind
+ * JavaQualifiedName
+ * ASTCatchStatement#getBlock
+ * ASTCompilationUnit#declarationsAreInDefaultPackage
+ * JavaQualifiableNode
+ * ASTAnyTypeDeclaration#getQualifiedName
+ * ASTMethodOrConstructorDeclaration#getQualifiedName
+ * ASTLambdaExpression#getQualifiedName
+ * net.sourceforge.pmd.lang.java.qname
and its contents
+ * MethodLikeNode
+ * Its methods will also be removed from its implementations,
+ ASTMethodOrConstructorDeclaration
,
+ ASTLambdaExpression
.
+ * ASTAnyTypeDeclaration#getImage
will be removed. Please use `getSimpleName()`
+ instead. This affects ASTAnnotationTypeDeclaration#getImage
,
+ ASTClassOrInterfaceDeclaration#getImage
, and
+ ASTEnumDeclaration#getImage
.
+ * Several methods of ASTTryStatement
, replacements with other names
+ have been added. This includes the XPath attribute `@Finally`, replace it with a test for `child::FinallyStatement`.
+ * Several methods named `getGuardExpressionNode` are replaced with `getCondition`. This affects the
+ following nodes: WhileStatement, DoStatement, ForStatement, IfStatement, AssertStatement, ConditionalExpression.
+ * ASTYieldStatement
will not implement TypeNode
+ anymore come 7.0.0. Test the type of the expression nested within it.
+ * JavaMetrics
, JavaMetricsComputer
+ * ASTArguments#getArgumentCount
.
+ Use size
instead.
+ * ASTFormalParameters#getParameterCount
.
+ Use size
instead.
+* pmd-apex
+ * ApexMetrics
, ApexMetricsComputer
+
+**In ASTs (JSP)**
+
+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 JSP AST** (with other languages to come):
+
+* Manual instantiation of nodes. **Constructors of node classes are deprecated** and
+ marked 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.
+* **Subclassing of abstract node classes, or usage of their type**. The base classes are internal API
+ and will be hidden in version 7.0.0. You should not couple your code to them.
+* In the meantime you should use interfaces like JspNode
or
+ Node
, or the other published interfaces in this package,
+ to refer to nodes generically.
+* Concrete node classes will **be made final** with 7.0.0.
+* Setters found in any node class or interface. **Rules should consider the AST immutable**.
+ We will make those setters package private with 7.0.0.
+* The class JspParser
is deprecated and should not be used directly.
+ Use LanguageVersionHandler#getParser
instead.
+
+Please look at net.sourceforge.pmd.lang.jsp.ast
to find out the full list of deprecations.
+
+**In ASTs (Velocity)**
+
+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 VM AST** (with other languages to come):
+
+* Manual instantiation of nodes. **Constructors of node classes are deprecated** and
+ marked 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.
+* **Subclassing of abstract node classes, or usage of their type**. The base classes are internal API
+ and will be hidden in version 7.0.0. You should not couple your code to them.
+* In the meantime you should use interfaces like VtlNode
or
+ Node
, or the other published interfaces in this package,
+ to refer to nodes generically.
+* Concrete node classes will **be made final** with 7.0.0.
+* Setters found in any node class or interface. **Rules should consider the AST immutable**.
+ We will make those setters package private with 7.0.0.
+* The package net.sourceforge.pmd.lang.vm.directive
as well as the classes
+ DirectiveMapper
and LogUtil
are deprecated
+ for removal. They were only used internally during parsing.
+* The class VmParser
is deprecated and should not be used directly.
+ Use LanguageVersionHandler#getParser
instead.
+
+Please look at net.sourceforge.pmd.lang.vm.ast
to find out the full list of deprecations.
+
+**PLSQL AST**
+
+The production and node ASTCursorBody
was unnecessary, not used and has been removed. Cursors have been already
+parsed as ASTCursorSpecification
.
+
+#### 6.21.0
+
+**Deprecated APIs**
+
+**Internal API**
+
+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.
+
+* JavaLanguageHandler
+* JavaLanguageParser
+* JavaDataFlowHandler
+* Implementations of RuleViolationFactory
in each
+ language module, eg JavaRuleViolationFactory
.
+ See javadoc of RuleViolationFactory
.
+* Implementations of RuleViolation
in each language module,
+ eg JavaRuleViolation
. See javadoc of
+ RuleViolation
.
+
+* RuleFactory
+* RuleBuilder
+* Constructors of RuleSetFactory
, use factory methods from RulesetsFactoryUtils
instead
+* getRulesetFactory
+
+* AbstractApexNode
+* AbstractApexNodeBase
, and the related `visit`
+ methods on ApexParserVisitor
and its implementations.
+ Use ApexNode
instead, now considers comments too.
+
+* CharStream
, JavaCharStream
,
+ SimpleCharStream
: these are APIs used by our JavaCC
+ implementations and that will be moved/refactored for PMD 7.0.0. They should not
+ be used, extended or implemented directly.
+* All classes generated by JavaCC, eg JJTJavaParserState
.
+ This includes token classes, which will be replaced with a single implementation, and
+ subclasses of ParseException
, whose usages will be replaced
+ by just that superclass.
+
+**For removal**
+
+* pmd-core
+ * Many methods on the Node
interface
+ and AbstractNode
base class. See their javadoc for details.
+ * Node#isFindBoundary
is deprecated for XPath queries.
+* pmd-java
+ * AbstractJavaParser
+ * AbstractJavaHandler
+ * [`ASTAnyTypeDeclaration.TypeKind`](https://javadoc.io/page/net.sourceforge.pmd/pmd-java/6.55.0/net/sourceforge/pmd/lang/java/ast/ASTAnyTypeDeclaration.TypeKind.html)
+ * ASTAnyTypeDeclaration#getTypeKind
+ * JavaQualifiedName
+ * ASTCatchStatement#getBlock
+ * ASTCompilationUnit#declarationsAreInDefaultPackage
+ * JavaQualifiableNode
+ * ASTAnyTypeDeclaration#getQualifiedName
+ * ASTMethodOrConstructorDeclaration#getQualifiedName
+ * ASTLambdaExpression#getQualifiedName
+ * net.sourceforge.pmd.lang.java.qname
and its contents
+ * MethodLikeNode
+ * Its methods will also be removed from its implementations,
+ ASTMethodOrConstructorDeclaration
,
+ ASTLambdaExpression
.
+ * ASTAnyTypeDeclaration#getImage
will be removed. Please use `getSimpleName()`
+ instead. This affects ASTAnnotationTypeDeclaration#getImage
,
+ ASTClassOrInterfaceDeclaration#getImage
, and
+ ASTEnumDeclaration#getImage
.
+ * Several methods of ASTTryStatement
, replacements with other names
+ have been added. This includes the XPath attribute `@Finally`, replace it with a test for `child::FinallyStatement`.
+ * Several methods named `getGuardExpressionNode` are replaced with `getCondition`. This affects the
+ following nodes: WhileStatement, DoStatement, ForStatement, IfStatement, AssertStatement, ConditionalExpression.
+ * ASTYieldStatement
will not implement TypeNode
+ anymore come 7.0.0. Test the type of the expression nested within it.
+
+#### 6.20.0
+
+No changes.
+
+#### 6.19.0
+
+**Deprecated APIs**
+
+**For removal**
+
+* pmd-core
+ * All the package net.sourceforge.pmd.dcd
and its subpackages. See DCD
.
+ * In LanguageRegistry
:
+ * commaSeparatedTerseNamesForLanguageVersion
+ * commaSeparatedTerseNamesForLanguage
+ * findAllVersions
+ * findLanguageVersionByTerseName
+ * getInstance
+ * RuleSet#getExcludePatterns
. Use the new method getFileExclusions
instead.
+ * RuleSet#getIncludePatterns
. Use the new method getFileInclusions
instead.
+ * Parser#canParse
+ * Parser#getSuppressMap
+ * RuleBuilder#RuleBuilder
. Use the new constructor with the correct ResourceLoader instead.
+ * RuleFactory#RuleFactory
. Use the new constructor with the correct ResourceLoader instead.
+* pmd-java
+ * CanSuppressWarnings
and its implementations
+ * isSuppressed
+ * getDeclaringType
.
+ * isSupressed
+ * ASTMethodDeclarator
+ * getMethodName
+ * getBlock
+ * getParameterCount
+* pmd-apex
+ * CanSuppressWarnings
and its implementations
+ * isSupressed
+
+**Internal APIs**
+
+* pmd-core
+ * All the package net.sourceforge.pmd.util
and its subpackages,
+ except net.sourceforge.pmd.util.datasource
and net.sourceforge.pmd.util.database
.
+ * GridBagHelper
+ * ColumnDescriptor
+
+
+#### 6.18.0
+
+**Changes to Renderer**
+
+* Each renderer has now a new method Renderer#setUseShortNames
which
+ is used for implementing the "shortnames" CLI option. The method is automatically called by PMD, if this
+ CLI option is in use. When rendering filenames to the report, the new helper method
+ AbstractRenderer#determineFileName
should be used. This will change
+ the filename to a short name, if the CLI option "shortnames" is used.
+
+ Not adjusting custom renderers will make them render always the full file names and not honoring the
+ CLI option "shortnames".
+
+**Deprecated APIs**
+
+**For removal**
+
+* The methods ASTImportDeclaration#getImportedNameNode
and
+ ASTImportDeclaration#getPackage
have been deprecated and
+ will be removed with PMD 7.0.0.
+* The method RuleContext#setSourceCodeFilename
has been deprecated
+ and will be removed. The already existing method RuleContext#setSourceCodeFile
+ should be used instead. The method RuleContext#getSourceCodeFilename
still
+ exists and returns just the filename without the full path.
+* The method AbstractPMDProcessor#filenameFrom
has been
+ deprecated. It was used to determine a "short name" of the file being analyzed, so that the report
+ can use short names. However, this logic has been moved to the renderers.
+* The methods Report#metrics
and Report#hasMetrics
have
+ been deprecated. They were leftovers from a previous deprecation round targeting
+ StatisticalRule
.
+
+**Internal APIs**
+
+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.
+
+* pmd-core
+ * net.sourceforge.pmd.cache
+* pmd-java
+ * net.sourceforge.pmd.lang.java.typeresolution
: Everything, including
+ subpackages, except TypeHelper
and
+ JavaTypeDefinition
.
+ * ASTCompilationUnit#getClassTypeResolver
+
+
+#### 6.17.0
+
+No changes.
+
+#### 6.16.0
+
+**Deprecated APIs**
+
+> Reminder: Please don't use members marked with the annotation InternalApi
, as they will
+> likely be removed, hidden, or otherwise intentionally broken with 7.0.0.
+
+
+**In ASTs**
+
+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 Java AST** (with other languages to come):
+
+* Manual instantiation of nodes. **Constructors of node classes are deprecated** and marked
+ InternalApi
. Nodes should only be obtained from the parser, which for rules, means
+ that never need to instantiate node themselves. Those constructors will be made package private with 7.0.0.
+* **Subclassing of abstract node classes, or usage of their type**. Version 7.0.0 will bring a new set of abstractions
+ that will be public API, but the base classes are and will stay internal. You should not couple your code to them.
+ * In the meantime you should use interfaces like JavaNode
or
+ Node
, or the other published interfaces in this package, to refer to nodes generically.
+ * Concrete node classes will **be made final** with 7.0.0.
+* Setters found in any node class or interface. **Rules should consider the AST immutable**. We will make those
+ setters package private with 7.0.0.
+
+Please look at net.sourceforge.pmd.lang.java.ast
to find out the full list
+of deprecations.
+
+
+#### 6.15.0
+
+**Deprecated APIs**
+
+**For removal**
+
+* The `DumpFacades` in all languages, that could be used to transform a AST into a textual representation,
+ will be removed with PMD 7. The rule designer is a better way to inspect nodes.
+* net.sourceforge.pmd.lang.apex.ast.DumpFacade
+* net.sourceforge.pmd.lang.java.ast.DumpFacade
+* net.sourceforge.pmd.lang.ecmascript.ast.DumpFacade
+* net.sourceforge.pmd.lang.jsp.ast.DumpFacade
+* net.sourceforge.pmd.lang.plsql.ast.DumpFacade
+* net.sourceforge.pmd.lang.vf.ast.DumpFacade
+* net.sourceforge.pmd.lang.vm.ast.AbstractVmNode#dump
+* net.sourceforge.pmd.lang.xml.ast.DumpFacade
+* The method LanguageVersionHandler#getDumpFacade
will be
+ removed as well. It is deprecated, along with all its implementations in the subclasses of LanguageVersionHandler
.
+
+#### 6.14.0
+
+No changes.
+
+#### 6.13.0
+
+**Command Line Interface**
+
+The start scripts `run.sh`, `pmd.bat` and `cpd.bat` support the new environment variable `PMD_JAVA_OPTS`.
+This can be used to set arbitrary JVM options for running PMD, such as memory settings (e.g. `PMD_JAVA_OPTS=-Xmx512m`)
+or enable preview language features (e.g. `PMD_JAVA_OPTS=--enable-preview`).
+
+The previously available variables such as `OPTS` or `HEAPSIZE` are deprecated and will be removed with PMD 7.0.0.
+
+**Deprecated API**
+
+* CodeClimateRule
is deprecated in 7.0.0 because it was unused for 2 years and
+ created an unwanted dependency.
+ Properties "cc_categories", "cc_remediation_points_multiplier", "cc_block_highlighting" will also be removed.
+ See [#1702](https://github.com/pmd/pmd/pull/1702) for more.
+
+* The Apex ruleset `rulesets/apex/ruleset.xml` has been deprecated and will be removed in 7.0.0. Please use the new
+ quickstart ruleset `rulesets/apex/quickstart.xml` instead.
+
+#### 6.12.0
+
+No changes.
+
+#### 6.11.0
+
+* StatisticalRule
and the related helper classes and base rule classes
+ are deprecated for removal in 7.0.0. This includes all of net.sourceforge.pmd.stat
and net.sourceforge.pmd.lang.rule.stat
,
+ and also AbstractStatisticalJavaRule
, AbstractStatisticalApexRule
and the like.
+ The methods Report#addMetric
and metricAdded
+ will also be removed.
+* setProperty
is deprecated,
+ because MultiValuePropertyDescriptor
is deprecated as well.
+
+#### 6.10.0
+
+**Properties framework**
+
+
+
+
+
+The properties framework is about to get a lifting, and for that reason, we need to deprecate a lot of APIs
+to remove them in 7.0.0. The proposed changes to the API are described [on the wiki](https://github.com/pmd/pmd/wiki/Property-framework-7-0-0)
+
+**Changes to how you define properties**
+
+* Construction of property descriptors has been possible through builders since 6.0.0. The 7.0.0 API will only allow
+ construction through builders. The builder hierarchy, currently found in the package net.sourceforge.pmd.properties.builders
,
+ is being replaced by the simpler PropertyBuilder
. Their APIs enjoy a high degree of source compatibility.
+
+* Concrete property classes like IntegerProperty
and StringMultiProperty
will gradually
+ all be deprecated until 7.0.0. Their usages should be replaced by direct usage of the PropertyDescriptor
+ interface, e.g. `PropertyDescriptorPropertyFactory
will become
+ from 7.0.0 on the only provider for property descriptor builders. Each current property type will be replaced
+ by a corresponding method on `PropertyFactory`:
+ * IntegerProperty
is replaced by PropertyFactory#intProperty
+ * IntegerMultiProperty
is replaced by PropertyFactory#intListProperty
+
+ * FloatProperty
and DoubleProperty
are both replaced by PropertyFactory#doubleProperty
.
+ Having a separate property for floats wasn't that useful.
+ * Similarly, FloatMultiProperty
and DoubleMultiProperty
are replaced by PropertyFactory#doubleListProperty
.
+
+ * StringProperty
is replaced by PropertyFactory#stringProperty
+ * StringMultiProperty
is replaced by PropertyFactory#stringListProperty
+
+ * RegexProperty
is replaced by PropertyFactory#regexProperty
+
+ * EnumeratedProperty
is replaced by PropertyFactory#enumProperty
+ * EnumeratedProperty
is replaced by PropertyFactory#enumListProperty
+
+ * BooleanProperty
is replaced by PropertyFactory#booleanProperty
+ * Its multi-valued counterpart, BooleanMultiProperty
, is not replaced, because it doesn't have a use case.
+
+ * CharacterProperty
is replaced by PropertyFactory#charProperty
+ * CharacterMultiProperty
is replaced by PropertyFactory#charListProperty
+
+ * LongProperty
is replaced by PropertyFactory#longIntProperty
+ * LongMultiProperty
is replaced by PropertyFactory#longIntListProperty
+
+ * MethodProperty
, FileProperty
, TypeProperty
and their multi-valued counterparts
+ are discontinued for lack of a use-case, and have no planned replacement in 7.0.0 for now.
+
+
+Here's an example:
+```java
+// Before 7.0.0, these are equivalent:
+IntegerProperty myProperty = new IntegerProperty("score", "Top score value", 1, 100, 40, 3.0f);
+IntegerProperty myProperty = IntegerProperty.named("score").desc("Top score value").range(1, 100).defaultValue(40).uiOrder(3.0f);
+
+// They both map to the following in 7.0.0
+PropertyDescriptorEnumeratedPropertyDescriptor
, NumericPropertyDescriptor
, PackagedPropertyDescriptor
,
+ and the related builders (in net.sourceforge.pmd.properties.builders
) will be removed.
+ These specialized interfaces allowed additional constraints to be enforced on the
+ value of a property, but made the property class hierarchy very large and impractical
+ to maintain. Their functionality will be mapped uniformly to PropertyConstraint
s,
+ which will allow virtually any constraint to be defined, and improve documentation and error reporting. The
+ related methods PropertyTypeId#isPropertyNumeric
and
+ PropertyTypeId#isPropertyPackaged
are also deprecated.
+
+* MultiValuePropertyDescriptor
and SingleValuePropertyDescriptor
+ are deprecated. 7.0.0 will introduce a new XML syntax which will remove the need for such a divide
+ between single- and multi-valued properties. The method PropertyDescriptor#isMultiValue
will be removed
+ accordingly.
+
+**Changes to the PropertyDescriptor interface**
+
+* preferredRowCount
is deprecated with no intended replacement. It was never implemented, and does not belong
+ in this interface. The methods uiOrder
and `compareTo(PropertyDescriptor)` are deprecated for the
+ same reason. These methods mix presentation logic with business logic and are not necessary for PropertyDescriptors to work.
+ `PropertyDescriptor` will not extend `ComparablepropertyErrorFor
is deprecated and will be removed with no intended
+ replacement. It's really just a shortcut for `prop.errorFor(rule.getProperty(prop))`.
+* `T `valueFrom(String)
and `String `asDelimitedString
`(T)` are deprecated and will be removed. These were
+ used to serialize and deserialize properties to/from a string, but 7.0.0 will introduce a more flexible
+ XML syntax which will make them obsolete.
+* isMultiValue
and type
are deprecated and won't be replaced. The new XML syntax will remove the need
+ for a divide between multi- and single-value properties, and will allow arbitrary types to be represented.
+ Since arbitrary types may be represented, `type` will become obsolete as it can't represent generic types,
+ which will nevertheless be representable with the XML syntax. It was only used for documentation, but a
+ new way to document these properties exhaustively will be added with 7.0.0.
+* errorFor
is deprecated as its return type will be changed to `Optionalnet.sourceforge.pmd.lang.ast.xpath
)
+ are now deprecated. They'll be moved to an internal package come 7.0.0. Only Attribute
remains public API.
+
+* The classes PropertyDescriptorField
, PropertyDescriptorBuilderConversionWrapper
, and the methods
+ PropertyDescriptor#attributeValuesById
, PropertyDescriptor#isDefinedExternally
and PropertyTypeId#getFactory
.
+ These were used to read and write properties to and from XML, but were not intended as public API.
+
+* The class ValueParserConstants
and the interface ValueParser
.
+
+* All classes from net.sourceforge.pmd.lang.java.metrics.impl.visitors
are now considered internal API. They're deprecated
+ and will be moved into an internal package with 7.0.0. To implement your own metrics visitors,
+ JavaParserVisitorAdapter
should be directly subclassed.
+
+* LanguageVersionHandler#getDataFlowHandler()
, LanguageVersionHandler#getDFAGraphRule()
+
+* VisitorStarter
+
+**For removal**
+
+* All classes from net.sourceforge.pmd.properties.modules
will be removed.
+
+* The interface Dimensionable
has been deprecated.
+ It gets in the way of a grammar change for 7.0.0 and won't be needed anymore (see [#997](https://github.com/pmd/pmd/issues/997)).
+
+* Several methods from ASTLocalVariableDeclaration
and ASTFieldDeclaration
have
+ also been deprecated:
+
+* ASTFieldDeclaration
won't be a TypeNode
come 7.0.0, so
+ getType
and
+ getTypeDefinition
are deprecated.
+
+* The method `getVariableName` on those two nodes will be removed, too.
+
+* All these are deprecated because those nodes may declare several variables at once, possibly
+ with different types (and obviously with different names). They both implement `Iterator<`ASTVariableId
`>`
+ though, so you should iterate on each declared variable. See [#910](https://github.com/pmd/pmd/issues/910).
+
+* Visitor decorators are now deprecated and will be removed in PMD 7.0.0. They were originally a way to write
+ composable visitors, used in the metrics framework, but they didn't prove cost-effective.
+
+* In net.sourceforge.pmd.lang.java.ast
: JavaParserDecoratedVisitor
, JavaParserControllessVisitor
,
+ JavaParserControllessVisitorAdapter
, and JavaParserVisitorDecorator
are deprecated with no intended replacement.
+
+
+* The LanguageModules of several languages, that only support CPD execution, have been deprecated. These languages
+ are 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 classes have been deprecated and will be removed with PMD 7.0.0:
+
+* CppHandler
+* CppLanguageModule
+* CppParser
+* CsLanguageModule
+* FortranLanguageModule
+* GroovyLanguageModule
+* MatlabHandler
+* MatlabLanguageModule
+* MatlabParser
+* ObjectiveCHandler
+* ObjectiveCLanguageModule
+* ObjectiveCParser
+* PhpLanguageModule
+* PythonHandler
+* PythonLanguageModule
+* PythonParser
+* RubyLanguageModule
+
+
+* Optional AST processing stages like symbol table, type resolution or data-flow analysis will be reified
+ in 7.0.0 to factorise common logic and make them extensible. Further explanations about this change can be
+ found on [#1426](https://github.com/pmd/pmd/pull/1426). Consequently, the following APIs are deprecated for
+ removal:
+ * In Rule
: isDfa()
, isTypeResolution()
, isMultifile()
and their
+ respective setters.
+ * In RuleSet
: usesDFA(Language)
, usesTypeResolution(Language)
, usesMultifile(Language)
+ * In RuleSets
: usesDFA(Language)
, usesTypeResolution(Language)
, usesMultifile(Language)
+ * In LanguageVersionHandler
: getDataFlowFacade()
, getSymbolFacade()
, getSymbolFacade(ClassLoader)
,
+ getTypeResolutionFacade(ClassLoader)
, getQualifiedNameResolutionFacade(ClassLoader)
+
+#### 6.9.0
+
+No changes.
+
+#### 6.8.0
+
+* A couple of methods and fields in net.sourceforge.pmd.properties.AbstractPropertySource
have been
+ deprecated, as they are replaced by already existing functionality or expose internal implementation
+ details: `propertyDescriptors`, `propertyValuesByDescriptor`,
+ `copyPropertyDescriptors()`, `copyPropertyValues()`, `ignoredProperties()`, `usesDefaultValues()`,
+ `useDefaultValueFor()`.
+
+* Some methods in net.sourceforge.pmd.properties.PropertySource
have been deprecated as well:
+ `usesDefaultValues()`, `useDefaultValueFor()`, `ignoredProperties()`.
+
+* The class net.sourceforge.pmd.lang.rule.AbstractDelegateRule
has been deprecated and will
+ be removed with PMD 7.0.0. It is internally only in use by RuleReference.
+
+* The default constructor of net.sourceforge.pmd.lang.rule.RuleReference
has been deprecated
+ and will be removed with PMD 7.0.0. RuleReferences should only be created by providing a Rule and
+ a RuleSetReference. Furthermore, the following methods are deprecated: `setRuleReference()`,
+ `hasOverriddenProperty()`, `usesDefaultValues()`, `useDefaultValueFor()`.
+
+#### 6.7.0
+
+* All classes in the package net.sourceforge.pmd.lang.dfa.report
have been deprecated and will be removed
+ with PMD 7.0.0. This includes the class net.sourceforge.pmd.lang.dfa.report.ReportTree
. The reason is,
+ that this class is very specific to Java and not suitable for other languages. It has only been used for
+ `YAHTMLRenderer`, which has been rewritten to work without these classes.
+
+* The nodes RUNSIGNEDSHIFT and RSIGNEDSHIFT are deprecated and will be removed from the AST with PMD 7.0.0.
+ These represented the operator of ShiftExpression in two cases out of three, but they're not needed and
+ make ShiftExpression inconsistent. The operator of a ShiftExpression is now accessible through
+ ShiftExpression#getOperator.
+
+#### 6.5.0
+
+* The utility class CommentUtil
has been deprecated and will be removed
+ with PMD 7.0.0. Its methods have been intended to parse javadoc tags. A more useful solution will be added
+ around the AST node `FormalComment`, which contains as children `JavadocElement` nodes, which in
+ turn provide access to the `JavadocTag`.
+
+ All comment AST nodes (`FormalComment`, `MultiLineComment`, `SingleLineComment`) have a new method
+ `getFilteredComment()` which provide access to the comment text without the leading `/*` markers.
+
+* The method `AbstractCommentRule.tagsIndicesIn()` has been deprecated and will be removed with
+ PMD 7.0.0. It is not very useful, since it doesn't extract the information
+ in a useful way. You would still need check, which tags have been found, and with which
+ data they might be accompanied.
+
+#### 6.4.0
+
+* The following classes in package net.sourceforge.pmd.benchmark
have been deprecated: Benchmark
, Benchmarker
,
+ BenchmarkReport
, BenchmarkResult
, RuleDuration
, StringBuilderCR
and TextReport
. Their API is not supported anymore
+ and is disconnected from the internals of PMD. Use the newer API based around TimeTracker
instead, which can be found
+ in the same package.
+* The class TypeOfFunction
has been deprecated. Use the newer TypeIsFunction
in the same package.
+* The `typeof` methods in JavaFunctions
have been deprecated.
+ Use the newer `typeIs` method in the same class instead.
+* The methods `isA`, `isEither` and `isNeither` of TypeHelper
.
+ Use the new `isExactlyAny` and `isExactlyNone` methods in the same class instead.
+
+#### 6.2.0
+
+* The static method PMDParameters#transformParametersIntoConfiguration
is now deprecated,
+ for removal in 7.0.0. The new instance method toConfiguration
replaces it.
+
+* The method ASTConstructorDeclaration#getParameters
has been deprecated in favor of the new method
+ getFormalParameters
. This method is available for both
+ ASTConstructorDeclaration
and ASTMethodDeclaration
.
+
+#### 6.1.0
+
+* The method getXPathNodeName
is added to the Node
interface, which removes the
+ use of `toString` of a node to get its XPath element name (see [#569](https://github.com/pmd/pmd/issues/569)).
+ * The default implementation provided in AbstractNode
, will be removed with 7.0.0
+ * With 7.0.0, the `Node.toString` method will not necessarily provide its XPath node
+ name anymore.
+
+* The interface net.sourceforge.pmd.cpd.Renderer
has been deprecated. A new interface
+ CPDRenderer
has been introduced to replace it. The main
+ difference is that the new interface is meant to render directly to a `java.io.Writer`
+ rather than to a String. This allows to greatly reduce the memory footprint of CPD, as on
+ large projects, with many duplications, it was causing `OutOfMemoryError`s (see [#795](https://github.com/pmd/pmd/issues/795)).
+
+ net.sourceforge.pmd.cpd.FileReporter
has also been deprecated as part of this change, as it's no longer needed.
+
+#### 6.0.1
+
+* The constant PMD#VERSION
has been deprecated and will be removed with PMD 7.0.0.
+ Please use PMDVersion#VERSION
instead.
+
+
+## 🐛 Fixed Issues
+
+* miscellaneous
+ * [#881](https://github.com/pmd/pmd/issues/881): \[all] Breaking API changes for 7.0.0
+ * [#896](https://github.com/pmd/pmd/issues/896): \[all] Use slf4j
+ * [#1431](https://github.com/pmd/pmd/pull/1431): \[ui] Remove old GUI applications (designerold, bgastviewer)
+ * [#1451](https://github.com/pmd/pmd/issues/1451): \[core] RulesetFactoryCompatibility stores the whole ruleset file in memory as a string
+ * [#2496](https://github.com/pmd/pmd/issues/2496): Update PMD 7 Logo on landing page
+ * [#2497](https://github.com/pmd/pmd/issues/2497): PMD 7 Logo page
+ * [#2498](https://github.com/pmd/pmd/issues/2498): Update PMD 7 Logo in documentation
+ * [#3797](https://github.com/pmd/pmd/issues/3797): \[all] Use JUnit5
+ * [#4462](https://github.com/pmd/pmd/issues/4462): Provide Software Bill of Materials (SBOM)
+ * [#4460](https://github.com/pmd/pmd/pull/4460): Fix assembly-plugin warnings
+ * [#4582](https://github.com/pmd/pmd/issues/4582): \[dist] Download link broken
+ * [#4586](https://github.com/pmd/pmd/pull/4586): Use explicit encoding in ruleset xml files
+ * [#4642](https://github.com/pmd/pmd/issues/4642): Update regression tests with Java 21 language features
+ * [#4691](https://github.com/pmd/pmd/issues/4691): \[CVEs] Critical and High CEVs reported on PMD and PMD dependencies
+ * [#4699](https://github.com/pmd/pmd/pull/4699): Make PMD buildable with java 21
+ * [#4736](https://github.com/pmd/pmd/issues/4736): \[ci] Improve build procedure
+ * [#4741](https://github.com/pmd/pmd/pull/4741): Add pmd-compat6 module for maven-pmd-plugin
+ * [#4749](https://github.com/pmd/pmd/pull/4749): Fixes NoSuchMethodError on processing errors in pmd-compat6
+ * [#4776](https://github.com/pmd/pmd/issues/4776): \[ci] Upgrade to ruby 3
+ * [#4796](https://github.com/pmd/pmd/pull/4796): Remove deprecated and release rulesets
+ * [#4823](https://github.com/pmd/pmd/pull/4823): Update to use renamed pmd-designer
+ * [#4827](https://github.com/pmd/pmd/pull/4827): \[compat6] Support config errors and cpd for csharp
+ * [#4830](https://github.com/pmd/pmd/issues/4830): Consolidate packages in each maven module
+ * [#4867](https://github.com/pmd/pmd/issues/4867): \[dist] ./mvnw command not found in dist-src
+* ant
+ * [#4080](https://github.com/pmd/pmd/issues/4080): \[ant] Split off Ant integration into a new submodule
+* core
+ * [#880](https://github.com/pmd/pmd/issues/880): \[core] Make visitors generic
+ * [#1027](https://github.com/pmd/pmd/issues/1027): \[core] Apply the new PropertyDescriptor<Pattern> type where applicable
+ * [#1204](https://github.com/pmd/pmd/issues/1204): \[core] Allow numeric properties in XML to be within an unbounded range
+ * [#1622](https://github.com/pmd/pmd/pull/1622): \[core] NodeStream API
+ * [#1687](https://github.com/pmd/pmd/issues/1687): \[core] Deprecate and Remove XPath 1.0 support
+ * [#1785](https://github.com/pmd/pmd/issues/1785): \[core] Allow abstract node types to be valid rulechain visits
+ * [#1825](https://github.com/pmd/pmd/pull/1825): \[core] Support NoAttribute for XPath
+ * [#2038](https://github.com/pmd/pmd/issues/2038): \[core] Remove DCD
+ * [#2218](https://github.com/pmd/pmd/issues/2218): \[core] `isFindBoundary` should not be an attribute
+ * [#2234](https://github.com/pmd/pmd/issues/2234): \[core] Consolidate PMD CLI into a single command
+ * [#2239](https://github.com/pmd/pmd/issues/2239): \[core] Merging Javacc build scripts
+ * [#2500](https://github.com/pmd/pmd/issues/2500): \[core] Clarify API for ANTLR based languages
+ * [#2518](https://github.com/pmd/pmd/issues/2518): \[core] Language properties
+ * [#2602](https://github.com/pmd/pmd/issues/2602): \[core] Remove ParserOptions
+ * [#2614](https://github.com/pmd/pmd/pull/2614): \[core] Upgrade Saxon, add XPath 3.1, remove Jaxen
+ * [#2696](https://github.com/pmd/pmd/pull/2696): \[core] Remove DFA
+ * [#2821](https://github.com/pmd/pmd/issues/2821): \[core] Rule processing error filenames are missing paths
+ * [#2873](https://github.com/pmd/pmd/issues/2873): \[core] Utility classes in pmd 7
+ * [#2885](https://github.com/pmd/pmd/issues/2885): \[core] Error recovery mode
+ * [#3203](https://github.com/pmd/pmd/issues/3203): \[core] Replace RuleViolationFactory implementations with ViolationDecorator
+ * [#3692](https://github.com/pmd/pmd/pull/3692): \[core] Analysis listeners
+ * [#3782](https://github.com/pmd/pmd/issues/3782): \[core] Language lifecycle
+ * [#3815](https://github.com/pmd/pmd/issues/3815): \[core] Update Saxon HE to 10.7
+ * [#3893](https://github.com/pmd/pmd/pull/3893): \[core] Text documents
+ * [#3902](https://github.com/pmd/pmd/issues/3902): \[core] Violation decorators
+ * [#3903](https://github.com/pmd/pmd/issues/3903): \[core] Consolidate `n.s.pmd.reporting` package
+ * [#3905](https://github.com/pmd/pmd/issues/3905): \[core] Stabilize tree export API
+ * [#3917](https://github.com/pmd/pmd/issues/3917): \[core] Consolidate `n.s.pmd.lang.rule` package
+ * [#3918](https://github.com/pmd/pmd/issues/3918): \[core] Make LanguageRegistry non static
+ * [#3919](https://github.com/pmd/pmd/issues/3919): \[core] Merge CPD and PMD language
+ * [#3922](https://github.com/pmd/pmd/pull/3922): \[core] Better error reporting for the ruleset parser
+ * [#4035](https://github.com/pmd/pmd/issues/4035): \[core] ConcurrentModificationException in DefaultRuleViolationFactory
+ * [#4065](https://github.com/pmd/pmd/issues/4065): \[core] Rename TokenMgrError to LexException, Tokenizer to CpdLexer
+ * [#4120](https://github.com/pmd/pmd/issues/4120): \[core] Explicitly name all language versions
+ * [#4204](https://github.com/pmd/pmd/issues/4204): \[core] Provide a CpdAnalysis class as a programmatic entry point into CPD
+ * [#4301](https://github.com/pmd/pmd/issues/4301): \[core] Remove deprecated property concrete classes
+ * [#4302](https://github.com/pmd/pmd/issues/4302): \[core] Migrate Property Framework API to Java 8
+ * [#4309](https://github.com/pmd/pmd/issues/4309): \[core] Cleanups in XPath area
+ * [#4312](https://github.com/pmd/pmd/issues/4312): \[core] Remove unnecessary property `color` and system property `pmd.color` in `TextColorRenderer`
+ * [#4313](https://github.com/pmd/pmd/issues/4313): \[core] Remove support for <lang>-<ruleset> hyphen notation for ruleset references
+ * [#4314](https://github.com/pmd/pmd/issues/4314): \[core] Remove ruleset compatibility filter (RuleSetFactoryCompatibility) and CLI option `--no-ruleset-compatibility`
+ * [#4323](https://github.com/pmd/pmd/issues/4323): \[core] Refactor CPD integration
+ * [#4348](https://github.com/pmd/pmd/issues/4348): \[core] Consolidate @InternalApi classes
+ * [#4349](https://github.com/pmd/pmd/issues/4349): \[core] Cleanup remaining experimental and deprecated API
+ * [#4353](https://github.com/pmd/pmd/pull/4353): \[core] Micro optimizations for Node API
+ * [#4365](https://github.com/pmd/pmd/pull/4365): \[core] Improve benchmarking
+ * [#4397](https://github.com/pmd/pmd/pull/4397): \[core] Refactor CPD
+ * [#4378](https://github.com/pmd/pmd/issues/4378): \[core] Ruleset loading processes commented rules
+ * [#4420](https://github.com/pmd/pmd/pull/4420): \[core] Remove PMD.EOL
+ * [#4425](https://github.com/pmd/pmd/pull/4425): \[core] Replace TextFile::pathId
+ * [#4454](https://github.com/pmd/pmd/issues/4454): \[core] "Unknown option: '-min'" but is referenced in documentation
+ * [#4611](https://github.com/pmd/pmd/pull/4611): \[core] Fix loading language properties from env vars
+ * [#4621](https://github.com/pmd/pmd/issues/4621): \[core] Make `ClasspathClassLoader::getResource` child first
+ * [#4674](https://github.com/pmd/pmd/issues/4674): \[core] WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass
+ * [#4694](https://github.com/pmd/pmd/pull/4694): \[core] Fix line/col numbers in TokenMgrError
+ * [#4717](https://github.com/pmd/pmd/issues/4717): \[core] XSLTRenderer doesn't close report file
+ * [#4750](https://github.com/pmd/pmd/pull/4750): \[core] Fix flaky SummaryHTMLRenderer
+ * [#4782](https://github.com/pmd/pmd/pull/4782): \[core] Avoid using getImage/@Image
+* cli
+ * [#2234](https://github.com/pmd/pmd/issues/2234): \[core] Consolidate PMD CLI into a single command
+ * [#3828](https://github.com/pmd/pmd/issues/3828): \[core] Progress reporting
+ * [#4079](https://github.com/pmd/pmd/issues/4079): \[cli] Split off CLI implementation into a pmd-cli submodule
+ * [#4423](https://github.com/pmd/pmd/pull/4423): \[cli] Fix NPE when only `--file-list` is specified
+ * [#4482](https://github.com/pmd/pmd/issues/4482): \[cli] pmd.bat can only be executed once
+ * [#4484](https://github.com/pmd/pmd/issues/4484): \[cli] ast-dump with no properties produce an NPE
+ * [#4594](https://github.com/pmd/pmd/pull/4594): \[cli] Change completion generation to runtime
+ * [#4685](https://github.com/pmd/pmd/pull/4685): \[cli] Clarify CPD documentation, fix positional parameter handling
+ * [#4723](https://github.com/pmd/pmd/issues/4723): \[cli] Launch fails for "bash pmd"
+* doc
+ * [#995](https://github.com/pmd/pmd/issues/995): \[doc] Document API evolution principles as ADR
+ * [#2501](https://github.com/pmd/pmd/issues/2501): \[doc] Verify ANTLR Documentation
+ * [#2511](https://github.com/pmd/pmd/issues/2511): \[doc] Review guides for writing java/xpath rules for correctness with PMD 7
+ * [#3175](https://github.com/pmd/pmd/issues/3175): \[doc] Document language module features
+ * [#4294](https://github.com/pmd/pmd/issues/4294): \[doc] Migration Guide for upgrading PMD 6 ➡️ 7
+ * [#4303](https://github.com/pmd/pmd/issues/4303): \[doc] Document new property framework
+ * [#4308](https://github.com/pmd/pmd/issues/4308): \[doc] Document XPath API @DeprecatedAttribute
+ * [#4319](https://github.com/pmd/pmd/issues/4319): \[doc] Document TypeRes API and Symbols API
+ * [#4438](https://github.com/pmd/pmd/issues/4438): \[doc] Documentation links in VS Code are outdated
+ * [#4521](https://github.com/pmd/pmd/issues/4521): \[doc] Website is not mobile friendly
+ * [#4676](https://github.com/pmd/pmd/issues/4676): \[doc] Clarify how CPD `--ignore-literals` and `--ignore-identifiers` work
+ * [#4659](https://github.com/pmd/pmd/pull/4659): \[doc] Improve ant documentation
+ * [#4669](https://github.com/pmd/pmd/pull/4669): \[doc] Add bld PMD Extension to Tools / Integrations
+ * [#4704](https://github.com/pmd/pmd/issues/4704): \[doc] Multivalued properties do not accept \| as a separator
+* testing
+ * [#2435](https://github.com/pmd/pmd/issues/2435): \[test] Remove duplicated Dummy language module
+ * [#4234](https://github.com/pmd/pmd/issues/4234): \[test] Tests that change the logging level do not work
+
+Language specific fixes:
+
+* apex
+ * [#1937](https://github.com/pmd/pmd/issues/1937): \[apex] Apex should only have a single RootNode
+ * [#1648](https://github.com/pmd/pmd/issues/1648): \[apex,vf] Remove CodeClimate dependency
+ * [#1750](https://github.com/pmd/pmd/pull/1750): \[apex] Remove apex statistical rules
+ * [#2836](https://github.com/pmd/pmd/pull/2836): \[apex] Remove Apex ProjectMirror
+ * [#3766](https://github.com/pmd/pmd/issues/3766): \[apex] Replace Jorje with fully open source front-end
+ * [#3973](https://github.com/pmd/pmd/issues/3973): \[apex] Update parser to support new 'as user' keywords (User Mode for Database Operations)
+ * [#4427](https://github.com/pmd/pmd/issues/4427): \[apex] ApexBadCrypto test failing to detect inline code
+ * [#4453](https://github.com/pmd/pmd/issues/4453): \[apex] \[7.0-rc1] Exception while initializing Apexlink (Index 34812 out of bounds for length 34812)
+ * [#4828](https://github.com/pmd/pmd/issues/4828): \[apex] Support null coalescing operator ?? (apex 60)
+ * [#4845](https://github.com/pmd/pmd/issues/4845): \[apex] Use same ANLTR version for apex-parser
+* apex-design
+ * [#2667](https://github.com/pmd/pmd/issues/2667): \[apex] Integrate nawforce/ApexLink to build robust Unused rule
+ * [#4509](https://github.com/pmd/pmd/issues/4509): \[apex] ExcessivePublicCount doesn't consider inner classes correctly
+ * [#4596](https://github.com/pmd/pmd/issues/4596): \[apex] ExcessivePublicCount ignores properties
+* apex-documentation
+ * [#4774](https://github.com/pmd/pmd/issues/4774): \[apex] ApexDoc false-positive for the first method of an annotated Apex class
+* apex-performance
+ * [#4675](https://github.com/pmd/pmd/issues/4675): \[apex] New Rule: OperationWithHighCostInLoop
+* apex-security
+ * [#4646](https://github.com/pmd/pmd/issues/4646): \[apex] ApexSOQLInjection does not recognise SObjectType or SObjectField as safe variable types
+* groovy
+ * [#4726](https://github.com/pmd/pmd/pull/4726): \[groovy] Support Groovy to 3 and 4 and CPD suppressions
+* java
+ * [#520](https://github.com/pmd/pmd/issues/520): \[java] Allow `@SuppressWarnings` with constants instead of literals
+ * [#864](https://github.com/pmd/pmd/issues/864): \[java] Similar/duplicated implementations for determining FQCN
+ * [#905](https://github.com/pmd/pmd/issues/905): \[java] Add new node for anonymous class declaration
+ * [#910](https://github.com/pmd/pmd/issues/910): \[java] AST inconsistency between primitive and reference type arrays
+ * [#997](https://github.com/pmd/pmd/issues/997): \[java] Java8 parsing corner case with annotated array types
+ * [#998](https://github.com/pmd/pmd/issues/998): \[java] AST inconsistencies around FormalParameter
+ * [#1019](https://github.com/pmd/pmd/issues/1019): \[java] Breaking Java Grammar changes for PMD 7.0.0
+ * [#1124](https://github.com/pmd/pmd/issues/1124): \[java] ImmutableList implementation in the qname codebase
+ * [#1128](https://github.com/pmd/pmd/issues/1128): \[java] Improve ASTLocalVariableDeclaration
+ * [#1150](https://github.com/pmd/pmd/issues/1150): \[java] ClassOrInterfaceType AST improvements
+ * [#1207](https://github.com/pmd/pmd/issues/1207): \[java] Resolve explicit types using FQCNs, without hitting the classloader
+ * [#1307](https://github.com/pmd/pmd/issues/1307): \[java] AccessNode API changes
+ * [#1367](https://github.com/pmd/pmd/issues/1367): \[java] Parsing error on annotated inner class
+ * [#1661](https://github.com/pmd/pmd/issues/1661): \[java] About operator nodes
+ * [#2366](https://github.com/pmd/pmd/pull/2366): \[java] Remove qualified names
+ * [#2819](https://github.com/pmd/pmd/issues/2819): \[java] GLB bugs in pmd 7
+ * [#3642](https://github.com/pmd/pmd/issues/3642): \[java] Parse error on rare extra dimensions on method return type on annotation methods
+ * [#3763](https://github.com/pmd/pmd/issues/3763): \[java] Ambiguous reference error in valid code
+ * [#3749](https://github.com/pmd/pmd/issues/3749): \[java] Improve `isOverridden` in ASTMethodDeclaration
+ * [#3750](https://github.com/pmd/pmd/issues/3750): \[java] Make symbol table support instanceof pattern bindings
+ * [#3751](https://github.com/pmd/pmd/issues/3751): \[java] Rename some node types
+ * [#3752](https://github.com/pmd/pmd/issues/3752): \[java] Expose annotations in symbol API
+ * [#4237](https://github.com/pmd/pmd/pull/4237): \[java] Cleanup handling of Java comments
+ * [#4317](https://github.com/pmd/pmd/issues/4317): \[java] Some AST nodes should not be TypeNodes
+ * [#4359](https://github.com/pmd/pmd/issues/4359): \[java] Type resolution fails with NPE when the scope is not a type declaration
+ * [#4367](https://github.com/pmd/pmd/issues/4367): \[java] Move testrule TypeResTest into internal
+ * [#4383](https://github.com/pmd/pmd/issues/4383): \[java] IllegalStateException: Object is not an array type!
+ * [#4401](https://github.com/pmd/pmd/issues/4401): \[java] PMD 7 fails to build under Java 19
+ * [#4405](https://github.com/pmd/pmd/issues/4405): \[java] Processing error with ArrayIndexOutOfBoundsException
+ * [#4583](https://github.com/pmd/pmd/issues/4583): \[java] Support JDK 21 (LTS)
+ * [#4628](https://github.com/pmd/pmd/pull/4628): \[java] Support loading classes from java runtime images
+ * [#4753](https://github.com/pmd/pmd/issues/4753): \[java] PMD crashes while using generics and wildcards
+ * [#4757](https://github.com/pmd/pmd/issues/4757): \[java] Intermittent NPEs while analyzing Java code
+ * [#4794](https://github.com/pmd/pmd/issues/4794): \[java] Support JDK 22
+* java-bestpractices
+ * [#342](https://github.com/pmd/pmd/issues/342): \[java] AccessorMethodGeneration: Name clash with another public field not properly handled
+ * [#755](https://github.com/pmd/pmd/issues/755): \[java] AccessorClassGeneration false positive for private constructors
+ * [#770](https://github.com/pmd/pmd/issues/770): \[java] UnusedPrivateMethod yields false positive for counter-variant arguments
+ * [#807](https://github.com/pmd/pmd/issues/807): \[java] AccessorMethodGeneration false positive with overloads
+ * [#833](https://github.com/pmd/pmd/issues/833): \[java] ForLoopCanBeForeach should consider iterating on this
+ * [#1189](https://github.com/pmd/pmd/issues/1189): \[java] UnusedPrivateMethod false positive from inner class via external class
+ * [#1205](https://github.com/pmd/pmd/issues/1205): \[java] Improve ConstantsInInterface message to mention alternatives
+ * [#1212](https://github.com/pmd/pmd/issues/1212): \[java] Don't raise JUnitTestContainsTooManyAsserts on JUnit 5's assertAll
+ * [#1422](https://github.com/pmd/pmd/issues/1422): \[java] JUnitTestsShouldIncludeAssert false positive with inherited @Rule field
+ * [#1455](https://github.com/pmd/pmd/issues/1455): \[java] JUnitTestsShouldIncludeAssert: False positives for assert methods named "check" and "verify"
+ * [#1563](https://github.com/pmd/pmd/issues/1563): \[java] ForLoopCanBeForeach false positive with method call using index variable
+ * [#1565](https://github.com/pmd/pmd/issues/1565): \[java] JUnitAssertionsShouldIncludeMessage false positive with AssertJ
+ * [#1747](https://github.com/pmd/pmd/issues/1747): \[java] PreserveStackTrace false-positive
+ * [#1969](https://github.com/pmd/pmd/issues/1969): \[java] MissingOverride false-positive triggered by package-private method overwritten in another package by extending class
+ * [#1998](https://github.com/pmd/pmd/issues/1998): \[java] AccessorClassGeneration false-negative: subclass calls private constructor
+ * [#2130](https://github.com/pmd/pmd/issues/2130): \[java] UnusedLocalVariable: false-negative with array
+ * [#2147](https://github.com/pmd/pmd/issues/2147): \[java] JUnitTestsShouldIncludeAssert - false positives with lambdas and static methods
+ * [#2464](https://github.com/pmd/pmd/issues/2464): \[java] LooseCoupling must ignore class literals: ArrayList.class
+ * [#2542](https://github.com/pmd/pmd/issues/2542): \[java] UseCollectionIsEmpty can not detect the case `foo.bar().size()`
+ * [#2650](https://github.com/pmd/pmd/issues/2650): \[java] UseTryWithResources false positive when AutoCloseable helper used
+ * [#2796](https://github.com/pmd/pmd/issues/2796): \[java] UnusedAssignment false positive with call chains
+ * [#2797](https://github.com/pmd/pmd/issues/2797): \[java] MissingOverride long-standing issues
+ * [#2806](https://github.com/pmd/pmd/issues/2806): \[java] SwitchStmtsShouldHaveDefault false-positive with Java 14 switch non-fallthrough branches
+ * [#2822](https://github.com/pmd/pmd/issues/2822): \[java] LooseCoupling rule: Extend to cover user defined implementations and interfaces
+ * [#2843](https://github.com/pmd/pmd/pull/2843): \[java] Fix UnusedAssignment FP with field accesses
+ * [#2882](https://github.com/pmd/pmd/issues/2882): \[java] UseTryWithResources - false negative for explicit close
+ * [#2883](https://github.com/pmd/pmd/issues/2883): \[java] JUnitAssertionsShouldIncludeMessage false positive with method call
+ * [#2890](https://github.com/pmd/pmd/issues/2890): \[java] UnusedPrivateMethod false positive with generics
+ * [#2946](https://github.com/pmd/pmd/issues/2946): \[java] SwitchStmtsShouldHaveDefault false positive on enum inside enums
+ * [#3672](https://github.com/pmd/pmd/pull/3672): \[java] LooseCoupling - fix false positive with generics
+ * [#3675](https://github.com/pmd/pmd/pull/3675): \[java] MissingOverride - fix false positive with mixing type vars
+ * [#3858](https://github.com/pmd/pmd/issues/3858): \[java] UseCollectionIsEmpty should infer local variable type from method invocation
+ * [#4433](https://github.com/pmd/pmd/issues/4433): \[java] \[7.0-rc1] ReplaceHashtableWithMap on java.util.Properties
+ * [#4492](https://github.com/pmd/pmd/issues/4492): \[java] GuardLogStatement gives false positive when argument is a Java method reference
+ * [#4503](https://github.com/pmd/pmd/issues/4503): \[java] JUnitTestsShouldIncludeAssert: false negative with TestNG
+ * [#4516](https://github.com/pmd/pmd/issues/4516): \[java] UnusedLocalVariable: false-negative with try-with-resources
+ * [#4517](https://github.com/pmd/pmd/issues/4517): \[java] UnusedLocalVariable: false-negative with compound assignments
+ * [#4518](https://github.com/pmd/pmd/issues/4518): \[java] UnusedLocalVariable: false-positive with multiple for-loop indices
+ * [#4603](https://github.com/pmd/pmd/issues/4603): \[java] UnusedAssignment false positive in record compact constructor
+ * [#4625](https://github.com/pmd/pmd/issues/4625): \[java] UnusedPrivateMethod false positive: Autoboxing into Number
+ * [#4634](https://github.com/pmd/pmd/issues/4634): \[java] JUnit4TestShouldUseTestAnnotation false positive with TestNG
+ * [#4817](https://github.com/pmd/pmd/issues/4817): \[java] UnusedPrivateMethod false-positive used in lambda
+* java-codestyle
+ * [#1208](https://github.com/pmd/pmd/issues/1208): \[java] PrematureDeclaration rule false-positive on variable declared to measure time
+ * [#1429](https://github.com/pmd/pmd/issues/1429): \[java] PrematureDeclaration as result of method call (false positive)
+ * [#1480](https://github.com/pmd/pmd/issues/1480): \[java] IdenticalCatchBranches false positive with return expressions
+ * [#1673](https://github.com/pmd/pmd/issues/1673): \[java] UselessParentheses false positive with conditional operator
+ * [#1790](https://github.com/pmd/pmd/issues/1790): \[java] UnnecessaryFullyQualifiedName false positive with enum constant
+ * [#1918](https://github.com/pmd/pmd/issues/1918): \[java] UselessParentheses false positive with boolean operators
+ * [#2134](https://github.com/pmd/pmd/issues/2134): \[java] PreserveStackTrace not handling `Throwable.addSuppressed(...)`
+ * [#2299](https://github.com/pmd/pmd/issues/2299): \[java] UnnecessaryFullyQualifiedName false positive with similar package name
+ * [#2391](https://github.com/pmd/pmd/issues/2391): \[java] UseDiamondOperator FP when expected type and constructed type have a different parameterization
+ * [#2528](https://github.com/pmd/pmd/issues/2528): \[java] MethodNamingConventions - JUnit 5 method naming not support ParameterizedTest
+ * [#2739](https://github.com/pmd/pmd/issues/2739): \[java] UselessParentheses false positive for string concatenation
+ * [#2748](https://github.com/pmd/pmd/issues/2748): \[java] UnnecessaryCast false positive with unchecked cast
+ * [#2847](https://github.com/pmd/pmd/issues/2847): \[java] New Rule: Use Explicit Types
+ * [#2973](https://github.com/pmd/pmd/issues/2973): \[java] New rule: UnnecessaryBoxing
+ * [#3195](https://github.com/pmd/pmd/pull/3195): \[java] Improve rule UnnecessaryReturn to detect more cases
+ * [#3218](https://github.com/pmd/pmd/pull/3218): \[java] Generalize UnnecessaryCast to flag all unnecessary casts
+ * [#3221](https://github.com/pmd/pmd/issues/3221): \[java] PrematureDeclaration false positive for unused variables
+ * [#3238](https://github.com/pmd/pmd/issues/3238): \[java] Improve ExprContext, fix FNs of UnnecessaryCast
+ * [#3500](https://github.com/pmd/pmd/pull/3500): \[java] UnnecessaryBoxing - check for Integer.valueOf(String) calls
+ * [#4239](https://github.com/pmd/pmd/issues/4239): \[java] UnnecessaryLocalBeforeReturn - false positive with catch clause
+ * [#4268](https://github.com/pmd/pmd/issues/4268): \[java] CommentDefaultAccessModifier: false positive with TestNG annotations
+ * [#4273](https://github.com/pmd/pmd/issues/4273): \[java] CommentDefaultAccessModifier ignoredAnnotations should include "org.junit.jupiter.api.extension.RegisterExtension" by default
+ * [#4357](https://github.com/pmd/pmd/pull/4357): \[java] Fix IllegalStateException in UseDiamondOperator rule
+ * [#4432](https://github.com/pmd/pmd/issues/4432): \[java] \[7.0-rc1] UnnecessaryImport - Unused static import is being used
+ * [#4455](https://github.com/pmd/pmd/issues/4455): \[java] FieldNamingConventions: false positive with lombok's @UtilityClass
+ * [#4487](https://github.com/pmd/pmd/issues/4487): \[java] UnnecessaryConstructor: false-positive with @Inject and @Autowired
+ * [#4511](https://github.com/pmd/pmd/issues/4511): \[java] LocalVariableCouldBeFinal shouldn't report unused variables
+ * [#4512](https://github.com/pmd/pmd/issues/4512): \[java] MethodArgumentCouldBeFinal shouldn't report unused parameters
+ * [#4557](https://github.com/pmd/pmd/issues/4557): \[java] UnnecessaryImport FP with static imports of overloaded methods
+ * [#4578](https://github.com/pmd/pmd/issues/4578): \[java] CommentDefaultAccessModifier comment needs to be before annotation if present
+ * [#4631](https://github.com/pmd/pmd/issues/4631): \[java] UnnecessaryFullyQualifiedName fails to recognize illegal self reference in enums
+ * [#4645](https://github.com/pmd/pmd/issues/4645): \[java] CommentDefaultAccessModifier - False Positive with JUnit5's ParameterizedTest
+ * [#4754](https://github.com/pmd/pmd/pull/4754): \[java] EmptyControlStatementRule: Add allowCommentedBlocks property
+ * [#4816](https://github.com/pmd/pmd/issues/4816): \[java] UnnecessaryImport false-positive on generic method call with on lambda
+* java-design
+ * [#174](https://github.com/pmd/pmd/issues/174): \[java] SingularField false positive with switch in method that both assigns and reads field
+ * [#1014](https://github.com/pmd/pmd/issues/1014): \[java] LawOfDemeter: False positive with lambda expression
+ * [#1605](https://github.com/pmd/pmd/issues/1605): \[java] LawOfDemeter: False positive for standard UTF-8 charset name
+ * [#2160](https://github.com/pmd/pmd/issues/2160): \[java] Issues with Law of Demeter
+ * [#2175](https://github.com/pmd/pmd/issues/2175): \[java] LawOfDemeter: False positive for chained methods with generic method call
+ * [#2179](https://github.com/pmd/pmd/issues/2179): \[java] LawOfDemeter: False positive with static property access - should treat class-level property as global object, not dot-accessed property
+ * [#2180](https://github.com/pmd/pmd/issues/2180): \[java] LawOfDemeter: False positive with Thread and ThreadLocalRandom
+ * [#2182](https://github.com/pmd/pmd/issues/2182): \[java] LawOfDemeter: False positive with package-private access
+ * [#2188](https://github.com/pmd/pmd/issues/2188): \[java] LawOfDemeter: False positive with fields assigned to local vars
+ * [#2536](https://github.com/pmd/pmd/issues/2536): \[java] ClassWithOnlyPrivateConstructorsShouldBeFinal can't detect inner class
+ * [#3668](https://github.com/pmd/pmd/pull/3668): \[java] ClassWithOnlyPrivateConstructorsShouldBeFinal - fix FP with inner private classes
+ * [#3754](https://github.com/pmd/pmd/issues/3754): \[java] SingularField false positive with read in while condition
+ * [#3786](https://github.com/pmd/pmd/issues/3786): \[java] SimplifyBooleanReturns should consider operator precedence
+ * [#3840](https://github.com/pmd/pmd/issues/3840): \[java] LawOfDemeter disallows method call on locally created object
+ * [#4238](https://github.com/pmd/pmd/pull/4238): \[java] Make LawOfDemeter not use the rulechain
+ * [#4254](https://github.com/pmd/pmd/issues/4254): \[java] ImmutableField - false positive with Lombok @Setter
+ * [#4434](https://github.com/pmd/pmd/issues/4434): \[java] \[7.0-rc1] ExceptionAsFlowControl when simply propagating
+ * [#4456](https://github.com/pmd/pmd/issues/4456): \[java] FinalFieldCouldBeStatic: false positive with lombok's @UtilityClass
+ * [#4477](https://github.com/pmd/pmd/issues/4477): \[java] SignatureDeclareThrowsException: false-positive with TestNG annotations
+ * [#4490](https://github.com/pmd/pmd/issues/4490): \[java] ImmutableField - false negative with Lombok @Getter
+ * [#4549](https://github.com/pmd/pmd/pull/4549): \[java] Make LawOfDemeter results deterministic
+* java-documentation
+ * [#4369](https://github.com/pmd/pmd/pull/4369): \[java] Improve CommentSize
+ * [#4416](https://github.com/pmd/pmd/pull/4416): \[java] Fix reported line number in CommentContentRule
+* java-errorprone
+ * [#659](https://github.com/pmd/pmd/issues/659): \[java] MissingBreakInSwitch - last default case does not contain a break
+ * [#718](https://github.com/pmd/pmd/issues/718): \[java] BrokenNullCheck false positive with parameter/field confusion
+ * [#932](https://github.com/pmd/pmd/issues/932): \[java] SingletonClassReturningNewInstance false positive with double assignment
+ * [#1005](https://github.com/pmd/pmd/issues/1005): \[java] CloneMethodMustImplementCloneable triggers for interfaces
+ * [#1669](https://github.com/pmd/pmd/issues/1669): \[java] NullAssignment - FP with ternay and null as constructor argument
+ * [#1831](https://github.com/pmd/pmd/issues/1831): \[java] DetachedTestCase reports abstract methods
+ * [#1899](https://github.com/pmd/pmd/issues/1899): \[java] Recognize @SuppressWanings("fallthrough") for MissingBreakInSwitch
+ * [#2320](https://github.com/pmd/pmd/issues/2320): \[java] NullAssignment - FP with ternary and null as method argument
+ * [#2532](https://github.com/pmd/pmd/issues/2532): \[java] AvoidDecimalLiteralsInBigDecimalConstructor can not detect the case `new BigDecimal(Expression)`
+ * [#2579](https://github.com/pmd/pmd/issues/2579): \[java] MissingBreakInSwitch detects the lack of break in the last case
+ * [#2880](https://github.com/pmd/pmd/issues/2880): \[java] CompareObjectsWithEquals - false negative with type res
+ * [#2893](https://github.com/pmd/pmd/issues/2893): \[java] Remove special cases from rule EmptyCatchBlock
+ * [#2894](https://github.com/pmd/pmd/issues/2894): \[java] Improve MissingBreakInSwitch
+ * [#3071](https://github.com/pmd/pmd/issues/3071): \[java] BrokenNullCheck FP with PMD 6.30.0
+ * [#3087](https://github.com/pmd/pmd/issues/3087): \[java] UnnecessaryBooleanAssertion overlaps with SimplifiableTestAssertion
+ * [#3100](https://github.com/pmd/pmd/issues/3100): \[java] UseCorrectExceptionLogging FP in 6.31.0
+ * [#3173](https://github.com/pmd/pmd/issues/3173): \[java] UseProperClassLoader false positive
+ * [#3351](https://github.com/pmd/pmd/issues/3351): \[java] ConstructorCallsOverridableMethod ignores abstract methods
+ * [#3400](https://github.com/pmd/pmd/issues/3400): \[java] AvoidUsingOctalValues FN with underscores
+ * [#3843](https://github.com/pmd/pmd/issues/3843): \[java] UseEqualsToCompareStrings should consider return type
+ * [#4063](https://github.com/pmd/pmd/issues/4063): \[java] AvoidBranchingStatementAsLastInLoop: False-negative about try/finally block
+ * [#4356](https://github.com/pmd/pmd/pull/4356): \[java] Fix NPE in CloseResourceRule
+ * [#4449](https://github.com/pmd/pmd/issues/4449): \[java] AvoidAccessibilityAlteration: Possible false positive in AvoidAccessibilityAlteration rule when using Lambda expression
+ * [#4457](https://github.com/pmd/pmd/issues/4457): \[java] OverrideBothEqualsAndHashcode: false negative with anonymous classes
+ * [#4493](https://github.com/pmd/pmd/issues/4493): \[java] MissingStaticMethodInNonInstantiatableClass: false-positive about @Inject
+ * [#4505](https://github.com/pmd/pmd/issues/4505): \[java] ImplicitSwitchFallThrough NPE in PMD 7.0.0-rc1
+ * [#4510](https://github.com/pmd/pmd/issues/4510): \[java] ConstructorCallsOverridableMethod: false positive with lombok's @Value
+ * [#4513](https://github.com/pmd/pmd/issues/4513): \[java] UselessOperationOnImmutable various false negatives with String
+ * [#4514](https://github.com/pmd/pmd/issues/4514): \[java] AvoidLiteralsInIfCondition false positive and negative for String literals when ignoreExpressions=true
+ * [#4546](https://github.com/pmd/pmd/issues/4546): \[java] OverrideBothEqualsAndHashCode ignores records
+ * [#4719](https://github.com/pmd/pmd/pull/4719): \[java] UnnecessaryCaseChange: example doc toUpperCase() should compare to a capitalized string
+* java-multithreading
+ * [#2537](https://github.com/pmd/pmd/issues/2537): \[java] DontCallThreadRun can't detect the case that call run() in `this.run()`
+ * [#2538](https://github.com/pmd/pmd/issues/2538): \[java] DontCallThreadRun can't detect the case that call run() in `foo.bar.run()`
+ * [#2577](https://github.com/pmd/pmd/issues/2577): \[java] UseNotifyAllInsteadOfNotify falsely detect a special case with argument: `foo.notify(bar)`
+ * [#4483](https://github.com/pmd/pmd/issues/4483): \[java] NonThreadSafeSingleton false positive with double-checked locking
+* java-performance
+ * [#1224](https://github.com/pmd/pmd/issues/1224): \[java] InefficientEmptyStringCheck false negative in anonymous class
+ * [#2587](https://github.com/pmd/pmd/issues/2587): \[java] AvoidArrayLoops could also check for list copy through iterated List.add()
+ * [#2712](https://github.com/pmd/pmd/issues/2712): \[java] SimplifyStartsWith false-positive with AssertJ
+ * [#3486](https://github.com/pmd/pmd/pull/3486): \[java] InsufficientStringBufferDeclaration: Fix NPE
+ * [#3848](https://github.com/pmd/pmd/issues/3848): \[java] StringInstantiation: false negative when using method result
+ * [#4070](https://github.com/pmd/pmd/issues/4070): \[java] A false positive about the rule RedundantFieldInitializer
+ * [#4458](https://github.com/pmd/pmd/issues/4458): \[java] RedundantFieldInitializer: false positive with lombok's @Value
+* javascript
+ * [#4673](https://github.com/pmd/pmd/pull/4673): \[javascript] CPD: Added support for decorator notation
+* kotlin
+ * [#419](https://github.com/pmd/pmd/issues/419): \[kotlin] Add support for Kotlin
+ * [#4389](https://github.com/pmd/pmd/pull/4389): \[kotlin] Update grammar to version 1.8
+* plsql
+ * [#4820](https://github.com/pmd/pmd/issues/4820): \[plsql] WITH clause is ignored for SELECT INTO statements
+* swift
+ * [#1877](https://github.com/pmd/pmd/pull/1877): \[swift] Feature/swift rules
+ * [#1882](https://github.com/pmd/pmd/pull/1882): \[swift] UnavailableFunction Swift rule
+ * [#4697](https://github.com/pmd/pmd/issues/4697): \[swift] Support Swift 5.9 features (mainly macros expansion expressions)
+* xml
+ * [#1800](https://github.com/pmd/pmd/pull/1800): \[xml] Unimplement org.w3c.dom.Node from the XmlNodeWrapper
+* xml-bestpractices
+ * [#4592](https://github.com/pmd/pmd/pull/4592): \[xml] Add MissingEncoding rule
+
+## ✨ External Contributions
+
+* [#1658](https://github.com/pmd/pmd/pull/1658): \[core] Node support for Antlr-based languages - [Matías Fraga](https://github.com/matifraga) (@matifraga)
+* [#1698](https://github.com/pmd/pmd/pull/1698): \[core] [swift] Antlr Base Parser adapter and Swift Implementation - [Lucas Soncini](https://github.com/lsoncini) (@lsoncini)
+* [#1774](https://github.com/pmd/pmd/pull/1774): \[core] Antlr visitor rules - [Lucas Soncini](https://github.com/lsoncini) (@lsoncini)
+* [#1877](https://github.com/pmd/pmd/pull/1877): \[swift] Feature/swift rules - [Matías Fraga](https://github.com/matifraga) (@matifraga)
+* [#1881](https://github.com/pmd/pmd/pull/1881): \[doc] Add ANTLR documentation - [Matías Fraga](https://github.com/matifraga) (@matifraga)
+* [#1882](https://github.com/pmd/pmd/pull/1882): \[swift] UnavailableFunction Swift rule - [Tomás de Lucca](https://github.com/tomidelucca) (@tomidelucca)
+* [#2830](https://github.com/pmd/pmd/pull/2830): \[apex] Apexlink POC - [Kevin Jones](https://github.com/nawforce) (@nawforce)
+* [#3866](https://github.com/pmd/pmd/pull/3866): \[core] Add CLI Progress Bar - [@JerritEic](https://github.com/JerritEic) (@JerritEic)
+* [#4093](https://github.com/pmd/pmd/pull/4093): \[apex] Summit-AST Apex module - Part 1 - [Edward Klimoshenko](https://github.com/eklimo) (@eklimo)
+* [#4151](https://github.com/pmd/pmd/pull/4151): \[apex] Summit-AST Apex module - Part 2 - expression nodes - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4171](https://github.com/pmd/pmd/pull/4171): \[apex] Summit-AST Apex module - Part 3 - initializers - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4206](https://github.com/pmd/pmd/pull/4206): \[apex] Summit-AST Apex module - Part 4 - statements - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4219](https://github.com/pmd/pmd/pull/4219): \[apex] Summit-AST Apex module - Part 5 - annotations, triggers, misc. - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4242](https://github.com/pmd/pmd/pull/4242): \[apex] Merge 6.52 into experimental-apex-parser - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4251](https://github.com/pmd/pmd/pull/4251): \[apex] Summit-AST Apex module - Part 6 Passing testsuite - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4402](https://github.com/pmd/pmd/pull/4402): \[javascript] CPD: add support for Typescript using antlr4 grammar - [Paul Guyot](https://github.com/pguyot) (@pguyot)
+* [#4403](https://github.com/pmd/pmd/pull/4403): \[julia] CPD: Add support for Julia code duplication - [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
+* [#4412](https://github.com/pmd/pmd/pull/4412): \[doc] Added new error msg to ConstantsInInterface - [David Ljunggren](https://github.com/dague1) (@dague1)
+* [#4426](https://github.com/pmd/pmd/pull/4426): \[cpd] New XML to HTML XLST report format for PMD CPD - [mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) (@mohan-chinnappan-n)
+* [#4428](https://github.com/pmd/pmd/pull/4428): \[apex] ApexBadCrypto bug fix for #4427 - inline detection of hard coded values - [Steven Stearns](https://github.com/sfdcsteve) (@sfdcsteve)
+* [#4431](https://github.com/pmd/pmd/pull/4431): \[coco] CPD: Coco support for code duplication detection - [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
+* [#4444](https://github.com/pmd/pmd/pull/4444): \[java] CommentDefaultAccessModifier - ignore org.junit.jupiter.api.extension.RegisterExtension by default - [Nirvik Patel](https://github.com/nirvikpatel) (@nirvikpatel)
+* [#4448](https://github.com/pmd/pmd/pull/4448): \[apex] Bump summit-ast to new release 2.1.0 (and remove workaround) - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4450](https://github.com/pmd/pmd/pull/4450): \[java] Fix #4449 AvoidAccessibilityAlteration: Correctly handle Lambda expressions in PrivilegedAction scenarios - [Seren](https://github.com/mohui1999) (@mohui1999)
+* [#4452](https://github.com/pmd/pmd/pull/4452): \[doc] Update PMD_APEX_ROOT_DIRECTORY documentation reference - [nwcm](https://github.com/nwcm) (@nwcm)
+* [#4470](https://github.com/pmd/pmd/pull/4470): \[cpp] CPD: Added strings as literal and ignore identifiers in sequences - [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
+* [#4474](https://github.com/pmd/pmd/pull/4474): \[java] ImmutableField: False positive with lombok (fixes #4254) - [Pim van der Loos](https://github.com/PimvanderLoos) (@PimvanderLoos)
+* [#4479](https://github.com/pmd/pmd/pull/4479): \[apex] Merge main (7.x) branch into experimental-apex-parser and fix tests - [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google)
+* [#4488](https://github.com/pmd/pmd/pull/4488): \[java] Fix #4477: A false-positive about SignatureDeclareThrowsException - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4494](https://github.com/pmd/pmd/pull/4494): \[java] Fix #4487: A false-positive about UnnecessaryConstructor and @Inject and @Autowired - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4495](https://github.com/pmd/pmd/pull/4495): \[java] Fix #4493: false-positive about MissingStaticMethodInNonInstantiatableClass and @Inject - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4507](https://github.com/pmd/pmd/pull/4507): \[java] Fix #4503: A false negative about JUnitTestsShouldIncludeAssert and testng - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4520](https://github.com/pmd/pmd/pull/4520): \[doc] Fix typo: missing closing quotation mark after CPD-END - [João Dinis Ferreira](https://github.com/joaodinissf) (@joaodinissf)
+* [#4528](https://github.com/pmd/pmd/pull/4528): \[apex] Update to apexlink - [Kevin Jones](https://github.com/nawforce) (@nawforce)
+* [#4533](https://github.com/pmd/pmd/pull/4533): \[java] Fix #4063: False-negative about try/catch block in Loop - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4536](https://github.com/pmd/pmd/pull/4536): \[java] Fix #4268: CommentDefaultAccessModifier - false positive with TestNG's @Test annotation - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4537](https://github.com/pmd/pmd/pull/4537): \[java] Fix #4455: A false positive about FieldNamingConventions and UtilityClass - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4538](https://github.com/pmd/pmd/pull/4538): \[java] Fix #4456: A false positive about FinalFieldCouldBeStatic and UtilityClass - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4540](https://github.com/pmd/pmd/pull/4540): \[java] Fix #4457: false negative about OverrideBothEqualsAndHashcode - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4541](https://github.com/pmd/pmd/pull/4541): \[java] Fix #4458: A false positive about RedundantFieldInitializer and @Value - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4542](https://github.com/pmd/pmd/pull/4542): \[java] Fix #4510: A false positive about ConstructorCallsOverridableMethod and @Value - [AnnaDev](https://github.com/LynnBroe) (@LynnBroe)
+* [#4553](https://github.com/pmd/pmd/pull/4553): \[java] Fix #4492: GuardLogStatement gives false positive when argument is a Java method reference - [Anastasiia Koba](https://github.com/anastasiia-koba) (@anastasiia-koba)
+* [#4562](https://github.com/pmd/pmd/pull/4562): \[apex] Fixes #4556 - Update Apex bind regex match for all possible combinations - [nwcm](https://github.com/nwcm) (@nwcm)
+* [#4637](https://github.com/pmd/pmd/pull/4637): \[java] fix #4634 - JUnit4TestShouldUseTestAnnotation false positive with TestNG - [Krystian Dabrowski](https://github.com/krdabrowski) (@krdabrowski)
+* [#4640](https://github.com/pmd/pmd/pull/4640): \[cli] Launch script fails if run via "bash pmd" - [Shai Bennathan](https://github.com/shai-bennathan) (@shai-bennathan)
+* [#4649](https://github.com/pmd/pmd/pull/4649): \[apex] Add SObjectType and SObjectField to list of injectable SOQL variable types - [Richard Corfield](https://github.com/rcorfieldffdc) (@rcorfieldffdc)
+* [#4651](https://github.com/pmd/pmd/pull/4651): \[doc] Add "Tencent Cloud Code Analysis" in Tools / Integrations - [yale](https://github.com/cyw3) (@cyw3)
+* [#4664](https://github.com/pmd/pmd/pull/4664): \[cli] CPD: Fix NPE when only `--file-list` is specified - [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
+* [#4665](https://github.com/pmd/pmd/pull/4665): \[java] Doc: Fix references AutoClosable -> AutoCloseable - [Andrey Bozhko](https://github.com/AndreyBozhko) (@AndreyBozhko)
+* [#4673](https://github.com/pmd/pmd/pull/4673): \[javascript] CPD: Added support for decorator notation - [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
+* [#4677](https://github.com/pmd/pmd/pull/4677): \[apex] Add new rule: OperationWithHighCostInLoop - [Thomas Prouvot](https://github.com/tprouvot) (@tprouvot)
+* [#4698](https://github.com/pmd/pmd/pull/4698): \[swift] Add macro expansion support for swift 5.9 - [Richard B.](https://github.com/kenji21) (@kenji21)
+* [#4706](https://github.com/pmd/pmd/pull/4706): \[java] DetachedTestCase should not report on abstract methods - [Debamoy Datta](https://github.com/Debamoy) (@Debamoy)
+* [#4719](https://github.com/pmd/pmd/pull/4719): \[java] UnnecessaryCaseChange: example doc toUpperCase() should compare to a capitalized string - [ciufudean](https://github.com/ciufudean) (@ciufudean)
+* [#4738](https://github.com/pmd/pmd/pull/4738): \[doc] Added reference to the PMD extension for bld - [Erik C. Thauvin](https://github.com/ethauvin) (@ethauvin)
+* [#4749](https://github.com/pmd/pmd/pull/4749): Fixes NoSuchMethodError on processing errors in pmd-compat6 - [Andreas Bergander](https://github.com/bergander) (@bergander)
+* [#4750](https://github.com/pmd/pmd/pull/4750): \[core] Fix flaky SummaryHTMLRenderer - [219sansim](https://github.com/219sansim) (@219sansim)
+* [#4752](https://github.com/pmd/pmd/pull/4752): \[core] Fix flaky LatticeRelationTest - [219sansim](https://github.com/219sansim) (@219sansim)
+* [#4754](https://github.com/pmd/pmd/pull/4754): \[java] EmptyControlStatementRule: Add allowCommentedBlocks property - [Andreas Bergander](https://github.com/bergander) (@bergander)
+* [#4759](https://github.com/pmd/pmd/pull/4759): \[java] fix: remove delimiter attribute from ruleset category/java/errorprone.xml - [Marcin Dąbrowski](https://github.com/marcindabrowski) (@marcindabrowski)
+* [#4825](https://github.com/pmd/pmd/pull/4825): \[plsql] Fix ignored WITH clause for SELECT INTO statements - [Laurent Bovet](https://github.com/lbovet) (@lbovet)
+* [#4857](https://github.com/pmd/pmd/pull/4857): \[javascript] Fix UnnecessaryBlock issues with empty statements - [Oleksandr Shvets](https://github.com/oleksandr-shvets) (@oleksandr-shvets)