All Versions
17
Latest Version
Avg Release Cycle
34 days
Latest Release
1251 days ago

Changelog History
Page 1

  • v6.29.0 Changes

    October 24, 2020

    24-October-2020 - 6.29.0

    The PMD team is pleased to announce PMD 6.29.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    ⚑️ Updated Apex Support

    πŸ†• New Rules

    • The new Apex rule OperationWithLimitsInLoop (apex-performance)
      finds operations in loops that may hit governor limits such as DML operations, SOQL
      queries and more. The rule replaces the three rules "AvoidDmlStatementsInLoops", "AvoidSoqlInLoops",
      and "AvoidSoslInLoops".

    πŸ“‡ Renamed Rules

    • The Java rule DoNotCallSystemExit has been renamed to
      DoNotTerminateVM, since it checks for all the following calls:
      System.exit(int), Runtime.exit(int), Runtime.halt(int). All these calls terminate
      the Java VM, which is bad, if the VM runs an application server which many independent applications.

    πŸ—„ Deprecated Rules

    πŸ›  Fixed Issues

    • apex
      • #2839: [apex] Apex classes with safe navigation operator from Winter 21 (50.0) are skipped
    • 🐎 apex-performance
      • #1713: [apex] Mark Database DML statements in For Loop
    • core
      • #2831: [core] Fix XMLRenderer newlines when running under IBM Java
    • java-errorprone
      • #2157: [java] Improve DoNotCallSystemExit: permit call in main(), flag System.halt
      • #2764: [java] CloseResourceRule does not recognize multiple assignment done to resource
    • miscellaneous
      • #2823: [doc] Renamed/Moved rules are missing in documentation
    • vf (Salesforce VisualForce)
      • #2765: [vf] Attributes with dot cause a VfParseException

    External Contributions

    Stats

    • 50 commits
    • 23 closed tickets & PRs
    • πŸš€ Days since last release: 27
  • v6.28.0 Changes

    September 26, 2020

    26-September-2020 - 6.28.0

    The PMD team is pleased to announce PMD 6.28.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    CPD's AnyTokenizer has been improved

    The AnyTokenizer is used for languages, that don't have an own lexer/grammar based tokenizer.
    πŸ’Ž AnyTokenizer now handles string literals and end-of-line comments. Fortran, Perl and Ruby have
    ⚑️ been updated to use AnyTokenizer instead of their old custom tokenizer based on AbstractTokenizer.
    πŸ‘€ See #2758 for details.

    πŸ—„ AbstractTokenizer and the custom tokenizers of Fortran, Perl and Ruby are deprecated now.

    πŸ›  Fixed Issues

    cpd

    • #2758: [cpd] Improve AnyTokenizer

    - #2760: [cpd] AnyTokenizer doesn't count columns correctly

    πŸ”’ apex-security

    - #2774: [apex] ApexSharingViolations does not correlate sharing settings with class that contains data access

    java

    • #2738: [java] Custom rule with @ExhaustiveEnumSwitch throws NPE
    • #2755: [java] [6.27.0] Exception applying rule CloseResource on file ... java.lang.NullPointerException
    • #2756: [java] TypeTestUtil fails with NPE for anonymous class
    • #2767: [java] IndexOutOfBoundsException when parsing an initializer BlockStatement

    - #2783: [java] Error while parsing with lambda of custom interface

    java-bestpractices

    - #2759: [java] False positive in UnusedAssignment

    java-design

    • #2708: [java] False positive FinalFieldCouldBeStatic when using lombok Builder.Default

    API Changes

    πŸ—„ Deprecated API

    For removal

    External Contributions

    • #2735: [ci] Add github actions for a fast view of pr succeed/not - XenoAmess
    • πŸ— #2747: [java] Don't trigger FinalFieldCouldBeStatic when field is annotated with lombok @Builder.Default - Ollie Abbey
    • 0️⃣ #2773: [java] issue-2738: Adding null check to avoid npe when switch case is default - Nimit Patel
    • πŸ— #2789: Add badge for reproducible build - Dan Rollo
    • #2791: [apex] Analyze inner classes for sharing violations - Jeff Bartolotta

    Stats

    • 58 commits
    • 24 closed tickets & PRs
    • πŸš€ Days since last release: 25
  • v6.27.0 Changes

    August 31, 2020

    31-August-2020 - 6.27.0

    The PMD team is pleased to announce PMD 6.27.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    πŸ‘ Java 15 Support

    πŸš€ This release of PMD brings support for Java 15. PMD can parse Text Blocks
    which have been promoted to be a standard language feature of Java.

    πŸ‘ PMD also supports Pattern Matching for instanceof,
    Records, and Sealed Classes.

    Note: The Pattern Matching for instanceof, Records, and Sealed Classes are all preview language features of OpenJDK 15
    0️⃣ and are not enabled by default. In order to
    analyze a project with PMD that uses these language features, you'll need to enable it via the environment
    variable PMD_JAVA_OPTS and select the new language version 15-preview:

    export PMD_JAVA_OPTS=--enable-preview
    ./run.sh pmd -language java -version 15-preview ...
    

    🚚 Note: Support for Java 13 preview language features have been removed. The version "13-preview" is no longer available.

    πŸ”„ Changes in how tab characters are handled

    In the past, tab characters in source files has been handled differently in different languages by PMD.
    For instance in Java, tab characters had a width of 8 columns, while C# used only 1 column. Visualforce instead
    πŸ‘‰ used 4 columns.

    This has been unified now so that tab characters are consistently now always 1 column wide.

    This however might be a incompatible change, if you're using the properties "BeginColumn" or "EndColumn"
    βž• additionally to "BeginLine" and "EndLine" of a Token/AST node in order to highlight
    where a rule violation occurred in the source file. If you have logic there that deals with tab characters,
    🚚 you most likely can remove this logic now, since tab characters are now just "normal" characters
    in terms of string processing.

    πŸ‘€ See also [all] Ensure PMD/CPD uses tab width of 1 for tabs consistently #2656.

    ⚑️ Updated PMD Designer

    πŸš€ This PMD release ships a new version of the pmd-designer.
    πŸš€ For the changes, see PMD Designer Changelog.

    πŸ†• New Rules

    • The new Java rule AvoidReassigningCatchVariables (java-bestpractices) finds
      πŸ‘» cases where the variable of the caught exception is reassigned. This practice is surprising and prevents
      further evolution of the code like multi-catch.

    Modified Rules

    The Java rule CloseResource (java-errorprone) has a new property
    closeNotInFinally. With this property set to true the rule will also find calls to close a
    resource, which are not in a finally-block of a try-statement. If a resource is not closed within a
    finally block, it might not be closed at all in case of exceptions.

    0️⃣ As this new detection would yield many new violations, it is disabled by default. It might be
    enabled in a later version of PMD.

    πŸ—„ Deprecated Rules

    πŸ›  Fixed Issues

    • core
      • #724: [core] Avoid parsing rulesets multiple times
      • #1962: [core] Simplify Report API
      • #2653: [lang-test] Upgrade kotlintest to Kotest
      • #2656: [all] Ensure PMD/CPD uses tab width of 1 for tabs consistently
      • #2690: [core] Fix java7 compatibility
    • java
      • #2646: [java] Support JDK 15
    • java-bestpractices
      • #2471: [java] New Rule: AvoidReassigningCatchVariables
      • #2663: [java] NoClassDefFoundError on upgrade from 6.25.0 to 6.26.0
      • #2668: [java] UnusedAssignment false positives
      • #2673: [java] UnusedPrivateField and SingularField false positive with lombok annotation EqualsAndHashCode
      • #2684: [java] UnusedAssignment FP in try/catch
      • #2686: [java] UnusedAssignment must not flag abstract method parameters in interfaces and abstract classes
    • java-design
      • #2108: [java] [doc] ImmutableField rule: Description should clarify shallow immutability
      • #2461: [java] ExcessiveParameterListRule must ignore a private constructor
    • java-errorprone
      • #2264: [java] SuspiciousEqualsMethodName: Improve description about error-prone overloading of equals()
      • #2410: [java] ProperCloneImplementation not valid for final class
      • #2431: [java] InvalidLogMessageFormatRule throws IndexOutOfBoundsException when only logging exception message
      • #2439: [java] AvoidCatchingThrowable can not detect the case: catch (java.lang.Throwable t)
      • #2470: [java] CloseResource false positive when resource included in return value
      • #2531: [java] UnnecessaryCaseChange can not detect the case like: foo.equals(bar.toLowerCase())
      • #2647: [java] Deprecate rule DataFlowAnomalyAnalysis
    • 🐎 java-performance
      • #1868: [java] false-positive for SimplifyStartsWith if string is empty
      • #2441: [java] RedundantFieldInitializer can not detect a special case for char initialize: char foo = '\0';
      • #2530: [java] StringToString can not detect the case: getStringMethod().toString()
    • dart
      • #2750: [dart] [cpd] Cpd Dart escaped dollar

    API Changes

    • 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:

    - 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.

    External Contributions

    Stats

    • 189 commits
    • 68 closed tickets & PRs
    • πŸš€ Days since last release: 37
  • v6.26.0 Changes

    July 25, 2020

    25-July-2020 - 6.26.0

    The PMD team is pleased to announce PMD 6.26.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    πŸ†• New Rules

    • The new Java rule UnusedAssignment (java-bestpractices) finds assignments
      to variables, that are never used and are useless. The new rule is supposed to entirely replace
      DataflowAnomalyAnalysis.

    Modified rules

    • The Java rule ArrayIsStoredDirectly (java-bestpractices) now ignores
      βͺ by default private methods and constructors. You can restore the old behavior by setting the new property
      allowPrivate to "false".

    πŸ›  Fixed Issues

    • apex
      • #2610: [apex] Support top-level enums in rules
    • apex-bestpractices
      • #2626: [apex] UnusedLocalVariable - false positive on case insensitivity allowed in Apex
    • 🐎 apex-performance
      • #2598: [apex] AvoidSoqlInLoops false positive for SOQL with in For-Loop
    • πŸ”’ apex-security
      • #2620: [visualforce] False positive on VfUnescapeEl with new Message Channel feature
    • core
      • #710: [core] Review used dependencies
      • #2594: [core] Update exec-maven-plugin and align it in all project
      • #2615: [core] PMD/CPD produces invalid XML (insufficient escaping/wrong encoding)
    • java-bestpractices
      • #2543: [java] UseCollectionIsEmpty can not detect the case this.foo.size()
      • #2569: [java] LiteralsFirstInComparisons: False negative for methods returning Strings
      • #2622: [java] ArrayIsStoredDirectly false positive with private constructor/methods
    • πŸ’… java-codestyle
      • #2546: [java] DuplicateImports reported for the same import... and import static...
    • java-design
      • #2174: [java] LawOfDemeter: False positive with 'this' pointer
      • #2181: [java] LawOfDemeter: False positive with indexed array access
      • #2189: [java] LawOfDemeter: False positive when casting to derived class
      • #2580: [java] AvoidThrowingNullPointerException marks all NullPointerException objects as wrong, whether or not thrown
      • #2625: [java] NPathComplexity can't handle switch expressions
    • java-errorprone
      • #2578: [java] AvoidCallingFinalize detects some false positives
      • #2634: [java] NullPointerException in rule ProperCloneImplementation
    • 🐎 java-performance
      • #1736: [java] UseStringBufferForStringAppends: False positive if only one concatenation
      • #2207: [java] AvoidInstantiatingObjectsInLoops: False positive - should not flag objects when assigned to lists/arrays

    API Changes

    πŸ—„ Deprecated API

    For removal

    External Contributions

    Stats

    • 156 commits
    • 43 closed tickets & PRs
    • πŸš€ Days since last release: 28
  • v6.25.0 Changes

    June 27, 2020

    27-June-2020 - 6.25.0

    The PMD team is pleased to announce PMD 6.25.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    Scala cross compilation

    0️⃣ Up until now the PMD Scala module has been compiled against scala 2.13 only by default.
    However, this makes it impossible to use pmd as a library in scala projects,
    πŸ”Œ that use scala 2.12, e.g. in sbt plugins. Therefore PMD now provides cross compiled pmd-scala
    modules for both versions: scala 2.12 and scala 2.13.

    The new modules have new maven artifactIds. The old artifactId net.sourceforge.pmd:pmd-scala:6.25.0
    πŸ—„ is still available, but is deprecated from now on. It has been demoted to be just a delegation to the new
    🚚 pmd-scala_2.13 module and will be removed eventually.

    The coordinates for the new modules are:

    <dependency>
        <groupId>net.sourceforge.pmd</groupId>
        <artifactId>pmd-scala_2.12</artifactId>
        <version>6.25.0</version>
    </dependency>
    
    <dependency>
        <groupId>net.sourceforge.pmd</groupId>
        <artifactId>pmd-scala_2.13</artifactId>
        <version>6.25.0</version>
    </dependency>
    

    The command line version of PMD continues to use scala 2.13.

    πŸ†• New Rules

    The new Java Rule UnnecessaryCast (java-codestyle)
    finds casts that are unnecessary while accessing collection elements.

    The new Java Rule AvoidCalendarDateCreation (java-performance)
    finds usages of java.util.Calendar whose purpose is just to get the current date. This
    can be done in a more lightweight way.

    The new Java Rule UseIOStreamsWithApacheCommonsFileItem (java-performance)
    finds usage of FileItem.get() and FileItem.getString(). These two methods are problematic since
    they load the whole uploaded file into memory.

    Modified rules

    The Java rule UseDiamondOperator (java-codestyle) now by default
    finds unnecessary usages of type parameters, which are nested, involve wildcards and are used
    within a ternary operator. These usages are usually only unnecessary with Java8 and later, when
    the type inference in Java has been improved.

    In order to avoid false positives when checking Java7 only code, the rule has the new property
    0️⃣ java7Compatibility, which is disabled by default. Settings this to "true" retains
    the old rule behaviour.

    πŸ›  Fixed Issues

    • apex-bestpractices
      • #2554: [apex] Exception applying rule UnusedLocalVariable on trigger
    • core
      • #971: [apex][plsql][java] Deprecate overly specific base rule classes
      • #2451: [core] Deprecate support for List attributes with XPath 2.0
      • #2599: [core] Fix XPath 2.0 Rule Chain Analyzer with Unions
      • #2483: [lang-test] Support cpd tests based on text comparison.
        πŸ‘€ For details see
        πŸš€ Testing your implementation
        πŸ“š in the developer documentation.
    • c#
      • #2551: [c#] CPD suppression with comments doesn't work
    • cpp
      • #1757: [cpp] Support unicode characters
    • java
      • #2549: [java] Auxclasspath in PMD CLI does not support relative file path
    • πŸ’… java-codestyle
      • #2545: [java] UseDiamondOperator false negatives
      • #2573: [java] DefaultPackage: Allow package default JUnit 5 Test methods
    • java-design
      • #2563: [java] UselessOverridingMethod false negative with already public methods
      • #2570: [java] NPathComplexity should mention the expected NPath complexity
    • java-errorprone
      • #2544: [java] UseProperClassLoader can not detect the case with method call on intermediate variable
    • 🐎 java-performance
      • #2591: [java] InefficientStringBuffering/AppendCharacterWithChar: Fix false negatives with concats in appends
      • #2600: [java] UseStringBufferForStringAppends: fix false negative with fields
    • scala
      • #2547: [scala] Add cross compilation for scala 2.12 and 2.13

    API Changes

    πŸ—„ 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. <rule ref="category/java/bestpractices.xml/AbstractClassWithoutAbstractMethod" />).

    🚚 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.

    For removal

    External Contributions

    Stats

    • 135 commits
    • 31 closed tickets & PRs
    • πŸš€ Days since last release: 33
  • v6.24.0 Changes

    May 24, 2020

    24-May-2020 - 6.24.0

    The PMD team is pleased to announce PMD 6.24.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    πŸ‘ CPD now supports XML as well

    Thanks to Fernando Cosso CPD can now find duplicates in XML files as well.
    This is useful to find duplicated sections in XML files.

    ⚑️ Updated PMD Designer

    πŸš€ This PMD release ships a new version of the pmd-designer.
    πŸš€ For the changes, see PMD Designer Changelog.

    πŸ†• New Rules

    The new Java Rule LiteralsFirstInComparisons (java-bestpractices)
    find String literals, that are used in comparisons and are not positioned first. Using the String literal
    as the receiver of e.g. equals helps to avoid NullPointerExceptions.

    This rule is replacing the two old rules PositionLiteralsFirstInComparisons
    and PositionLiteralsFirstInCaseInsensitiveComparisons and extends the check
    for the methods compareTo, compareToIgnoreCase and contentEquals in addition to equals and
    equalsIgnoreCase.

    Note: This rule also replaces the two mentioned rules in Java's quickstart ruleset.

    πŸ—„ Deprecated Rules

    πŸ›  Fixed Issues

    • apex-bestpractices
      • #2468: [apex] Unused Local Variable fails on blocks
    • core
      • #2444: [core] Support reproducible builds
      • #2484: [core] Update maven-enforcer-plugin to require Java 118
    • c#
      • #2495: [c#] Support for interpolated verbatim strings
    • java
      • #2472: [java] JavaCharStream throws an Error on invalid escape
    • java-bestpractices
      • #2145: [java] Deprecate rules PositionLiteralsFirstIn(CaseInsensitive)Comparisons in favor of LiteralsFirstInComparisons
      • #2288: [java] JUnitTestsShouldIncludeAssert: Add support for Hamcrest MatcherAssert.assertThat
      • #2437: [java] AvoidPrintStackTrace can't detect the case e.getCause().printStackTrace()
    • πŸ’… java-codestyle
      • #2476: [java] MethodNamingConventions - Add support for JUnit 5 method naming
    • java-errorprone
      • #2477: [java] JUnitSpelling false-positive for JUnit5/4 tests
    • swift
      • #2473: [swift] Swift 5 (up to 5.2) support for CPD

    API Changes

    πŸ—„ Deprecated APIs

    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.

    External Contributions

    Stats

    • 114 commits
    • 29 closed tickets & PRs
    • πŸš€ Days since last release: 30
  • v6.23.0 Changes

    April 24, 2020

    24-April-2020 - 6.23.0

    The PMD team is pleased to announce PMD 6.23.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    PMD adopts Contributor Code of Conduct

    To facilitate healthy and constructive community behavior PMD adopts
    Contributor Convenant as its code of
    conduct.

    πŸš€ Please note that this project is released with a Contributor Code of Conduct.
    By participating in this project you agree to abide by its terms.

    You can find the code of conduct in the file code_of_conduct.md
    in our repository.

    🐎 Performance improvements for XPath 2.0 rules

    πŸ‘ XPath rules written with XPath 2.0 now support conversion to a rulechain rule, which
    πŸ‘Œ improves their performance. The rulechain is a mechanism that allows several rules
    to be executed in a single tree traversal. Conversion to the rulechain is possible if
    your XPath expression looks like //someNode/... | //someOtherNode/... | ..., that
    is, a union of one or more path expressions that start with //. Instead of traversing
    the whole tree once per path expression (and per rule), a single traversal executes all
    rules in your ruleset as needed.

    This conversion is performed automatically and cannot be disabled. The conversion should
    not change the result of your rules
    , if it does, please report a bug at https://github.com/pmd/pmd/issues

    πŸ—„ Note that XPath 1.0 support, the default XPath version, is deprecated since PMD 6.22.0.
    ⬆️ We highly recommend that you upgrade your rules to XPath 2.0. Please refer to the migration guide.

    Javascript improvements for ES6

    πŸ“œ PMD uses the Rhino library to parse Javascript.
    0️⃣ The default version has been set to ES6, so that some ECMAScript 2015 features are
    πŸ‘Œ supported. E.g. let statements and for-of loops are now parsed. However Rhino does
    πŸ‘ not support all features.

    πŸ†• New JSON renderer

    πŸ‘ PMD now supports a JSON renderer (use it with -f json on the CLI).
    πŸ‘‰ See the documentation and example

    πŸ†• New Rules

    The new Apex rule FieldDeclarationsShouldBeAtStart (apex-codestyle)
    helps to ensure that field declarations are always at the beginning of a class.

    The new Apex rule UnusedLocalVariable (apex-bestpractices) detects unused
    local variables.

    πŸ›  Fixed Issues

    • apex-design
      • #2358: [apex] Invalid Apex in Cognitive Complexity tests
    • πŸ”’ apex-security
      • #2210: [apex] ApexCRUDViolation: Support WITH SECURITY_ENFORCED
      • #2399: [apex] ApexCRUDViolation: false positive with security enforced with line break
    • core
      • #1286: [core] Export Supporting JSON Format
      • #2019: [core] Insufficient deprecation warnings for XPath attributes
      • #2357: Add code of conduct: Contributor Covenant
      • #2426: [core] CodeClimate renderer links are dead
      • #2432: [core] Close ZIP data sources even if a runtime exception or error is thrown
    • doc
      • #2355: [doc] Improve documentation about incremental analysis
      • #2356: [doc] Add missing doc about pmd.github.io
      • #2412: [core] HTMLRenderer doesn't render links to source files
      • #2413: [doc] Improve documentation about the available renderers (PMD/CPD)
    • java
      • #2378: [java] AbstractJUnitRule has bad performance on large code bases
    • java-bestpractices
      • #2398: [java] AbstractClassWithoutAbstractMethod false negative with inner abstract classes
    • πŸ’… java-codestyle
      • #1164: [java] ClassNamingConventions suggests to add Util for class containing only static constants
      • #1723: [java] UseDiamondOperator false-positive inside lambda
    • java-design
      • #2390: [java] AbstractClassWithoutAnyMethod: missing violation for nested classes
    • java-errorprone
      • #2402: [java] CloseResource possible false positive with Primitive Streams
    • java-multithreading
      • #2313: [java] Documenation for DoNotUseThreads is outdated
    • javascript
      • #1235: [javascript] Use of let results in an Empty Statement in the AST
      • #2379: [javascript] Support for-of loop
    • javascript-errorprone
      • #384: [javascript] Trailing commas not detected on French default locale

    API Changes

    πŸ—„ 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.

    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.

    πŸ—„ These deprecations have already been rolled out in a previous version for the
    following languages:

    πŸ“¦ Outside of these packages, these changes also concern the following TokenManager
    πŸ“¦ implementations, and their corresponding Parser if it exists (in the same package):

    In the Java AST the following attributes are deprecated and will issue a warning when used in XPath rules:

    For removal

    External Contributions

    Stats

    • 237 commits
    • 64 closed tickets & PRs
    • πŸš€ Days since last release: 42
  • v6.22.0 Changes

    March 12, 2020

    12-March-2020 - 6.22.0

    The PMD team is pleased to announce PMD 6.22.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    πŸ‘ Java 14 Support

    πŸš€ This release of PMD brings support for Java 14. PMD can parse Switch Expressions,
    which have been promoted to be a standard language feature of Java.

    πŸ“œ PMD also parses Text Blocks as String literals, which is still a preview
    language feature in Java 14.

    The new Pattern Matching for instanceof can be used as well as
    Records.

    Note: The Text Blocks, Pattern Matching for instanceof and Records are all preview language features of OpenJDK 14
    0️⃣ and are not enabled by default. In order to
    analyze a project with PMD that uses these language features, you'll need to enable it via the environment
    variable PMD_JAVA_OPTS and select the new language version 14-preview:

    export PMD_JAVA_OPTS=--enable-preview
    ./run.sh pmd -language java -version 14-preview ...
    

    πŸ‘ Note: Support for the extended break statement introduced in Java 12 as a preview language feature
    🚚 has been removed from PMD with this version. The version "12-preview" is no longer available.

    ⚑️ Updated PMD Designer

    πŸš€ This PMD release ships a new version of the pmd-designer.
    πŸš€ For the changes, see PMD Designer Changelog.

    Apex Suppressions

    ⚠ In addition to suppressing violation with the @SuppressWarnings annotation, Apex now also supports
    πŸš€ the suppressions with a NOPMD comment. See Suppressing warnings.

    πŸ‘Œ Improved CPD support for C

    The C# tokenizer is now based on an antlr grammar instead of a manual written tokenizer. This
    πŸ›  should give more accurate results and especially fixes the problems with the using statement syntax
    πŸ‘€ (see #2139).

    XPath Rules

    πŸš€ See the new documentation about Writing XPath Rules.

    Note: As of PMD version 6.22.0, XPath versions 1.0 and the 1.0 compatibility mode are deprecated.
    πŸ‘ XPath 2.0 is superior in many ways, for example for its support for type checking, sequence values,
    or quantified expressions. For a detailed but approachable review of the features of XPath 2.0 and above,
    πŸ“š see the Saxon documentation.

    πŸ†• New Rules

    The Rule CognitiveComplexity (apex-design) finds methods and classes
    that are highly complex and therefore difficult to read and more costly to maintain. In contrast
    to cyclomatic complexity, this rule uses "Cognitive Complexity", which is a measure of how
    difficult it is for humans to read and understand a method.

    The Rule TestMethodsMustBeInTestClasses (apex-errorprone) finds test methods
    🚚 that are not residing in a test class. The test methods should be moved to a proper test class.
    πŸ‘Œ Support for tests inside functional classes was removed in Spring-13 (API Version 27.0), making classes
    that violate this rule fail compile-time. This rule is however useful when dealing with legacy code.

    πŸ›  Fixed Issues

    • apex
      • #1087: [apex] Support suppression via //NOPMD
      • #2306: [apex] Switch statements are not parsed/supported
    • apex-design
      • #2162: [apex] Cognitive Complexity rule
    • apex-errorprone
      • #639: [apex] Test methods should not be in classes other than test classes
    • cs
      • #2139: [cs] CPD doesn't understand alternate using statement syntax with C# 8.0
    • doc
      • #2274: [doc] Java API documentation for PMD
    • java
      • #2159: [java] Prepare for JDK 14
      • #2268: [java] Improve TypeHelper resilience
    • java-bestpractices
      • #2277: [java] FP in UnusedImports for ambiguous static on-demand imports
    • java-design
      • #911: [java] UselessOverridingMethod false positive when elevating access modifier
    • java-errorprone
      • #2242: [java] False-positive MisplacedNullCheck reported
      • #2250: [java] InvalidLogMessageFormat flags logging calls using a slf4j-Marker
      • #2255: [java] InvalidLogMessageFormat false-positive for a lambda argument
    • 🐎 java-performance
      • #2275: [java] AppendCharacterWithChar flags literals in an expression
    • plsql
      • #2325: [plsql] NullPointerException while running parsing test for CREATE TRIGGER
      • #2327: [plsql] Parsing of WHERE CURRENT OF
      • #2328: [plsql] Support XMLROOT
      • #2331: [plsql] Fix in Comment statement
      • #2332: [plsql] Fixed Execute Immediate statement parsing
      • #2340: [plsql] Fixed parsing / as divide or execute

    API Changes

    πŸ—„ 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
    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 VmNode 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.

    External Contributions

  • v6.21.0 Changes

    January 24, 2020

    24-January-2020 - 6.21.0

    The PMD team is pleased to announce PMD 6.21.0.

    πŸš€ This is a minor release.

    Table Of Contents

    πŸ†• New and noteworthy

    πŸ‘ Modelica support

    πŸ‘ Thanks to Anatoly Trosinenko PMD supports now a new language:
    Modelica is a language to model complex physical systems.
    πŸš€ Both PMD and CPD are supported and there are already 3 rules available.
    πŸ‘ The PMD Designer supports syntax highlighting for Modelica.

    πŸ‘ While the language implementation is quite complete, Modelica support is considered experimental
    for now. This is to allow us to change the rule API (e.g. the AST classes) slightly and improve
    the implementation based on your feedback.

    Simple XML dump of AST

    We added a experimental feature to dump the AST of a source file into XML. The XML format
    is of course PMD specific and language dependent. That XML file can be used to execute
    (XPath) queries against without PMD. It can also be used as a textual visualization of the AST
    if you don't want to use the Designer.

    🚚 This feature is experimental and might change or even be removed in the future, if it is not
    πŸš€ useful. A short description how to use it is available under Creating XML dump of the AST.

    Any feedback about it, especially about your use cases, is highly appreciated.

    ⚑️ Updated Apex Support

    • πŸ‘ The Apex language support has been bumped to version 48 (Spring '20). All new language features are now properly
      πŸ“œ parsed and processed.

    CPD XML format

    The CPD XML output format has been enhanced to also report column information for found duplications
    in addition to the line information. This allows to display the exact tokens, that are considered
    duplicate.

    If a CPD language doesn't provide these exact information, then these additional attributes are omitted.

    Each <file> element in the XML format now has 3 new attributes:

    • attribute endline
    • attribute column (if there is column information available)
    • attribute endcolumn (if there is column information available)

    Modified Rules

    The Java rule AvoidLiteralsInIfCondition (java-errorprone) has a new property
    0️⃣ ignoreExpressions. This property is set by default to true in order to maintain compatibility. If this
    property is set to false, then literals in more complex expressions are considered as well.

    The Apex rule ApexCSRF (apex-errorprone) has been moved from category
    πŸ”’ "Security" to "Error Prone". The Apex runtime already prevents DML statements from being executed, but only
    πŸ‘€ at runtime. So, if you try to do this, you'll get an error at runtime, hence this is error prone. See also
    the discussion on #2064.

    The Java rule CommentRequired (java-documentation) has a new property
    πŸ—„ classCommentRequirement. This replaces the now deprecated property headerCommentRequirement, since
    the name was misleading. (File) header comments are not checked, but class comments are.

    πŸ›  Fixed Issues

    • apex
      • #2208: [apex] ASTFormalComment should implement ApexNode<T>
    • core
      • #1984: [java] Cyclomatic complexity is misreported (lack of clearing metrics cache)
      • #2006: [core] PMD should warn about multiple instances of the same rule in a ruleset
      • #2161: [core] ResourceLoader is deprecated and marked as internal but is exposed
      • #2170: [core] DocumentFile doesn't preserve newlines
    • doc
      • #2214: [doc] Link broken in pmd documentation for writing Xpath rules
    • java
      • #2212: [java] JavaRuleViolation reports wrong class name
    • java-bestpractices
      • #2149: [java] JUnitAssertionsShouldIncludeMessage - False positive with assertEquals and JUnit5
    • πŸ’… java-codestyle
      • #2167: [java] UnnecessaryLocalBeforeReturn false positive with variable captured by method reference
    • πŸ“š java-documentation
      • #1683: [java] CommentRequired property names are inconsistent
    • java-errorprone
      • #2140: [java] AvoidLiteralsInIfCondition: false negative for expressions
      • #2196: [java] InvalidLogMessageFormat does not detect extra parameters when no placeholders
    • 🐎 java-performance
      • #2141: [java] StringInstatiation: False negative with String-array access
    • plsql
      • #2008: [plsql] In StringLiteral using alternative quoting mechanism single quotes cause parsing errors
      • #2009: [plsql] Multiple DDL commands are skipped during parsing

    API Changes

    πŸ—„ 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

    External Contributions

  • v6.21.0-with Changes

    January 24, 2020

    πŸš€ This release is identical to the 6.21.0 release, but it includes the newest version of the rule designer. Technically it's a prerelease of 6.22.0 (you'll find that the jar versions reflect this).

    πŸš€ PMD release notes

    πŸš€ Please refer to the 6.21.0 PMD release

    πŸš€ Designer release notes

    πŸš€ Please refer to the 6.21.0 designer release