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 @@
+ - Thomas Leplus - Rewrote UselessStringValueOf
- Larry Brigman - Reported symlink bug in CPD
- Harald Rohan - Reported bug in CPD GUI
- classens - Noted missing varargs setting in ASTFormalParameter