forked from phoedos/pmd
Merge branch 'main' into pr-5296
This commit is contained in:
commit
7bfa581511
@ -7453,7 +7453,8 @@
|
|||||||
"avatar_url": "https://avatars.githubusercontent.com/u/16755668?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/16755668?v=4",
|
||||||
"profile": "https://github.com/emouty",
|
"profile": "https://github.com/emouty",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code",
|
||||||
|
"bug"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7820,6 +7821,15 @@
|
|||||||
"bug"
|
"bug"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"login": "thesunlover",
|
||||||
|
"name": "Iskren Stanislavov",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/6734600?v=4",
|
||||||
|
"profile": "https://interop.io/",
|
||||||
|
"contributions": [
|
||||||
|
"bug"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"login": "gudzpoz",
|
"login": "gudzpoz",
|
||||||
"name": "gudzpoz",
|
"name": "gudzpoz",
|
||||||
@ -7846,6 +7856,15 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jdupak",
|
||||||
|
"name": "Jakub Dupak",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/22683640?v=4",
|
||||||
|
"profile": "https://github.com/jdupak",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
repository: pmd/pmd
|
repository: pmd/pmd
|
||||||
|
|
||||||
pmd:
|
pmd:
|
||||||
version: 7.7.0-SNAPSHOT
|
version: 7.8.0-SNAPSHOT
|
||||||
previous_version: 7.6.0
|
previous_version: 7.7.0
|
||||||
date: 2024-10-25
|
date: 2024-11-29
|
||||||
# release types: major, minor, bugfix
|
# release types: major, minor, bugfix
|
||||||
release_type: minor
|
release_type: minor
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -163,7 +163,7 @@ exactly identical.
|
|||||||
{% include custom/cli_option_row.html options="--ignore-literals"
|
{% include custom/cli_option_row.html options="--ignore-literals"
|
||||||
description="Ignore literal values such as numbers and strings when comparing text.
|
description="Ignore literal values such as numbers and strings when comparing text.
|
||||||
By default, literals are not ignored."
|
By default, literals are not ignored."
|
||||||
languages="Java"
|
languages="Java, C++"
|
||||||
%}
|
%}
|
||||||
{% include custom/cli_option_row.html options="--ignore-literal-sequences"
|
{% include custom/cli_option_row.html options="--ignore-literal-sequences"
|
||||||
description="Ignore sequences of literals such as list initializers.
|
description="Ignore sequences of literals such as list initializers.
|
||||||
@ -173,7 +173,7 @@ exactly identical.
|
|||||||
{% include custom/cli_option_row.html options="--ignore-identifiers"
|
{% include custom/cli_option_row.html options="--ignore-identifiers"
|
||||||
description="Ignore names of classes, methods, variables, constants, etc. when comparing text.
|
description="Ignore names of classes, methods, variables, constants, etc. when comparing text.
|
||||||
By default, identifier names are not ignored."
|
By default, identifier names are not ignored."
|
||||||
languages="Java"
|
languages="Java, C++"
|
||||||
%}
|
%}
|
||||||
{% include custom/cli_option_row.html options="--ignore-annotations"
|
{% include custom/cli_option_row.html options="--ignore-annotations"
|
||||||
description="Ignore language annotations (Java) or attributes (C#) when comparing text.
|
description="Ignore language annotations (Java) or attributes (C#) when comparing text.
|
||||||
|
@ -14,48 +14,11 @@ This is a {{ site.pmd.release_type }} release.
|
|||||||
|
|
||||||
### 🚀 New and noteworthy
|
### 🚀 New and noteworthy
|
||||||
|
|
||||||
### 🌟 Rule Changes
|
|
||||||
|
|
||||||
#### Renamed Rules
|
|
||||||
* Several rules for unit testing have been renamed to better reflect their actual scope. Lots of them were called
|
|
||||||
after JUnit / JUnit 4, even when they applied to JUnit 5 and / or TestNG.
|
|
||||||
* {% rule java/bestpractices/UnitTestAssertionsShouldIncludeMessage %} (Java Best Practices) has been renamed from `JUnitAssertionsShouldIncludeMessage`.
|
|
||||||
* {% rule java/bestpractices/UnitTestContainsTooManyAsserts %} (Java Best Practices) has been renamed from `JUnitTestContainsTooManyAsserts`.
|
|
||||||
* {% rule java/bestpractices/UnitTestShouldIncludeAssert %} (Java Best Practices) has been renamed from `JUnitTestsShouldIncludeAssert`.
|
|
||||||
* {% rule java/bestpractices/UnitTestShouldUseAfterAnnotation %} (Java Best Practices) has been renamed from `JUnit4TestShouldUseAfterAnnotation`.
|
|
||||||
* {% rule java/bestpractices/UnitTestShouldUseBeforeAnnotation %} (Java Best Practices) has been renamed from `JUnit4TestShouldUseBeforeAnnotation`.
|
|
||||||
* {% rule java/bestpractices/UnitTestShouldUseTestAnnotation %} (Java Best Practices) has been renamed from `JUnit4TestShouldUseTestAnnotation`.
|
|
||||||
|
|
||||||
The old rule names still work but are deprecated.
|
|
||||||
|
|
||||||
### 🐛 Fixed Issues
|
### 🐛 Fixed Issues
|
||||||
* java
|
|
||||||
* [#4532](https://github.com/pmd/pmd/issues/4532): \[java] Rule misnomer for JUnit* rules
|
|
||||||
* [#5261](https://github.com/pmd/pmd/issues/5261): \[java] Record patterns with empty deconstructor lists lead to NPE
|
|
||||||
* java-codestyle
|
|
||||||
* [#5253](https://github.com/pmd/pmd/issues/5253): \[java] BooleanGetMethodName: False-negatives with `Boolean` wrapper
|
|
||||||
* java-errorprone
|
|
||||||
* [#5067](https://github.com/pmd/pmd/issues/5067): \[java] CloseResource: False positive for FileSystems.getDefault()
|
|
||||||
|
|
||||||
### 🚨 API Changes
|
### 🚨 API Changes
|
||||||
* java-bestpractices
|
|
||||||
* The old rule name `JUnit4TestShouldUseAfterAnnotation` has been deprecated. Use the new name {% rule java/bestpractices/UnitTestShouldUseAfterAnnotation %} instead.
|
|
||||||
* The old rule name `JUnit4TestShouldUseBeforeAnnotation` has been deprecated. Use the new name {% rule java/bestpractices/UnitTestShouldUseBeforeAnnotation %} instead.
|
|
||||||
* The old rule name `JUnit4TestShouldUseTestAnnotation` has been deprecated. Use the new name {% rule java/bestpractices/UnitTestShouldUseTestAnnotation %} instead.
|
|
||||||
* The old rule name `JUnitAssertionsShouldIncludeMessage` has been deprecated. Use the new name {% rule java/bestpractices/UnitTestAssertionsShouldIncludeMessage %} instead.
|
|
||||||
* The old rule name `JUnitTestContainsTooManyAsserts` has been deprecated. Use the new name {% rule java/bestpractices/UnitTestContainsTooManyAsserts %} instead.
|
|
||||||
* The old rule name `JUnitTestsShouldIncludeAssert` has been deprecated. Use the new name {% rule java/bestpractices/UnitTestShouldIncludeAssert %} instead.
|
|
||||||
|
|
||||||
|
### ✨ External Contributions
|
||||||
### ✨ Merged pull requests
|
|
||||||
* [#4965](https://github.com/pmd/pmd/pull/4965): Fix #4532: \[java] Rename JUnit rules with overly restrictive names - [Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod)
|
|
||||||
* [#5225](https://github.com/pmd/pmd/pull/5225): Fix #5067: \[java] CloseResource: False positive for FileSystems.getDefault() - [Lukas Gräf](https://github.com/lukasgraef) (@lukasgraef)
|
|
||||||
* [#5241](https://github.com/pmd/pmd/pull/5241): Ignore javacc code in coverage report - [Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod)
|
|
||||||
* [#5258](https://github.com/pmd/pmd/pull/5258): Ignore generated antlr classes in coverage reports - [Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod)
|
|
||||||
* [#5264](https://github.com/pmd/pmd/pull/5264): Fix #5261: \[java] Fix NPE with empty pattern list - [Clément Fournier](https://github.com/oowekyala) (@oowekyala)
|
|
||||||
* [#5269](https://github.com/pmd/pmd/pull/5269): Fix #5253: \[java] Support Boolean wrapper class for BooleanGetMethodName rule - [Aryant Tripathi](https://github.com/Aryant-Tripathi) (@Aryant-Tripathi)
|
|
||||||
* [#5275](https://github.com/pmd/pmd/pull/5275): Use plugin-classpath to simplify javacc-wrapper.xml - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
|
||||||
* [#5278](https://github.com/pmd/pmd/pull/5278): \[java] CouplingBetweenObjects: improve violation message - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
|
||||||
|
|
||||||
{% endtocmaker %}
|
{% endtocmaker %}
|
||||||
|
|
||||||
|
@ -5,6 +5,132 @@ permalink: pmd_release_notes_old.html
|
|||||||
|
|
||||||
Previous versions of PMD can be downloaded here: [Releases - pmd/pmd (GitHub)](https://github.com/pmd/pmd/releases)
|
Previous versions of PMD can be downloaded here: [Releases - pmd/pmd (GitHub)](https://github.com/pmd/pmd/releases)
|
||||||
|
|
||||||
|
## 25-October-2024 - 7.7.0
|
||||||
|
|
||||||
|
The PMD team is pleased to announce PMD 7.7.0.
|
||||||
|
|
||||||
|
This is a minor release.
|
||||||
|
|
||||||
|
### Table Of Contents
|
||||||
|
|
||||||
|
* [🚀 New and noteworthy](#new-and-noteworthy)
|
||||||
|
* [CPD can now ignore literals and identifiers in C++ code](#cpd-can-now-ignore-literals-and-identifiers-in-c-code)
|
||||||
|
* [🌟 Rule Changes](#rule-changes)
|
||||||
|
* [Changed Rules](#changed-rules)
|
||||||
|
* [Renamed Rules](#renamed-rules)
|
||||||
|
* [🐛 Fixed Issues](#fixed-issues)
|
||||||
|
* [🚨 API Changes](#api-changes)
|
||||||
|
* [✨ Merged pull requests](#merged-pull-requests)
|
||||||
|
* [📦 Dependency updates](#dependency-updates)
|
||||||
|
* [📈 Stats](#stats)
|
||||||
|
|
||||||
|
### 🚀 New and noteworthy
|
||||||
|
|
||||||
|
#### CPD can now ignore literals and identifiers in C++ code
|
||||||
|
|
||||||
|
When searching for duplicated code in C++ differences in literals or identifiers can be
|
||||||
|
ignored now (like in Java). This can be enabled via the command line options `--ignore-literal`
|
||||||
|
and `--ignore-identifiers`.
|
||||||
|
See [PR #5040](https://github.com/pmd/pmd/pull/5040) for details.
|
||||||
|
|
||||||
|
### 🌟 Rule Changes
|
||||||
|
|
||||||
|
#### Changed Rules
|
||||||
|
* [`SwitchStmtsShouldHaveDefault`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#switchstmtsshouldhavedefault) (Java Best Practices) doesn't report empty switch statements anymore.
|
||||||
|
To detect these, use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_codestyle.html#emptycontrolstatement).
|
||||||
|
* [`UnitTestShouldUseAfterAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshoulduseafterannotation) (Java Best Practices) now also considers JUnit 5 and TestNG tests.
|
||||||
|
* [`UnitTestShouldUseBeforeAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshouldusebeforeannotation) (Java Best Practices) now also considers JUnit 5 and TestNG tests.
|
||||||
|
* [`TooFewBranchesForSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_performance.html#toofewbranchesforswitch) (Java Performance) doesn't report empty switches anymore.
|
||||||
|
To detect these, use [`EmptyControlStatement`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_codestyle.html#emptycontrolstatement).
|
||||||
|
|
||||||
|
#### Renamed Rules
|
||||||
|
* Several rules for unit testing have been renamed to better reflect their actual scope. Lots of them were called
|
||||||
|
after JUnit / JUnit 4, even when they applied to JUnit 5 and / or TestNG.
|
||||||
|
* [`UnitTestAssertionsShouldIncludeMessage`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestassertionsshouldincludemessage) (Java Best Practices) has been renamed from `JUnitAssertionsShouldIncludeMessage`.
|
||||||
|
* [`UnitTestContainsTooManyAsserts`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestcontainstoomanyasserts) (Java Best Practices) has been renamed from `JUnitTestContainsTooManyAsserts`.
|
||||||
|
* [`UnitTestShouldIncludeAssert`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshouldincludeassert) (Java Best Practices) has been renamed from `JUnitTestsShouldIncludeAssert`.
|
||||||
|
* [`UnitTestShouldUseAfterAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshoulduseafterannotation) (Java Best Practices) has been renamed from `JUnit4TestShouldUseAfterAnnotation`.
|
||||||
|
* [`UnitTestShouldUseBeforeAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshouldusebeforeannotation) (Java Best Practices) has been renamed from `JUnit4TestShouldUseBeforeAnnotation`.
|
||||||
|
* [`UnitTestShouldUseTestAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshouldusetestannotation) (Java Best Practices) has been renamed from `JUnit4TestShouldUseTestAnnotation`.
|
||||||
|
* Several rules about switch statements and switch expression have been renamed, as they apply both to Switch Statements
|
||||||
|
and to Switch Expressions:
|
||||||
|
* [`DefaultLabelNotLastInSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#defaultlabelnotlastinswitch) (Java Best Practices) has been renamed from `DefaultLabelNotLastInSwitchStmt`.
|
||||||
|
* [`NonCaseLabelInSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_errorprone.html#noncaselabelinswitch) (Java Error Prone) has been renamed from `NonCaseLabelInSwitchStatement`.
|
||||||
|
* [`TooFewBranchesForSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_performance.html#toofewbranchesforswitch) (Java Performance) has been renamed from `TooFewBranchesForASwitchStatement`.
|
||||||
|
* [`NonExhaustiveSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#nonexhaustiveswitch) (Java Best Practices) has been renamed from `SwitchStmtsShouldHaveDefault`.
|
||||||
|
|
||||||
|
The old rule names still work but are deprecated.
|
||||||
|
|
||||||
|
### 🐛 Fixed Issues
|
||||||
|
* apex-performance
|
||||||
|
* [#5270](https://github.com/pmd/pmd/issues/5270): \[apex] AvoidNonRestrictiveQueries when LIMIT is followed by bind expression
|
||||||
|
* java
|
||||||
|
* [#4532](https://github.com/pmd/pmd/issues/4532): \[java] Rule misnomer for JUnit* rules
|
||||||
|
* [#5261](https://github.com/pmd/pmd/issues/5261): \[java] Record patterns with empty deconstructor lists lead to NPE
|
||||||
|
* java-bestpractices
|
||||||
|
* [#4286](https://github.com/pmd/pmd/issues/4286): \[java] Rename rule SwitchStmtsShouldHaveDefault to NonExhaustiveSwitch
|
||||||
|
* [#4813](https://github.com/pmd/pmd/issues/4813): \[java] SwitchStmtsShouldHaveDefault false positive with pattern matching
|
||||||
|
* java-codestyle
|
||||||
|
* [#5253](https://github.com/pmd/pmd/issues/5253): \[java] BooleanGetMethodName: False-negatives with `Boolean` wrapper
|
||||||
|
* java-design
|
||||||
|
* [#5030](https://github.com/pmd/pmd/issues/5030): \[java] SwitchDensity false positive with pattern matching
|
||||||
|
* java-errorprone
|
||||||
|
* [#3362](https://github.com/pmd/pmd/issues/3362): \[java] ImplicitSwitchFallThrough should consider switch expressions
|
||||||
|
* [#5067](https://github.com/pmd/pmd/issues/5067): \[java] CloseResource: False positive for FileSystems.getDefault()
|
||||||
|
* [#5244](https://github.com/pmd/pmd/issues/5244): \[java] UselessOperationOnImmutable should detect java.time types
|
||||||
|
* [#5257](https://github.com/pmd/pmd/issues/5257): \[java] NonCaseLabelInSwitch should consider switch expressions
|
||||||
|
* java-performance
|
||||||
|
* [#5249](https://github.com/pmd/pmd/issues/5249): \[java] TooFewBranchesForASwitchStatement false positive for Pattern Matching
|
||||||
|
* [#5250](https://github.com/pmd/pmd/issues/5250): \[java] TooFewBranchesForASwitchStatement should consider Switch Expressions
|
||||||
|
|
||||||
|
### 🚨 API Changes
|
||||||
|
* java-bestpractices
|
||||||
|
* The old rule name `JUnit4TestShouldUseAfterAnnotation` has been deprecated. Use the new name [`UnitTestShouldUseAfterAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshoulduseafterannotation) instead.
|
||||||
|
* The old rule name `JUnit4TestShouldUseBeforeAnnotation` has been deprecated. Use the new name [`UnitTestShouldUseBeforeAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshouldusebeforeannotation) instead.
|
||||||
|
* The old rule name `JUnit4TestShouldUseTestAnnotation` has been deprecated. Use the new name [`UnitTestShouldUseTestAnnotation`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshouldusetestannotation) instead.
|
||||||
|
* The old rule name `JUnitAssertionsShouldIncludeMessage` has been deprecated. Use the new name [`UnitTestAssertionsShouldIncludeMessage`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestassertionsshouldincludemessage) instead.
|
||||||
|
* The old rule name `JUnitTestContainsTooManyAsserts` has been deprecated. Use the new name [`UnitTestContainsTooManyAsserts`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestcontainstoomanyasserts) instead.
|
||||||
|
* The old rule name `JUnitTestsShouldIncludeAssert` has been deprecated. Use the new name [`UnitTestShouldIncludeAssert`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#unittestshouldincludeassert) instead.
|
||||||
|
* The old rule name `DefaultLabelNotLastInSwitchStmt` has been deprecated. Use the new name [`DefaultLabelNotLastInSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#defaultlabelnotlastinswitch) instead.
|
||||||
|
* The old rule name `SwitchStmtsShouldHaveDefault` has been deprecated. USe the new name [`NonExhaustiveSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_bestpractices.html#nonexhaustiveswitch) instead.
|
||||||
|
* java-errorprone
|
||||||
|
* The old rule name `NonCaseLabelInSwitchStatement` has been deprecated. Use the new name [`NonCaseLabelInSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_errorprone.html#noncaselabelinswitch) instead.
|
||||||
|
* java-performance
|
||||||
|
* The old rule name `TooFewBranchesForASwitchStatement` has been deprecated. Use the new name [`TooFewBranchesForSwitch`](https://docs.pmd-code.org/pmd-doc-7.7.0/pmd_rules_java_performance.html#toofewbranchesforswitch) instead.
|
||||||
|
|
||||||
|
### ✨ Merged pull requests
|
||||||
|
* [#4965](https://github.com/pmd/pmd/pull/4965): Fix #4532: \[java] Rename JUnit rules with overly restrictive names - [Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod)
|
||||||
|
* [#5040](https://github.com/pmd/pmd/pull/5040): \[cpp] Ignore literals and ignore identifiers capability to C++ CPD - [Jakub Dupak](https://github.com/jdupak) (@jdupak)
|
||||||
|
* [#5225](https://github.com/pmd/pmd/pull/5225): Fix #5067: \[java] CloseResource: False positive for FileSystems.getDefault() - [Lukas Gräf](https://github.com/lukasgraef) (@lukasgraef)
|
||||||
|
* [#5241](https://github.com/pmd/pmd/pull/5241): Ignore javacc code in coverage report - [Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod)
|
||||||
|
* [#5245](https://github.com/pmd/pmd/pull/5245): \[java] Improve UnitTestShouldUse{After,Before}Annotation rules to support JUnit5 and TestNG - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5247](https://github.com/pmd/pmd/pull/5247): Fix #5030: \[java] SwitchDensity false positive with pattern matching - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5248](https://github.com/pmd/pmd/pull/5248): Fix #3362: \[java] ImplicitSwitchFallThrough should consider switch expressions - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5251](https://github.com/pmd/pmd/pull/5251): Fix #5249 and #5250: \[java] TooFewBranchesForSwitch ignore pattern matching and support switch expressions - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5252](https://github.com/pmd/pmd/pull/5252): Fix #4813: \[java] SwitchStmtsShouldHaveDefault false positive with pattern matching - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5255](https://github.com/pmd/pmd/pull/5255): \[java] Rename rule DefaultLabelNotLastInSwitch - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5256](https://github.com/pmd/pmd/pull/5256): Fix #5257: \[java] NonCaseLabelInSwitch - support switch expressions - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5258](https://github.com/pmd/pmd/pull/5258): Ignore generated antlr classes in coverage reports - [Juan Martín Sotuyo Dodero](https://github.com/jsotuyod) (@jsotuyod)
|
||||||
|
* [#5264](https://github.com/pmd/pmd/pull/5264): Fix #5261: \[java] Fix NPE with empty pattern list - [Clément Fournier](https://github.com/oowekyala) (@oowekyala)
|
||||||
|
* [#5267](https://github.com/pmd/pmd/pull/5267): \[java] Rename rule SwitchStmtsShouldHaveDefault to NonExhaustiveSwitch - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5269](https://github.com/pmd/pmd/pull/5269): Fix #5253: \[java] Support Boolean wrapper class for BooleanGetMethodName rule - [Aryant Tripathi](https://github.com/Aryant-Tripathi) (@Aryant-Tripathi)
|
||||||
|
* [#5273](https://github.com/pmd/pmd/pull/5273): Fix #5270: \[apex] AvoidNonRestrictiveQueries: Fix regex for detecting LIMIT clause - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5275](https://github.com/pmd/pmd/pull/5275): Use plugin-classpath to simplify javacc-wrapper.xml - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5278](https://github.com/pmd/pmd/pull/5278): \[java] CouplingBetweenObjects: improve violation message - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
* [#5279](https://github.com/pmd/pmd/pull/5279): Fix #5244: \[java] UselessOperationOnImmutable: consider java.time.* types - [Andreas Dangel](https://github.com/adangel) (@adangel)
|
||||||
|
|
||||||
|
### 📦 Dependency updates
|
||||||
|
* [#5234](https://github.com/pmd/pmd/issues/5234): Bump com.google.protobuf:protobuf-java from 3.25.3 to 4.28.2
|
||||||
|
* [#5274](https://github.com/pmd/pmd/issues/5274): Bump org.junit from 5.8.2 to 5.11.2
|
||||||
|
* [#5276](https://github.com/pmd/pmd/issues/5276): Bump org.checkerframework:checker-qual from 2.11.1 to 3.48.1
|
||||||
|
* [#5280](https://github.com/pmd/pmd/issues/5280): Bump danger from 9.5.0 to 9.5.1 in the all-gems group across 1 directory
|
||||||
|
* [#5281](https://github.com/pmd/pmd/issues/5281): Bump org.scala-lang:scala-reflect from 2.13.13 to 2.13.15
|
||||||
|
|
||||||
|
### 📈 Stats
|
||||||
|
* 98 commits
|
||||||
|
* 32 closed tickets & PRs
|
||||||
|
* Days since last release: 27
|
||||||
|
|
||||||
## 27-September-2024 - 7.6.0
|
## 27-September-2024 - 7.6.0
|
||||||
|
|
||||||
The PMD team is pleased to announce PMD 7.6.0.
|
The PMD team is pleased to announce PMD 7.6.0.
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import java.io.IOException;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.OutputStreamWriter;
|
import java.io.OutputStreamWriter;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
@ -21,8 +22,6 @@ import java.util.List;
|
|||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.reflect.FieldUtils;
|
|
||||||
import org.apache.commons.lang3.reflect.MethodUtils;
|
|
||||||
import org.apache.tools.ant.BuildException;
|
import org.apache.tools.ant.BuildException;
|
||||||
import org.apache.tools.ant.Project;
|
import org.apache.tools.ant.Project;
|
||||||
import org.apache.tools.ant.types.Parameter;
|
import org.apache.tools.ant.types.Parameter;
|
||||||
@ -200,10 +199,12 @@ public class Formatter {
|
|||||||
if (console != null) {
|
if (console != null) {
|
||||||
// Since Java 22, this returns a console even for redirected streams.
|
// Since Java 22, this returns a console even for redirected streams.
|
||||||
// In that case, we need to check Console.isTerminal()
|
// In that case, we need to check Console.isTerminal()
|
||||||
|
// https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/io/Console.html#isTerminal()
|
||||||
// See: JLine As The Default Console Provider (JDK-8308591)
|
// See: JLine As The Default Console Provider (JDK-8308591)
|
||||||
try {
|
try {
|
||||||
Boolean isTerminal = (Boolean) MethodUtils.invokeMethod(console, "isTerminal");
|
Method method = Console.class.getMethod("isTerminal");
|
||||||
if (!isTerminal) {
|
Object isTerminal = method.invoke(console);
|
||||||
|
if (isTerminal instanceof Boolean && !(Boolean) isTerminal) {
|
||||||
// stop here, we don't have an interactive console.
|
// stop here, we don't have an interactive console.
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -211,39 +212,58 @@ public class Formatter {
|
|||||||
// fall-through - we use a Java Runtime < 22.
|
// fall-through - we use a Java Runtime < 22.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Maybe this is Java17+? Then there will be a public method charset()
|
||||||
|
// https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/Console.html#charset()
|
||||||
try {
|
try {
|
||||||
Object res = FieldUtils.readDeclaredField(console, "cs", true);
|
Method method = Console.class.getMethod("charset");
|
||||||
if (res instanceof Charset) {
|
Object charset = method.invoke(console);
|
||||||
return ((Charset) res).name();
|
if (charset instanceof Charset) {
|
||||||
|
return ((Charset) charset).name();
|
||||||
|
}
|
||||||
|
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException ignored) {
|
||||||
|
// fall-through
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// try to use the system property "sun.jnu.encoding", which is the platform encoding.
|
||||||
|
// this property is not specified and might not always be available, but it is for
|
||||||
|
// openjdk 11: https://github.com/openjdk/jdk11u/blob/cee8535a9d3de8558b4b5028d68e397e508bef71/src/java.base/share/native/libjava/System.c#L384
|
||||||
|
// if it exists, we use it - this avoids illegal reflective access below.
|
||||||
|
String jnuEncoding = System.getProperty("sun.jnu.encoding");
|
||||||
|
if (jnuEncoding != null) {
|
||||||
|
return jnuEncoding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// the following parts are accessing private/protected fields via reflection
|
||||||
|
// this should work with Java 8 and 11. With Java 11, you'll see warnings abouts
|
||||||
|
// illegal reflective access, see #1860. However, the access still works.
|
||||||
|
|
||||||
|
// Fall-Back 1: private field "cs" in java.io.Console
|
||||||
|
try {
|
||||||
|
Field field = Console.class.getDeclaredField("cs");
|
||||||
|
field.setAccessible(true);
|
||||||
|
Object csField = field.get(console);
|
||||||
|
if (csField instanceof Charset) {
|
||||||
|
return ((Charset) csField).name();
|
||||||
}
|
}
|
||||||
} catch (IllegalArgumentException | ReflectiveOperationException ignored) {
|
} catch (IllegalArgumentException | ReflectiveOperationException ignored) {
|
||||||
// fall-through
|
// fall-through
|
||||||
}
|
}
|
||||||
|
|
||||||
// Maybe this is Java17+? Then there will be
|
// Fall-Back 2: private native method "encoding()" in java.io.Console
|
||||||
// https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/Console.html#charset()
|
|
||||||
// instead of the field "cs".
|
|
||||||
try {
|
try {
|
||||||
Method charsetMethod = Console.class.getDeclaredMethod("charset");
|
Method method = Console.class.getDeclaredMethod("encoding");
|
||||||
Charset charset = (Charset) charsetMethod.invoke(console);
|
method.setAccessible(true);
|
||||||
return charset.name();
|
Object encoding = method.invoke(console);
|
||||||
} catch (IllegalArgumentException | ReflectiveOperationException ignored) {
|
if (encoding instanceof String) {
|
||||||
|
return (String) encoding;
|
||||||
|
}
|
||||||
|
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException ignored) {
|
||||||
// fall-through
|
// fall-through
|
||||||
}
|
}
|
||||||
return getNativeConsoleEncoding();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getNativeConsoleEncoding() {
|
|
||||||
try {
|
|
||||||
Object res = MethodUtils.invokeStaticMethod(Console.class, "encoding");
|
|
||||||
if (res instanceof String) {
|
|
||||||
return (String) res;
|
|
||||||
}
|
|
||||||
} catch (IllegalArgumentException | ReflectiveOperationException ignored) {
|
|
||||||
// fall-through
|
|
||||||
}
|
}
|
||||||
|
// we couldn't determine the correct platform console encoding
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ import net.sourceforge.pmd.lang.rule.RuleTargetSelector;
|
|||||||
import net.sourceforge.pmd.reporting.RuleContext;
|
import net.sourceforge.pmd.reporting.RuleContext;
|
||||||
|
|
||||||
public class AvoidNonRestrictiveQueriesRule extends AbstractApexRule {
|
public class AvoidNonRestrictiveQueriesRule extends AbstractApexRule {
|
||||||
private static final Pattern RESTRICTIVE_PATTERN = Pattern.compile("(where\\s+)|(limit\\s+)", Pattern.CASE_INSENSITIVE);
|
private static final Pattern RESTRICTIVE_PATTERN = Pattern.compile("\\b(where|limit)\\b", Pattern.CASE_INSENSITIVE);
|
||||||
private static final Pattern SELECT_OR_FIND_PATTERN = Pattern.compile("(select\\s+|find\\s+)", Pattern.CASE_INSENSITIVE);
|
private static final Pattern SELECT_OR_FIND_PATTERN = Pattern.compile("(select\\s+|find\\s+)", Pattern.CASE_INSENSITIVE);
|
||||||
private static final Pattern SUB_QUERY_PATTERN = Pattern.compile("(?i)\\(\\s*select\\s+[^)]+\\)");
|
private static final Pattern SUB_QUERY_PATTERN = Pattern.compile("(?i)\\(\\s*select\\s+[^)]+\\)");
|
||||||
|
|
||||||
|
@ -260,6 +260,36 @@ public class Something {
|
|||||||
.isEmpty();
|
.isEmpty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
]]></code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>[apex] AvoidNonRestrictiveQueries when LIMIT is followed by bind expression #5270</description>
|
||||||
|
<expected-problems>0</expected-problems>
|
||||||
|
<code><![CDATA[
|
||||||
|
public with sharing class DemoController {
|
||||||
|
public static final Integer LIMIT_ACCOUNTS = 2;
|
||||||
|
@AuraEnabled
|
||||||
|
public static List<Account> getTwoAccounts() {
|
||||||
|
List<Account> result = [
|
||||||
|
SELECT Id, Name FROM Account WITH SECURITY_ENFORCED
|
||||||
|
LIMIT:LIMIT_ACCOUNTS // note: no spaces... - false positive here
|
||||||
|
];
|
||||||
|
List<Account> result2 = [
|
||||||
|
SELECT Id, Name FROM Account WITH SECURITY_ENFORCED
|
||||||
|
LIMIT :LIMIT_ACCOUNTS
|
||||||
|
];
|
||||||
|
List<Account> result3 = [
|
||||||
|
SELECT Id, Name FROM Account WITH SECURITY_ENFORCED
|
||||||
|
LIMIT : LIMIT_ACCOUNTS
|
||||||
|
];
|
||||||
|
|
||||||
|
// sosl:
|
||||||
|
List<List<SObject>> searchList = [FIND 'map*' IN ALL FIELDS RETURNING Account (Id, Name), Contact, Opportunity, Lead LIMIT:LIMIT_ACCOUNTS];
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
]]></code>
|
]]></code>
|
||||||
</test-code>
|
</test-code>
|
||||||
</test-data>
|
</test-data>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -47,6 +47,8 @@ public class CppLanguageModule extends CpdOnlyLanguageModuleBase {
|
|||||||
LanguagePropertyBundle bundle = super.newPropertyBundle();
|
LanguagePropertyBundle bundle = super.newPropertyBundle();
|
||||||
bundle.definePropertyDescriptor(CpdLanguageProperties.CPD_IGNORE_LITERAL_SEQUENCES);
|
bundle.definePropertyDescriptor(CpdLanguageProperties.CPD_IGNORE_LITERAL_SEQUENCES);
|
||||||
bundle.definePropertyDescriptor(CpdLanguageProperties.CPD_IGNORE_LITERAL_AND_IDENTIFIER_SEQUENCES);
|
bundle.definePropertyDescriptor(CpdLanguageProperties.CPD_IGNORE_LITERAL_AND_IDENTIFIER_SEQUENCES);
|
||||||
|
bundle.definePropertyDescriptor(CpdLanguageProperties.CPD_ANONYMIZE_IDENTIFIERS);
|
||||||
|
bundle.definePropertyDescriptor(CpdLanguageProperties.CPD_ANONYMIZE_LITERALS);
|
||||||
bundle.definePropertyDescriptor(CPD_SKIP_BLOCKS);
|
bundle.definePropertyDescriptor(CPD_SKIP_BLOCKS);
|
||||||
return bundle;
|
return bundle;
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,9 @@ import java.util.regex.Pattern;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import net.sourceforge.pmd.cpd.CpdLanguageProperties;
|
import net.sourceforge.pmd.cpd.CpdLanguageProperties;
|
||||||
import net.sourceforge.pmd.cpd.impl.CpdLexerBase;
|
import net.sourceforge.pmd.cpd.TokenFactory;
|
||||||
import net.sourceforge.pmd.cpd.impl.JavaCCTokenFilter;
|
import net.sourceforge.pmd.cpd.impl.JavaCCTokenFilter;
|
||||||
|
import net.sourceforge.pmd.cpd.impl.JavaccCpdLexer;
|
||||||
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
|
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
|
||||||
import net.sourceforge.pmd.lang.TokenManager;
|
import net.sourceforge.pmd.lang.TokenManager;
|
||||||
import net.sourceforge.pmd.lang.ast.impl.javacc.CharStream;
|
import net.sourceforge.pmd.lang.ast.impl.javacc.CharStream;
|
||||||
@ -26,17 +27,21 @@ import net.sourceforge.pmd.lang.document.TextDocument;
|
|||||||
*
|
*
|
||||||
* <p>Note: This class has been called CPPTokenizer in PMD 6</p>.
|
* <p>Note: This class has been called CPPTokenizer in PMD 6</p>.
|
||||||
*/
|
*/
|
||||||
public class CppCpdLexer extends CpdLexerBase<JavaccToken> {
|
public class CppCpdLexer extends JavaccCpdLexer {
|
||||||
|
|
||||||
private boolean skipBlocks;
|
private boolean skipBlocks;
|
||||||
private Pattern skipBlocksStart;
|
private Pattern skipBlocksStart;
|
||||||
private Pattern skipBlocksEnd;
|
private Pattern skipBlocksEnd;
|
||||||
private final boolean ignoreIdentifierAndLiteralSeqences;
|
private final boolean ignoreIdentifierAndLiteralSeqences;
|
||||||
private final boolean ignoreLiteralSequences;
|
private final boolean ignoreLiteralSequences;
|
||||||
|
private final boolean ignoreLiterals;
|
||||||
|
private final boolean ignoreIdentifiers;
|
||||||
|
|
||||||
public CppCpdLexer(LanguagePropertyBundle cppProperties) {
|
public CppCpdLexer(LanguagePropertyBundle cppProperties) {
|
||||||
ignoreLiteralSequences = cppProperties.getProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_SEQUENCES);
|
ignoreLiteralSequences = cppProperties.getProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_SEQUENCES);
|
||||||
ignoreIdentifierAndLiteralSeqences = cppProperties.getProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_AND_IDENTIFIER_SEQUENCES);
|
ignoreIdentifierAndLiteralSeqences = cppProperties.getProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_AND_IDENTIFIER_SEQUENCES);
|
||||||
|
ignoreLiterals = cppProperties.getProperty(CpdLanguageProperties.CPD_ANONYMIZE_LITERALS);
|
||||||
|
ignoreIdentifiers = cppProperties.getProperty(CpdLanguageProperties.CPD_ANONYMIZE_IDENTIFIERS);
|
||||||
String skipBlocksPattern = cppProperties.getProperty(CppLanguageModule.CPD_SKIP_BLOCKS);
|
String skipBlocksPattern = cppProperties.getProperty(CppLanguageModule.CPD_SKIP_BLOCKS);
|
||||||
if (StringUtils.isNotBlank(skipBlocksPattern)) {
|
if (StringUtils.isNotBlank(skipBlocksPattern)) {
|
||||||
skipBlocks = true;
|
skipBlocks = true;
|
||||||
@ -73,6 +78,23 @@ public class CppCpdLexer extends CpdLexerBase<JavaccToken> {
|
|||||||
return new CppTokenFilter(tokenManager, ignoreLiteralSequences, ignoreIdentifierAndLiteralSeqences);
|
return new CppTokenFilter(tokenManager, ignoreLiteralSequences, ignoreIdentifierAndLiteralSeqences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void processToken(TokenFactory tokenEntries, JavaccToken currentToken) {
|
||||||
|
int kind = currentToken.getKind();
|
||||||
|
String image = currentToken.getImage();
|
||||||
|
|
||||||
|
boolean isLiteral = kind == CppTokenKinds.STRING || kind == CppTokenKinds.RSTRING || kind == CppTokenKinds.CHARACTER || kind == CppTokenKinds.DECIMAL_INT_LITERAL || kind == CppTokenKinds.HEXADECIMAL_INT_LITERAL || kind == CppTokenKinds.OCTAL_INT_LITERAL || kind == CppTokenKinds.FLOAT_LITERAL || kind == CppTokenKinds.BINARY_INT_LITERAL || kind == CppTokenKinds.ZERO;
|
||||||
|
if (ignoreLiterals && isLiteral) {
|
||||||
|
image = CppTokenKinds.describe(kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ignoreIdentifiers && (kind == CppTokenKinds.ID)) {
|
||||||
|
image = CppTokenKinds.describe(kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
tokenEntries.recordToken(image, currentToken.getReportLocation());
|
||||||
|
}
|
||||||
|
|
||||||
private static class CppTokenFilter extends JavaCCTokenFilter {
|
private static class CppTokenFilter extends JavaCCTokenFilter {
|
||||||
|
|
||||||
private final boolean ignoreLiteralSequences;
|
private final boolean ignoreLiteralSequences;
|
||||||
|
@ -59,6 +59,16 @@ class CppCpdLexerTest extends CpdTextComparisonTest {
|
|||||||
doTest("specialComments");
|
doTest("specialComments");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testIgnoreLiterals() {
|
||||||
|
doTest("ignoreLiterals", "", ignoreLiterals());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testIgnoreIdents() {
|
||||||
|
doTest("ignoreIdents", "", ignoreIdents());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testMultiLineMacros() {
|
void testMultiLineMacros() {
|
||||||
doTest("multilineMacros");
|
doTest("multilineMacros");
|
||||||
@ -142,7 +152,7 @@ class CppCpdLexerTest extends CpdTextComparisonTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static LanguagePropertyConfig skipBlocks(String skipPattern) {
|
private static LanguagePropertyConfig skipBlocks(String skipPattern) {
|
||||||
return properties(true, skipPattern, false, false);
|
return properties(true, skipPattern, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LanguagePropertyConfig skipBlocks() {
|
private static LanguagePropertyConfig skipBlocks() {
|
||||||
@ -150,22 +160,31 @@ class CppCpdLexerTest extends CpdTextComparisonTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static LanguagePropertyConfig dontSkipBlocks() {
|
private static LanguagePropertyConfig dontSkipBlocks() {
|
||||||
return properties(false, null, false, false);
|
return properties(false, null, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LanguagePropertyConfig skipLiteralSequences() {
|
private static LanguagePropertyConfig skipLiteralSequences() {
|
||||||
return properties(false, null, true, false);
|
return properties(false, null, true, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LanguagePropertyConfig skipIdentifierAndLiteralsSequences() {
|
private static LanguagePropertyConfig skipIdentifierAndLiteralsSequences() {
|
||||||
return properties(false, null, true, true);
|
return properties(false, null, true, true, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LanguagePropertyConfig skipIdentifierSequences() {
|
private static LanguagePropertyConfig skipIdentifierSequences() {
|
||||||
return properties(false, null, false, true);
|
return properties(false, null, false, true, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LanguagePropertyConfig properties(boolean skipBlocks, String skipPattern, boolean skipLiteralSequences, boolean skipSequences) {
|
private static LanguagePropertyConfig ignoreIdents() {
|
||||||
|
return properties(false, null, false, false, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LanguagePropertyConfig ignoreLiterals() {
|
||||||
|
return properties(false, null, false, false, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static LanguagePropertyConfig properties(boolean skipBlocks, String skipPattern, boolean skipLiteralSequences, boolean skipSequences, boolean ignoreLiterals, boolean ignoreIdents) {
|
||||||
return properties -> {
|
return properties -> {
|
||||||
if (!skipBlocks) {
|
if (!skipBlocks) {
|
||||||
properties.setProperty(CppLanguageModule.CPD_SKIP_BLOCKS, "");
|
properties.setProperty(CppLanguageModule.CPD_SKIP_BLOCKS, "");
|
||||||
@ -174,6 +193,8 @@ class CppCpdLexerTest extends CpdTextComparisonTest {
|
|||||||
}
|
}
|
||||||
properties.setProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_SEQUENCES, skipLiteralSequences);
|
properties.setProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_SEQUENCES, skipLiteralSequences);
|
||||||
properties.setProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_AND_IDENTIFIER_SEQUENCES, skipSequences);
|
properties.setProperty(CpdLanguageProperties.CPD_IGNORE_LITERAL_AND_IDENTIFIER_SEQUENCES, skipSequences);
|
||||||
|
properties.setProperty(CpdLanguageProperties.CPD_ANONYMIZE_LITERALS, ignoreLiterals);
|
||||||
|
properties.setProperty(CpdLanguageProperties.CPD_ANONYMIZE_IDENTIFIERS, ignoreIdents);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
6
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreIdents.cpp
vendored
Normal file
6
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreIdents.cpp
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
class Test {
|
||||||
|
void f(int a, float b) {
|
||||||
|
auto c = a + b;
|
||||||
|
int d = 6;
|
||||||
|
}
|
||||||
|
}
|
35
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreIdents.txt
vendored
Normal file
35
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreIdents.txt
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
[Image] or [Truncated image[ Bcol Ecol
|
||||||
|
L1
|
||||||
|
[class] 1 6
|
||||||
|
[<ID>] 7 11
|
||||||
|
[{] 12 13
|
||||||
|
L2
|
||||||
|
[void] 2 6
|
||||||
|
[<ID>] 7 8
|
||||||
|
[(] 8 9
|
||||||
|
[int] 9 12
|
||||||
|
[<ID>] 13 14
|
||||||
|
[,] 14 15
|
||||||
|
[float] 16 21
|
||||||
|
[<ID>] 22 23
|
||||||
|
[)] 23 24
|
||||||
|
[{] 25 26
|
||||||
|
L3
|
||||||
|
[auto] 3 7
|
||||||
|
[<ID>] 8 9
|
||||||
|
[=] 10 11
|
||||||
|
[<ID>] 12 13
|
||||||
|
[+] 14 15
|
||||||
|
[<ID>] 16 17
|
||||||
|
[;] 17 18
|
||||||
|
L4
|
||||||
|
[int] 3 6
|
||||||
|
[<ID>] 7 8
|
||||||
|
[=] 9 10
|
||||||
|
[6] 11 12
|
||||||
|
[;] 12 13
|
||||||
|
L5
|
||||||
|
[}] 2 3
|
||||||
|
L6
|
||||||
|
[}] 1 2
|
||||||
|
EOF
|
43
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreLiterals.cpp
vendored
Normal file
43
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreLiterals.cpp
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
void main() {
|
||||||
|
char x = L'a'; // wide chars
|
||||||
|
x = '\0x05'; // hex
|
||||||
|
// x = L''; // empty character is an error
|
||||||
|
|
||||||
|
print("\ oMedia"); // whitespace escape
|
||||||
|
|
||||||
|
|
||||||
|
// char prefixes
|
||||||
|
char16_t c = u'\u00F6';
|
||||||
|
wchar_t b = L'\xFFEF';
|
||||||
|
char a = '\x30';
|
||||||
|
char32_t d = U'\U0010FFFF';
|
||||||
|
|
||||||
|
// string prefixes
|
||||||
|
char A[] = "Hello\x0A";
|
||||||
|
wchar_t B[] = L"Hell\xF6\x0A";
|
||||||
|
char16_t C[] = u"Hell\u00F6";
|
||||||
|
char32_t D[] = U"Hell\U000000F6\U0010FFFF";
|
||||||
|
auto E[] = u8"\u00F6\U0010FFFF";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char* rawString = R"(
|
||||||
|
[Sinks.1]
|
||||||
|
Destination=Console
|
||||||
|
AutoFlush=true
|
||||||
|
Format="[%TimeStamp%] %ThreadId% %QueryIdHigh% %QueryIdLow% %LoggerFile%:%Line% (%Severity%) - %Message%"
|
||||||
|
Filter="%Severity% >= WRN"
|
||||||
|
)";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// digit separators
|
||||||
|
auto integer_literal = 1'000''000;
|
||||||
|
auto floating_point_literal = 0.000'015'3;
|
||||||
|
auto hex_literal = 0x0F00'abcd'6f3d;
|
||||||
|
auto silly_example = 1'0'0'000'00;
|
||||||
|
|
||||||
|
// boolean literals
|
||||||
|
int b1 = 0B001101; // C++ 14 binary literal
|
||||||
|
int b2 = 0b000001; // C++ 14 binary literal
|
||||||
|
}
|
135
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreLiterals.txt
vendored
Normal file
135
pmd-cpp/src/test/resources/net/sourceforge/pmd/lang/cpp/cpd/testdata/ignoreLiterals.txt
vendored
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
[Image] or [Truncated image[ Bcol Ecol
|
||||||
|
L1
|
||||||
|
[void] 2 6
|
||||||
|
[main] 7 11
|
||||||
|
[(] 11 12
|
||||||
|
[)] 12 13
|
||||||
|
[{] 14 15
|
||||||
|
L2
|
||||||
|
[char] 5 9
|
||||||
|
[x] 10 11
|
||||||
|
[=] 12 13
|
||||||
|
[<CHARACTER>] 14 18
|
||||||
|
[;] 18 19
|
||||||
|
L3
|
||||||
|
[x] 5 6
|
||||||
|
[=] 7 8
|
||||||
|
[<CHARACTER>] 9 16
|
||||||
|
[;] 16 17
|
||||||
|
L6
|
||||||
|
[print] 5 10
|
||||||
|
[(] 10 11
|
||||||
|
[<STRING>] 11 24
|
||||||
|
[)] 24 25
|
||||||
|
[;] 25 26
|
||||||
|
L10
|
||||||
|
[char16_t] 5 13
|
||||||
|
[c] 14 15
|
||||||
|
[=] 16 17
|
||||||
|
[<CHARACTER>] 18 27
|
||||||
|
[;] 27 28
|
||||||
|
L11
|
||||||
|
[wchar_t] 5 12
|
||||||
|
[b] 13 14
|
||||||
|
[=] 15 16
|
||||||
|
[<CHARACTER>] 17 26
|
||||||
|
[;] 26 27
|
||||||
|
L12
|
||||||
|
[char] 5 9
|
||||||
|
[a] 10 11
|
||||||
|
[=] 12 13
|
||||||
|
[<CHARACTER>] 15 21
|
||||||
|
[;] 21 22
|
||||||
|
L13
|
||||||
|
[char32_t] 5 13
|
||||||
|
[d] 14 15
|
||||||
|
[=] 16 17
|
||||||
|
[<CHARACTER>] 18 31
|
||||||
|
[;] 31 32
|
||||||
|
L16
|
||||||
|
[char] 5 9
|
||||||
|
[A] 10 11
|
||||||
|
[\[] 11 12
|
||||||
|
[\]] 12 13
|
||||||
|
[=] 14 15
|
||||||
|
[<STRING>] 16 27
|
||||||
|
[;] 27 28
|
||||||
|
L17
|
||||||
|
[wchar_t] 5 12
|
||||||
|
[B] 13 14
|
||||||
|
[\[] 14 15
|
||||||
|
[\]] 15 16
|
||||||
|
[=] 17 18
|
||||||
|
[<STRING>] 19 34
|
||||||
|
[;] 34 35
|
||||||
|
L18
|
||||||
|
[char16_t] 5 13
|
||||||
|
[C] 14 15
|
||||||
|
[\[] 15 16
|
||||||
|
[\]] 16 17
|
||||||
|
[=] 18 19
|
||||||
|
[<STRING>] 20 33
|
||||||
|
[;] 33 34
|
||||||
|
L19
|
||||||
|
[char32_t] 5 13
|
||||||
|
[D] 14 15
|
||||||
|
[\[] 15 16
|
||||||
|
[\]] 16 17
|
||||||
|
[=] 18 19
|
||||||
|
[<STRING>] 20 47
|
||||||
|
[;] 47 48
|
||||||
|
L20
|
||||||
|
[auto] 5 9
|
||||||
|
[E] 10 11
|
||||||
|
[\[] 11 12
|
||||||
|
[\]] 12 13
|
||||||
|
[=] 14 15
|
||||||
|
[<STRING>] 16 36
|
||||||
|
[;] 36 37
|
||||||
|
L24
|
||||||
|
[char] 5 9
|
||||||
|
[*] 9 10
|
||||||
|
[rawString] 11 20
|
||||||
|
[=] 21 22
|
||||||
|
[<RSTRING>] 23 7
|
||||||
|
L30
|
||||||
|
[;] 7 8
|
||||||
|
L35
|
||||||
|
[auto] 5 9
|
||||||
|
[integer_literal] 10 25
|
||||||
|
[=] 26 27
|
||||||
|
[<DECIMAL_INT_LITERAL>] 28 38
|
||||||
|
[;] 38 39
|
||||||
|
L36
|
||||||
|
[auto] 5 9
|
||||||
|
[floating_point_literal] 10 32
|
||||||
|
[=] 33 34
|
||||||
|
[<FLOAT_LITERAL>] 35 46
|
||||||
|
[;] 46 47
|
||||||
|
L37
|
||||||
|
[auto] 5 9
|
||||||
|
[hex_literal] 10 21
|
||||||
|
[=] 22 23
|
||||||
|
[<HEXADECIMAL_INT_LITERAL>] 24 40
|
||||||
|
[;] 40 41
|
||||||
|
L38
|
||||||
|
[auto] 5 9
|
||||||
|
[silly_example] 10 23
|
||||||
|
[=] 24 25
|
||||||
|
[<DECIMAL_INT_LITERAL>] 26 38
|
||||||
|
[;] 38 39
|
||||||
|
L41
|
||||||
|
[int] 5 8
|
||||||
|
[b1] 9 11
|
||||||
|
[=] 12 13
|
||||||
|
[<BINARY_INT_LITERAL>] 14 22
|
||||||
|
[;] 22 23
|
||||||
|
L42
|
||||||
|
[int] 5 8
|
||||||
|
[b2] 9 11
|
||||||
|
[=] 12 13
|
||||||
|
[<BINARY_INT_LITERAL>] 14 22
|
||||||
|
[;] 22 23
|
||||||
|
L43
|
||||||
|
[}] 1 2
|
||||||
|
EOF
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
package net.sourceforge.pmd.dist;
|
package net.sourceforge.pmd.dist;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
import static org.hamcrest.Matchers.containsStringIgnoringCase;
|
||||||
|
import static org.hamcrest.Matchers.not;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -40,9 +42,9 @@ class AntIT extends AbstractBinaryDistributionTest {
|
|||||||
|
|
||||||
ExecutionResult result = runAnt(antBasepath, pmdHome, antTestProjectFolder);
|
ExecutionResult result = runAnt(antBasepath, pmdHome, antTestProjectFolder);
|
||||||
result.assertExitCode(0)
|
result.assertExitCode(0)
|
||||||
.assertStdOut(containsString("BUILD SUCCESSFUL"));
|
.assertStdOut(containsString("BUILD SUCCESSFUL"))
|
||||||
// the no package rule
|
.assertStdOut(not(containsStringIgnoringCase("Illegal reflective access"))) // #1860
|
||||||
result.assertExitCode(0)
|
// the no package rule
|
||||||
.assertStdOut(containsString("NoPackage"));
|
.assertStdOut(containsString("NoPackage"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd</artifactId>
|
<artifactId>pmd</artifactId>
|
||||||
<version>7.7.0-SNAPSHOT</version>
|
<version>7.8.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user