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 2e86a597d3..4f2836c9a8 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -122,6 +122,8 @@ you'll need a java8 runtime environment. * [#1422](https://sourceforge.net/p/pmd/bugs/1422/): UselessQualifiedThis: False positive with Java 8 Function * java-unusedcode/UnusedFormalParameter: * [#1456](https://sourceforge.net/p/pmd/bugs/1456/): UnusedFormalParameter should ignore overriding methods +* java-unusedcode/UnusedLocalVariable + * [#1484](https://sourceforge.net/p/pmd/bugs/1484/): UnusedLocalVariable - false positive - parenthesis * java-unusedcode/UnusedPrivateField * [#1428](https://sourceforge.net/p/pmd/bugs/1428/): False positive in UnusedPrivateField when local variable hides member variable