Files
pmd/docs/pages/release_notes.md
Andreas Dangel 86cfa9a952 Merge branch 'pr-2685' into master
[java] Fix NoClassDefFoundErrors #2685
2020-08-21 10:42:57 +02:00

8.7 KiB

title, permalink, keywords
title permalink keywords
PMD Release Notes pmd_release_notes.html changelog, release notes

{{ site.pmd.date }} - {{ site.pmd.version }}

The PMD team is pleased to announce PMD {{ site.pmd.version }}.

This is a {{ site.pmd.release_type }} release.

{% tocmaker is_release_notes_processor %}

New and noteworthy

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.

New Rules

  • The new Java rule {% rule "java/bestpractices/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 {% rule "java/errorprone/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.

    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

  • The Java rule {% rule "java/errorprone/DataflowAnomalyAnalysis" %} (java-errorprone) is deprecated in favour of {% rule "java/bestpractices/UnusedAssignment" %} (java-bestpractices), which was introduced in PMD 6.26.0.

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-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
    • #2461: [java] ExcessiveParameterListRule must ignore a private constructor
  • java-errorprone
    • #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
    • #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()

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
  • {% jdoc !!core::Rule#getParserOptions() %}

  • {% jdoc !!core::lang.Parser#getParserOptions() %}

  • {% jdoc !!core::lang.AbstractParser %}

  • {% jdoc !!core::RuleContext#removeAttribute(java.lang.String) %}

  • {% jdoc !!core::RuleContext#getAttribute(java.lang.String) %}

  • {% jdoc !!core::RuleContext#setAttribute(java.lang.String, java.lang.Object) %}

  • {% jdoc apex::lang.apex.ApexParserOptions %}

  • {% jdoc !!java::lang.java.ast.ASTThrowStatement#getFirstClassOrInterfaceTypeImage() %}

  • {% jdoc javascript::lang.ecmascript.EcmascriptParserOptions %}

  • {% jdoc javascript::lang.ecmascript.rule.EcmascriptXPathRule %}

  • {% jdoc xml::lang.xml.XmlParserOptions %}

  • {% jdoc xml::lang.xml.rule.XmlXPathRule %}

  • Properties of {% jdoc xml::lang.xml.rule.AbstractXmlRule %}

  • {% jdoc !!core::Report.ReadableDuration %}

  • Many methods of {% jdoc !!core::Report %}. They are replaced by accessors that produce a List. For example, {% jdoc !a!core::Report#iterator() %} (and implementing Iterable) and {% jdoc !a!core::Report#isEmpty() %} are both replaced by {% jdoc !a!core::Report#getViolations() %}.

  • The dataflow codebase is deprecated for removal in PMD 7. This includes all code in the following packages, and their subpackages:

    • {% jdoc_package plsql::lang.plsql.dfa %}
    • {% jdoc_package java::lang.java.dfa %}
    • {% jdoc_package core::lang.dfa %}
    • and the class {% jdoc plsql::lang.plsql.PLSQLDataFlowHandler %}
  • {% jdoc !!visualforce::lang.vf.VfSimpleCharStream %}

External Contributions

{% endtocmaker %}