From 3c0516b86fd237eb75e5843bc845cbb7ed04f0c5 Mon Sep 17 00:00:00 2001 From: albfernandez Date: Sat, 27 Feb 2016 13:03:41 +0100 Subject: [PATCH] Fix #1340 UseStringBufferForStringAppends False Positive with ternary operator (used both in condition and options) --- .../UseStringBufferForStringAppendsRule.java | 15 +++++++++++++++ .../xml/UseStringBufferForStringAppends.xml | 17 +++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/UseStringBufferForStringAppendsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/UseStringBufferForStringAppendsRule.java index fc74c9f453..a3a96a556b 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/UseStringBufferForStringAppendsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/optimizations/UseStringBufferForStringAppendsRule.java @@ -6,6 +6,8 @@ package net.sourceforge.pmd.lang.java.rule.optimizations; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTArgumentList; import net.sourceforge.pmd.lang.java.ast.ASTAssignmentOperator; +import net.sourceforge.pmd.lang.java.ast.ASTConditionalExpression; +import net.sourceforge.pmd.lang.java.ast.ASTEqualityExpression; import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTName; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; @@ -37,6 +39,16 @@ public class UseStringBufferForStringAppendsRule extends AbstractJavaRule { // used in method call continue; } + ASTEqualityExpression equality = name.getFirstParentOfType(ASTEqualityExpression.class); + if (equality != null && equality.getFirstParentOfType(ASTStatementExpression.class) == statement) { + // used in condition + continue; + } + ASTConditionalExpression conditional = name.getFirstParentOfType(ASTConditionalExpression.class); + if (conditional != null && name.jjtGetParent().jjtGetParent().jjtGetParent() == conditional && conditional.getFirstParentOfType(ASTStatementExpression.class) == statement) { + // is used in ternary as only option (not appendend to other string) + continue; + } if (statement.jjtGetNumChildren() > 0 && statement.jjtGetChild(0) instanceof ASTPrimaryExpression) { ASTName astName = statement.jjtGetChild(0).getFirstDescendantOfType(ASTName.class); if(astName != null){ @@ -47,6 +59,9 @@ public class UseStringBufferForStringAppendsRule extends AbstractJavaRule { } } else if(astName.getImage().equals(name.getImage())){ ASTAssignmentOperator assignmentOperator = statement.getFirstDescendantOfType(ASTAssignmentOperator.class); + if (astName.jjtGetParent().jjtGetParent().jjtGetParent().getClass() == ASTEqualityExpression.class) { + continue; + } if (assignmentOperator != null && !assignmentOperator.isCompound()) { addViolation(data, astName); } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/UseStringBufferForStringAppends.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/UseStringBufferForStringAppends.xml index eb055a35a0..48f479e0e7 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/UseStringBufferForStringAppends.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/optimizations/xml/UseStringBufferForStringAppends.xml @@ -135,12 +135,25 @@ public class Foo { ]]> - #1340 UseStringBufferForStringAppends False Positive with ternary operator + #1340 UseStringBufferForStringAppends False Positive with ternary operator (used in condition) 0 + + + #1340 UseStringBufferForStringAppends False Positive with ternary operator (used both in condition and options) + 0 +