From 0d20fe7e1c66568b4aa1a5c40b48621ac5a911bd Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 21 May 2016 11:37:10 +0200 Subject: [PATCH] Fixes #1484 UnusedLocalVariable - false positive - parenthesis --- pmd-java/etc/grammar/Java.jjt | 7 +++++ .../pmd/lang/java/ast/ParserCornersTest.java | 15 +++++++++++ .../unusedcode/xml/UnusedLocalVariable.xml | 26 +++++++++++++++++++ src/site/markdown/overview/changelog.md | 3 +++ 4 files changed, 51 insertions(+) diff --git a/pmd-java/etc/grammar/Java.jjt b/pmd-java/etc/grammar/Java.jjt index afa468cd5a..5b2b631c37 100644 --- a/pmd-java/etc/grammar/Java.jjt +++ b/pmd-java/etc/grammar/Java.jjt @@ -1,4 +1,10 @@ /** + * Fix for an expression within an additive expression that was + * wrongly taken as a cast expression. + * Bug #1484 + * + * Andreas Dangel 05/2016 + *==================================================================== * Fix for Lambda expression with one variable * Bug #1470 * @@ -1755,6 +1761,7 @@ void UnaryExpressionNotPlusMinus() #UnaryExpressionNotPlusMinus((jjtn000.getImag {} { ( "~" {jjtThis.setImage("~");} | "!" {jjtThis.setImage("!");} ) UnaryExpression() +| LOOKAHEAD("(" ")" "+") PostfixExpression() | LOOKAHEAD( CastExpression() ) CastExpression() | LOOKAHEAD("(" Type() ")" "(") CastExpression() | PostfixExpression() diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ParserCornersTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ParserCornersTest.java index c0cd2ccbbf..8c099ac5b0 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ParserCornersTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ParserCornersTest.java @@ -131,6 +131,21 @@ public class ParserCornersTest extends ParserTst { parseJava18(c); } + /** + * This triggered bug #1484 UnusedLocalVariable - false positive - parenthesis + * @throws Exception + */ + @Test + public void stringConcatentationShouldNotBeCast() throws Exception { + String code = "public class Test {\n" + + " public static void main(String[] args) {\n" + + " System.out.println(\"X\" + (args) + \"Y\");\n" + + " }\n" + + "}"; + ASTCompilationUnit cu = parseJava18(code); + Assert.assertEquals(0, cu.findDescendantsOfType(ASTCastExpression.class).size()); + } + private String readAsString(String resource) { InputStream in = ParserCornersTest.class.getResourceAsStream(resource); try { diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedLocalVariable.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedLocalVariable.xml index c0f6d07889..9f0d702ec6 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedLocalVariable.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedLocalVariable.xml @@ -342,6 +342,32 @@ public class Foo { // do something } } +} + ]]> + + + + #1484 UnusedLocalVariable - false positive - parenthesis + 0 + list = new ArrayList<>(); + list.add("first"); + list.add("second"); + + int notEmpty = 0; + for (String string : list) { + if (!string.isEmpty()) { + notEmpty++; + } + } + + System.out.println(list.size() + " (" + (notEmpty) + " not empty)"); + } } ]]> diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index 0d07b03d7a..7f9ad192cb 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -14,6 +14,9 @@ **Bugfixes:** +* java-unusedcode/UnusedLocalVariable + * [#1484](https://sourceforge.net/p/pmd/bugs/1484/): UnusedLocalVariable - false positive - parenthesis + **API Changes:** * New command line parameter for PMD: `-norulesetcompatibility` - this disables the ruleset factory