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) + + + +### Revamped Command Line Interface + +PMD now ships with a unified Command Line Interface for both Linux/Unix and Windows. Instead of having a collection +of scripts for the different utilities shipped with PMD, a single script `pmd` (`pmd.bat` for Windows) can now +launch all utilities using subcommands, e.g. `pmd check`, `pmd designer`. All commands and options are thoroughly +documented in the help, with full color support where available. Moreover, efforts were made to provide consistency +in the usage of all PMD utilities. + +```shell +$ Usage: pmd [-hV] [COMMAND] + -h, --help Show this help message and exit. + -V, --version Print version information and exit. +Commands: + check The PMD standard source code analyzer + cpd Copy/Paste Detector - find duplicate code + designer The PMD visual rule designer + cpd-gui GUI for the Copy/Paste Detector + Warning: May not support the full CPD feature set + ast-dump Experimental: dumps the AST of parsing source code +Exit Codes: + 0 Successful analysis, no violations found + 1 An unexpected error occurred during execution + 2 Usage error, please refer to the command help + 4 Successful analysis, at least 1 violation found +``` + +For instance, where you previously would have run +```shell +run.sh pmd -d src -R ruleset.xml +``` +you should now use +```shell +pmd check -d src -R ruleset.xml +``` +or even better, omit using `-d` / `--dir` and simply pass the sources at the end of the parameter list + +```shell +pmd check -R ruleset.xml src +``` + +Multiple source directories can be passed, such as: +```shell +pmd check -R ruleset.xml src/main/java src/test/java +``` + +And the exact same applies to CPD: +```shell +pmd cpd --minimum-tokens 100 src/main/java +``` + +Additionally, the CLI for the `check` command has been enhanced with a progress bar, which interactively displays the +current progress of the analysis. + +![Demo](images/userdocs/pmd-demo.gif) + +This can be disabled with the `--no-progress` flag. + +Finally, we now provide a completion script for Bash/Zsh to further help daily usage. +To use it, edit your `~/.bashrc` / `~/.zshrc` file and add the following line: + +``` +source <(pmd generate-completion) +``` + +Contributors: [Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod) + +### Full Antlr support + +PMD 6 only supported JavaCC based grammars, but with [Antlr](https://www.antlr.org/) parsers +can be generated as well. Languages backed by an Antlr grammar are now fully supported. This means, it's now +possible not only to use Antlr grammars for CPD, but we can actually build full-fledged PMD rules for them as well. +Both the traditional Java visitor rules, and the simpler XPath rules are available to users. This allows +to leverage existing grammars. + +We expect this to enable both our dev team and external contributors to largely extend PMD usage for more languages. + +Two languages (Swift and Kotlin) already use this new possibility. + +See the documentation page [Adding a new language with ANTLR](pmd_devdocs_major_adding_new_language_antlr.html) +for instructions on how to use this new feature. + +Contributors: [Lucas Soncini](https://github.com/lsoncini) (@lsoncini), +[Matías Fraga](https://github.com/matifraga) (@matifraga), +[Tomás De Lucca](https://github.com/tomidelucca) (@tomidelucca) + +### Updated PMD Designer + +This PMD release ships a new version of the pmd-designer. The designer artifact has been +renamed from "pmd-ui" to "pmd-designer". While the designer still works with Java 8, the +recommended Java Runtime is Java 11 (or later) with OpenJFX 17 (or later). + +For the detailed changes, see +* [PMD Designer Changelog (7.0.0)](https://github.com/pmd/pmd-designer/releases/tag/7.0.0). +* [PMD Designer Changelog (7.0.0-rc4)](https://github.com/pmd/pmd-designer/releases/tag/7.0.0-rc4). +* [PMD Designer Changelog (7.0.0-rc1)](https://github.com/pmd/pmd-designer/releases/tag/7.0.0-rc1). + +### New CPD report format cpdhtml-v2.xslt + +Thanks to @mohan-chinnappan-n a new CPD report format has been added which features a data table. +It uses an XSLT stylesheet to convert CPD's XML format into HTML. + +See [the example report](report-examples/cpdhtml-v2.html). + +Contributors: [Mohan Chinnappan](https://github.com/mohan-chinnappan-n) (@mohan-chinnappan-n) + +## 🎉 Language Related Changes + +### New: CPD support for Apache Velocity Template Language (VTL) + +PMD supported Apache Velocity for a very long time, but the CPD integration never got finished. +This is now done and CPD supports Apache Velocity Template language for detecting copy and paste. +It is shipped in the module `pmd-velocity`. + +### New: CPD support for Coco + +Thanks to a contribution, CPD now supports Coco, a modern programming language +designed specifically for building event-driven software. It is shipped in the new +module `pmd-coco`. + +Contributors: [Wener](https://github.com/wener-tiobe) (@wener-tiobe) + +### New: CPD support for Julia + +Thanks to a contribution, CPD now supports the Julia language. It is shipped +in the new module `pmd-julia`. + +Contributors: [Wener](https://github.com/wener-tiobe) (@wener-tiobe) + +### New: CPD support for TypeScript + +Thanks to a contribution, CPD now supports the TypeScript language. It is shipped +with the rest of the JavaScript support in the module `pmd-javascript`. + +Contributors: [Paul Guyot](https://github.com/pguyot) (@pguyot) + +### New: Java 21 and 22 Support + +This release of PMD brings support for Java 21 and 22. There are the following new standard language features, +that are supported now: + +* [JEP 456: Unnamed Variables & Patterns](https://openjdk.org/jeps/456) (Java 22) +* [JEP 440: Record Patterns](https://openjdk.org/jeps/440) (Java 21) +* [JEP 441: Pattern Matching for switch](https://openjdk.org/jeps/441) (Java 21) + +PMD also supports the following preview language features: + +* [JEP 447: Statements before super(...) (Preview)](https://openjdk.org/jeps/447) (Java 22) +* [JEP 459: String Templates (Second Preview)](https://openjdk.org/jeps/459) (Java 21 and 22) +* [JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)](https://openjdk.org/jeps/463) (Java 21 and 22) + +In order to analyze a project with PMD that uses these preview language features, +you'll need to enable it via the environment variable `PMD_JAVA_OPTS` and select the new language +version `22-preview`: + + export PMD_JAVA_OPTS=--enable-preview + pmd check --use-version java-22-preview ... + +Note: Support for Java 19 and Java 20 preview language features have been removed. The versions "19-preview" and +"20-preview" are no longer available. + +### New: Kotlin support + +PMD now supports Kotlin as an additional language for analyzing source code. It is based on +the official kotlin Antlr grammar for Kotlin 1.8. Java-based rules and XPath-based rules are supported. + +We are shipping the following rules: + +* [`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, ...). + +Contributors: [Jeroen Borgers](https://github.com/jborgers) (@jborgers), +[Peter Paul Bakker](https://github.com/stokpop) (@stokpop) + +### New: Swift support + +Given the full Antlr support, PMD now fully supports Swift for creating rules. Previously only CPD was supported. + +Note: There is only limited support for newer Swift language features in the parser, e.g. Swift 5.9 (Macro Expansions) +are supported, but other features are not. + +We are pleased to announce we are shipping a number of rules starting with PMD 7. + +* [`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. + +Contributors: [Lucas Soncini](https://github.com/lsoncini) (@lsoncini), +[Matías Fraga](https://github.com/matifraga) (@matifraga), +[Tomás De Lucca](https://github.com/tomidelucca) (@tomidelucca) + +### Changed: Apex Support: Replaced Jorje with fully open source front-end + +When PMD added Apex support with version 5.5.0, it utilized the Apex Jorje library to parse Apex source +and generate an AST. This library is however a binary-blob provided as part of the +[Salesforce Extensions for VS Code](https://github.com/forcedotcom/salesforcedx-vscode), and it is closed-source. + +This causes problems, if binary blobs are not allowed by e.g. a company-wide policy. In that case, the Jorje +library prevented that PMD Apex could be used at all. + +Also having access to the source code, enhancements and modifications are easier to do. + +Under the hood, we use two open source libraries instead: + +* [apex-parser](https://github.com/apex-dev-tools/apex-parser) originally by + [Kevin Jones](https://github.com/nawforce) (@nawforce). + This project provides the grammar for a ANTLR based parser. +* [Summit-AST](https://github.com/google/summit-ast) by [Google](https://github.com/google) (@google) + This project translates the ANTLR parse tree into an AST, that is similar to the AST Jorje provided. + Note: This is not an official Google product. + +Although the parsers is completely switched, there are only little known changes to the AST. +These are documented in the [Migration Guide for PMD 7: Apex AST](pmd_userdocs_migrating_to_pmd7.html#apex-ast). +With the new Apex parser, the new language constructs like +[User Mode Database Operations](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_enforce_usermode.htm) +and the new [Null Coalescing Operator `??`](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_NullCoalescingOperator.htm) +can be parsed now. PMD should be able to parse Apex code up to version 60.0 (Spring '24). + +See [#3766](https://github.com/pmd/pmd/issues/3766) for details. + +Contributors: [Aaron Hurst](https://github.com/aaronhurst-google) (@aaronhurst-google), +[Edward Klimoshenko](https://github.com/eklimo) (@eklimo) + +### Changed: CPP can now ignore identifiers in sequences (CPD) + +* New command line option for CPD: `--ignore-sequences`. +* This option is used for CPP only: with the already existing option `--ignore-literal-sequences`, only + literals were ignored. The new option additionally ignores identifiers as well in sequences. +* See [PR #4470](https://github.com/pmd/pmd/pull/4470) for details. + +### Changed: Groovy Support (CPD) + +* We now support parsing all Groovy features from Groovy 3 and 4. +* We now support [suppression](pmd_userdocs_cpd.html#suppression) through `CPD-ON`/`CPD-OFF` comment pairs. +* See [PR #4726](https://github.com/pmd/pmd/pull/4726) for details. + +### Changed: HTML support + +Support for HTML was introduced in PMD 6.55.0 as an experimental feature. With PMD 7.0.0 this +is now considered stable. + +### Changed: JavaScript support + +The JS specific parser options have been removed. The parser now always retains comments and uses version ES6. +The language module registers a couple of different versions. The latest version, which supports ES6 and also some +new constructs (see [Rhino](https://github.com/mozilla/rhino)), is the default. This should be fine for most +use cases. + +### Changed: Language versions + +We revisited the versions that were defined by each language module. Now many more versions are defined for each +language. In general, you can expect that PMD can parse all these different versions. There might be situations +where this fails and this can be considered a bug. Usually the latest version is selected as the default +language version. + +The language versions can be used to mark rules to be useful only for a specific language version via +the `minimumLanguageVersion` and `maximumLanguageVersion` attributes. While this feature is currently only used by +the Java module, listing all possible versions enables other languages as well to use this feature. + +Related issue: [[core] Explicitly name all language versions (#4120)](https://github.com/pmd/pmd/issues/4120) + +### Changed: 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. + +### 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 + + + +### For endusers + +* PMD 7 requires Java 8 or above to execute. +* CLI changed: Custom scripts need to be updated (`run.sh pmd ...` ➡️ `pmd check ...`, `run.sh cpd ...` ➡️ `pmd cpd ...`). +* Java module revamped: Custom rules need to be updated. +* Removed rules: Custom rulesets need to be reviewed. See above for a list of new and removed rules. +* XPath 1.0 and 2.0 support is removed, `violationSuppressXPath` now requires XPath 3.1: Custom rulesets need + to be reviewed. +* Custom rules using rulechains: Need to override AbstractRule#buildTargetSelector + using RuleTargetSelector#forTypes. +* The asset filenames of PMD on [GitHub Releases](https://github.com/pmd/pmd/releases) are + now `pmd-dist--bin.zip`, `pmd-dist--src.zip` and `pmd-dist--doc.zip`. + Keep that in mind, if you have an automated download script. + + The structure inside the ZIP files stay the same, e.g. we still provide inside the binary distribution + ZIP file the base directory `pmd-bin-`. +* For maven-pmd-plugin usage, see [Using PMD 7 with maven-pmd-plugin](pmd_userdocs_tools_maven.html#using-pmd-7-with-maven-pmd-plugin). +* For gradle users, at least gradle 8.6 is required for PMD 7. + +### For integrators + +* PMD 7 is a major release where many things have been moved or rewritten. +* All integrators will require some level of change to adapt to the change in the API. +* For more details look at the deprecations notes of the past PMD 6 releases. These are collected below + under [API Changes](#api-changes). +* The PMD Ant tasks, which were previously in the module `pmd-core` has been moved into its own module `pmd-ant`, + which needs to be added explicitly now as an additional dependency. +* The CLI classes have also been moved out of `pmd-core` into its own module `pmd-cli`. The old entry point, the + main class 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 `Set>` to list available metrics. + +* Signatures, 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..cpd` + * adapted to use 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--bin.zip`, `pmd-dist--src.zip` and `pmd-dist--doc.zip`. + Keep that in mind, if you have an automated download script. + + The structure inside the ZIP files stay the same, e.g. we still provide inside the binary distribution + ZIP file the base directory `pmd-bin-`. + +**CLI** + +* The CLI option `--stress` (or `-stress`) has been removed without replacement. +* The CLI option `--minimum-priority` was changed with 7.0.0-rc1 to only take the following values: + High, Medium High, Medium, Medium Low, Low. With 7.0.0-rc2 compatibility has been restored, so that the equivalent + integer values (1 to 5) are supported as well. + +**pmd-core** + +* Replaced `RuleViolation::getFilename` with new 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: +- `-`, eg `java-basic`, which resolves to `rulesets/java/basic.xml` +- the internal release number, eg `600`, which resolves to `rulesets/releases/600.xml` + +Use the explicit forms of these references to be compatible with PMD 7. + +**Deprecated API** + +- 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 `List`. +* RuleSetReferenceId, 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. ``). + + While we definitely won't move or rename the rule classes in PMD 6.x, we might consider changes + in PMD 7.0.0 and onwards. + +**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. + +* 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. `PropertyDescriptor` or `PropertyDescriptor>`. + +* Instead of spreading properties across countless classes, the utility class PropertyFactory 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 +PropertyDescriptor myProperty = PropertyFactory.intProperty("score").desc("Top score value").require(inRange(1, 100)).defaultValue(40); +``` + +You're highly encouraged to migrate to using this new API as soon as possible, to ease your migration to 7.0.0. + + + +**Architectural simplifications** + +* EnumeratedPropertyDescriptor, 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 PropertyConstraints, + 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 `Comparable` anymore come 7.0.0. +* The method propertyErrorFor 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 `Optional` with the shift to Java 8. + +**Deprecated APIs** + + + + + + + + +**For internalization** + +* The implementation of the adapters for the XPath engines Saxon and Jaxen (package net.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)