Merge branch 'issue-257'

This commit is contained in:
Andreas Dangel
2017-02-20 16:13:37 +01:00
6 changed files with 56 additions and 18 deletions

View File

@ -1,4 +1,9 @@
/** /**
* Provide a better fix for CastExpression, getting rid of most hacks.
* Bug #257
*
* Juan Martin Sotuyo Dodero 02/2017
*====================================================================
* Allow local classes to carry more than one annotation. * Allow local classes to carry more than one annotation.
* Bug #208 * Bug #208
* *
@ -1558,7 +1563,7 @@ void ReferenceType():
void ClassOrInterfaceType(): void ClassOrInterfaceType():
{ {
StringBuffer s = new StringBuffer(); StringBuilder s = new StringBuilder();
Token t; Token t;
} }
{ {
@ -1789,9 +1794,13 @@ void UnaryExpressionNotPlusMinus() #UnaryExpressionNotPlusMinus((jjtn000.getImag
{} {}
{ {
( "~" {jjtThis.setImage("~");} | "!" {jjtThis.setImage("!");} ) UnaryExpression() ( "~" {jjtThis.setImage("~");} | "!" {jjtThis.setImage("!");} ) UnaryExpression()
| LOOKAHEAD( { getToken(1).kind == LPAREN && getToken(2).kind == IDENTIFIER && getToken(3).kind == RPAREN && getToken(4).kind == PLUS } ) PostfixExpression() /*
| LOOKAHEAD( CastExpression() ) CastExpression() * This is really ugly... we are repeting the CastExpression lookahead and full expression...
| LOOKAHEAD("(" Type() ")" "(") CastExpression() * If we don't the lookahead within CastExpression is ignored, and it simply looks for the expression,
* meaning we can't be explicit as to what can be casted depending on the cast type (primitive or otherwhise)
*/
| LOOKAHEAD("(" (Annotation())* PrimitiveType() ")") CastExpression()
| LOOKAHEAD("(" (Annotation())* Type() ( "&" ReferenceType() )* ")" UnaryExpressionNotPlusMinus()) CastExpression()
| PostfixExpression() | PostfixExpression()
} }
@ -1801,12 +1810,13 @@ void PostfixExpression() #PostfixExpression((jjtn000.getImage() != null)):
PrimaryExpression() [ "++" {jjtThis.setImage("++");} | "--" {jjtThis.setImage("--");} ] PrimaryExpression() [ "++" {jjtThis.setImage("++");} | "--" {jjtThis.setImage("--");} ]
} }
void CastExpression() #CastExpression(>1): void CastExpression() :
{} {}
{ {
LOOKAHEAD("(" (Annotation())* Type() ")") "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ")" UnaryExpression() LOOKAHEAD(
| LOOKAHEAD("(" (Annotation())* Type() "&") "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ( "&" {checkForBadIntersectionTypesInCasts(); jjtThis.setIntersectionTypes(true);} ReferenceType() )+ ")" UnaryExpressionNotPlusMinus() "(" (Annotation())* PrimitiveType() ")"
| "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ")" UnaryExpressionNotPlusMinus() ) "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ")" UnaryExpression()
| "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ( "&" {checkForBadIntersectionTypesInCasts(); jjtThis.setIntersectionTypes(true);} ReferenceType() )* ")" UnaryExpressionNotPlusMinus()
} }
void PrimaryExpression() : void PrimaryExpression() :
@ -2010,12 +2020,9 @@ void StatementExpression() :
| |
PreDecrementExpression() PreDecrementExpression()
| |
LOOKAHEAD( PrimaryExpression() ("++" | "--") ) PostfixExpression() LOOKAHEAD( PrimaryExpression() AssignmentOperator() ) PrimaryExpression() AssignmentOperator() Expression()
| |
PrimaryExpression() PostfixExpression()
[
AssignmentOperator() Expression()
]
} }
void SwitchStatement() : void SwitchStatement() :

View File

