diff --git a/pmd/etc/bug_closer.txt b/pmd/etc/bug_closer.txt index a27cf2cb7f..c4cc307c7c 100644 --- a/pmd/etc/bug_closer.txt +++ b/pmd/etc/bug_closer.txt @@ -7,4 +7,4 @@ that contains that fix. Thanks, Tom -The PMD book for $20: http://pmdapplied.com/ +The PMD book - $20 - http://pmdapplied.com/ diff --git a/pmd/etc/changelog.txt b/pmd/etc/changelog.txt index b8a9e26e53..46b0c82758 100644 --- a/pmd/etc/changelog.txt +++ b/pmd/etc/changelog.txt @@ -726,5 +726,5 @@ Added new HTML report format June 25 2002 - 0.1: Initial release -Using PMD? Get the book - http://pmdapplied.com/ +The PMD book - $20 - http://pmdapplied.com/ controversial,basic,strings,design,naming,finalizers,braces,clone,codesize,coupling,imports,javabeans,junit,logging-jakarta-commons,logging-java,migrating,optimizations,strictexception,sunsecure,unusedcode diff --git a/pmd/regress/test/net/sourceforge/pmd/rules/strings/xml/UselessStringValueOf.xml b/pmd/regress/test/net/sourceforge/pmd/rules/strings/xml/UselessStringValueOf.xml index 158859d577..08b7903276 100644 --- a/pmd/regress/test/net/sourceforge/pmd/rules/strings/xml/UselessStringValueOf.xml +++ b/pmd/regress/test/net/sourceforge/pmd/rules/strings/xml/UselessStringValueOf.xml @@ -38,6 +38,32 @@ void bar(int i) { char low = 'B'; String s = String.valueOf(c) + low; } +} + ]]> + + + + 1 + + + + + 1 + diff --git a/pmd/rulesets/strings.xml b/pmd/rulesets/strings.xml index 1e0fdc8052..0d9821c3d0 100644 --- a/pmd/rulesets/strings.xml +++ b/pmd/rulesets/strings.xml @@ -273,7 +273,7 @@ public class Foo { class="net.sourceforge.pmd.rules.strings.UselessStringValueOf" externalInfoUrl="http://pmd.sourceforge.net/rules/strings.html#UselessStringValueOf"> -Use valueOf() argument directly. +No need to call String.valueOf to append to a string; just use the valueOf() argument directly. 3 diff --git a/pmd/src/net/sourceforge/pmd/rules/strings/UselessStringValueOf.java b/pmd/src/net/sourceforge/pmd/rules/strings/UselessStringValueOf.java index 073fd87ab9..b648ff4ccf 100644 --- a/pmd/src/net/sourceforge/pmd/rules/strings/UselessStringValueOf.java +++ b/pmd/src/net/sourceforge/pmd/rules/strings/UselessStringValueOf.java @@ -7,11 +7,13 @@ import net.sourceforge.pmd.ast.ASTPrimaryExpression; import net.sourceforge.pmd.ast.ASTPrimaryPrefix; import net.sourceforge.pmd.ast.Node; import net.sourceforge.pmd.ast.SimpleJavaNode; +import net.sourceforge.pmd.symboltable.VariableNameDeclaration; public class UselessStringValueOf extends AbstractRule { public Object visit(ASTPrimaryPrefix node, Object data) { - if (node.jjtGetNumChildren() == 0 || !node.jjtGetChild(0).getClass().equals(ASTName.class)) { + if (node.jjtGetNumChildren() == 0 || + !(node.jjtGetChild(0) instanceof ASTName)) { return super.visit(node, data); } @@ -19,16 +21,46 @@ public class UselessStringValueOf extends AbstractRule { if ("String.valueOf".equals(image)) { Node parent = node.jjtGetParent(); + if (parent.jjtGetNumChildren() != 2) { + return super.visit(node, data); + } SimpleJavaNode gp = (SimpleJavaNode) parent.jjtGetParent(); if (parent instanceof ASTPrimaryExpression && gp instanceof ASTAdditiveExpression && - gp.jjtGetChild(0) != parent && "+".equals(gp.getImage())) { - super.addViolation(data, node); - return data; + boolean ok = false; + if (gp.jjtGetChild(0) == parent) { + ok = !isPrimitive(gp.jjtGetChild(1)); + } else { + for (int i = 0; !ok && gp.jjtGetChild(i) != parent; i++) { + ok = !isPrimitive(gp.jjtGetChild(i)); + } + } + if (ok) { + super.addViolation(data, node); + return data; + } } } return super.visit(node, data); } + private static boolean isPrimitive(Node parent) { + boolean result = false; + if (parent instanceof ASTPrimaryExpression && + parent.jjtGetNumChildren() == 1 && + parent.jjtGetChild(0) instanceof ASTPrimaryPrefix && + parent.jjtGetChild(0).jjtGetNumChildren() == 1 && + parent.jjtGetChild(0).jjtGetChild(0) instanceof ASTName) { + ASTName name = (ASTName) parent.jjtGetChild(0).jjtGetChild(0); + if (name.getNameDeclaration() instanceof VariableNameDeclaration) { + VariableNameDeclaration nd = (VariableNameDeclaration) name.getNameDeclaration(); + if (nd.isPrimitiveType()) { + result = true; + } + } + } + return result; + } + } diff --git a/pmd/xdocs/credits.xml b/pmd/xdocs/credits.xml index 7f4f900e6a..54ab203764 100644 --- a/pmd/xdocs/credits.xml +++ b/pmd/xdocs/credits.xml @@ -54,6 +54,7 @@