diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/strings/ConsecutiveAppendsShouldReuseRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/strings/ConsecutiveAppendsShouldReuseRule.java index f9991f4ee0..9bb25b1cb2 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/strings/ConsecutiveAppendsShouldReuseRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/strings/ConsecutiveAppendsShouldReuseRule.java @@ -11,6 +11,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTBlockStatement; import net.sourceforge.pmd.lang.java.ast.ASTExpression; import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTName; +import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; import net.sourceforge.pmd.lang.java.ast.ASTStatement; @@ -88,19 +89,41 @@ public class ConsecutiveAppendsShouldReuseRule extends AbstractJavaRule { ASTStatement statement = (ASTStatement) node.jjtGetChild(0); if (isFirstChild(statement, ASTStatementExpression.class)) { ASTStatementExpression stmtExp = (ASTStatementExpression) statement.jjtGetChild(0); - ASTPrimaryPrefix primaryPrefix = stmtExp.getFirstDescendantOfType(ASTPrimaryPrefix.class); - if (primaryPrefix != null) { - ASTName name = primaryPrefix.getFirstChildOfType(ASTName.class); - if (name != null) { - String image = name.getImage(); - if (image.endsWith(".append")) { - String variable = image.substring(0, image.indexOf('.')); - if (isAStringBuilderBuffer(primaryPrefix, variable)) { - return variable; - } - } - } - } + if (stmtExp.jjtGetNumChildren() == 1) { + ASTPrimaryPrefix primaryPrefix = stmtExp.getFirstDescendantOfType(ASTPrimaryPrefix.class); + if (primaryPrefix != null) { + ASTName name = primaryPrefix.getFirstChildOfType(ASTName.class); + if (name != null) { + String image = name.getImage(); + if (image.endsWith(".append")) { + String variable = image.substring(0, image.indexOf('.')); + if (isAStringBuilderBuffer(primaryPrefix, variable)) { + return variable; + } + } + } + } + } else { + final ASTExpression exp = stmtExp.getFirstDescendantOfType(ASTExpression.class); + if (isFirstChild(exp, ASTPrimaryExpression.class)) { + final ASTPrimarySuffix primarySuffix = ((ASTPrimaryExpression) exp.jjtGetChild(0)).getFirstDescendantOfType(ASTPrimarySuffix.class); + if (primarySuffix != null) { + final String name = primarySuffix.getImage(); + if (name != null && name.equals("append")) { + final ASTPrimaryExpression pExp = stmtExp.getFirstDescendantOfType(ASTPrimaryExpression.class); + if (pExp != null) { + final ASTName astName = stmtExp.getFirstDescendantOfType(ASTName.class); + if (astName != null) { + final String variable = astName.getImage(); + if (isAStringBuilderBuffer(primarySuffix, variable)) { + return variable; + } + } + } + } + } + } + } } } else if (isFirstChild(node, ASTLocalVariableDeclaration.class)) { ASTLocalVariableDeclaration lvd = (ASTLocalVariableDeclaration) node.jjtGetChild(0); diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/strings/xml/ConsecutiveAppendsShouldReuse.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/strings/xml/ConsecutiveAppendsShouldReuse.xml index 2d821a260d..2d2eec3de1 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/strings/xml/ConsecutiveAppendsShouldReuse.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/strings/xml/ConsecutiveAppendsShouldReuse.xml @@ -214,6 +214,7 @@ public class Foo { public class Foo { public void foo() { final StringBuffer stringBuffer = new StringBuffer().append("agrego ").append("un "); + stringBuffer = new StringBuffer().append("agrego ").append("un "); stringBuffer.append("string "); } } @@ -234,6 +235,19 @@ public class StringBufferTest { stringBuffer2.append("string "); // but not on this one Log.i(TAG, stringBuffer2.toString()); } +} + ]]> + + + #1370 ConsecutiveAppendsShouldReuse not detected properly on StringBuffer - part 3 + 1 +