@ -26,7 +26,6 @@ import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
import net.sourceforge.pmd.lang.java.ast.ASTSwitchLabel; import net.sourceforge.pmd.lang.java.ast.ASTSwitchLabel;
import net.sourceforge.pmd.lang.java.ast.ASTSwitchStatement; import net.sourceforge.pmd.lang.java.ast.ASTSwitchStatement;
import net.sourceforge.pmd.lang.java.ast.ASTType;
import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator;
import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
import net.sourceforge.pmd.lang.java.ast.ASTVariableInitializer; import net.sourceforge.pmd.lang.java.ast.ASTVariableInitializer;
@ -204,7 +203,7 @@ public class InsufficientStringBufferDeclarationRule extends AbstractJavaRule {
// but only if we are not inside a cast expression // but only if we are not inside a cast expression
Node parentNode = literal.jjtGetParent().jjtGetParent().jjtGetParent(); Node parentNode = literal.jjtGetParent().jjtGetParent().jjtGetParent();
if (parentNode instanceof ASTCastExpression if (parentNode instanceof ASTCastExpression
&& parentNode.getFirstChildOfType(ASTType.class).getType() == char.class) { && ((ASTCastExpression) parentNode).getType() == char.class) {
anticipatedLength += 1; anticipatedLength += 1;
} else { } else {
// e.g. 0xdeadbeef -> will be converted to a // e.g. 0xdeadbeef -> will be converted to a

View File

@ -15,6 +15,10 @@ import net.sourceforge.pmd.lang.symboltable.NameOccurrence;
public class UnusedLocalVariableRule extends AbstractJavaRule { public class UnusedLocalVariableRule extends AbstractJavaRule {
public UnusedLocalVariableRule() {
addRuleChainVisit(ASTLocalVariableDeclaration.class);
}
public Object visit(ASTLocalVariableDeclaration decl, Object data) { public Object visit(ASTLocalVariableDeclaration decl, Object data) {
for (int i = 0; i < decl.jjtGetNumChildren(); i++) { for (int i = 0; i < decl.jjtGetNumChildren(); i++) {
if (!(decl.jjtGetChild(i) instanceof ASTVariableDeclarator)) { if (!(decl.jjtGetChild(i) instanceof ASTVariableDeclarator)) {
@ -34,9 +38,7 @@ public class UnusedLocalVariableRule extends AbstractJavaRule {
private boolean actuallyUsed(List<NameOccurrence> usages) { private boolean actuallyUsed(List<NameOccurrence> usages) {
for (NameOccurrence occ : usages) { for (NameOccurrence occ : usages) {
JavaNameOccurrence jocc = (JavaNameOccurrence) occ; JavaNameOccurrence jocc = (JavaNameOccurrence) occ;
if (jocc.isOnLeftHandSide()) { if (!jocc.isOnLeftHandSide()) {
continue;
} else {
return true; return true;
} }
} }

View File

@ -157,6 +157,20 @@ public class ParserCornersTest extends ParserTst {
String c = IOUtils.toString(this.getClass().getResourceAsStream("GitHubBug208.java")); String c = IOUtils.toString(this.getClass().getResourceAsStream("GitHubBug208.java"));
parseJava15(c); parseJava15(c);
} }
@Test
public void testGitHubBug257NonExistingCast() throws Exception {
String code = "public class Test {" + PMD.EOL
+ " public static void main(String[] args) {" + PMD.EOL
+ " double a = 4.0;" + PMD.EOL
+ " double b = 2.0;" + PMD.EOL
+ " double result = Math.sqrt((a) - b);" + PMD.EOL
+ " System.out.println(result);" + PMD.EOL
+ " }" + PMD.EOL
+ "}";
ASTCompilationUnit compilationUnit = parseJava15(code);
assertEquals("A cast was found when none expected", 0, compilationUnit.findDescendantsOfType(ASTCastExpression.class).size());
}
/** /**
* This triggered bug #1484 UnusedLocalVariable - false positive - * This triggered bug #1484 UnusedLocalVariable - false positive -

View File

@ -368,6 +368,21 @@ public class Test {
System.out.println(list.size() + " (" + (notEmpty) + " not empty)"); System.out.println(list.size() + " (" + (notEmpty) + " not empty)");
} }
}
]]></code>
</test-code>
<test-code>
<description>#257 UnusedLocalVariable - false positive - parenthesis</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
public class Test {
public static void main(String[] args) {
double a = 4.0;
double b = 2.0;
double result = Math.sqrt((a) - b);
System.out.println(result);
}
} }
]]></code> ]]></code>
</test-code> </test-code>

View File

@ -345,6 +345,7 @@ For example:
* [#246](https://github.com/pmd/pmd/issues/246): \[java] UnusedModifier doesn't check annotations * [#246](https://github.com/pmd/pmd/issues/246): \[java] UnusedModifier doesn't check annotations
* [#247](https://github.com/pmd/pmd/issues/247): \[java] UnusedModifier doesn't check annotations inner classes * [#247](https://github.com/pmd/pmd/issues/247): \[java] UnusedModifier doesn't check annotations inner classes
* [#248](https://github.com/pmd/pmd/issues/248): \[java] UnusedModifier doesn't check static keyword on nested enum declaration * [#248](https://github.com/pmd/pmd/issues/248): \[java] UnusedModifier doesn't check static keyword on nested enum declaration
* [#257](https://github.com/pmd/pmd/issues/257): \[java] UnusedLocalVariable false positive
* XML * XML
* [#1518](https://sourceforge.net/p/pmd/bugs/1518/): \[xml] Error while processing xml file with ".webapp" in the file or directory name * [#1518](https://sourceforge.net/p/pmd/bugs/1518/): \[xml] Error while processing xml file with ".webapp" in the file or directory name
* psql * psql