Merge branch 'master' of https://github.com/jbaris/pmd into jbaris-master
Merges pull request #2.
This commit is contained in:
commit
ff21265893
3 files changed
+240
No files matched your search
@@ -147,6 +147,58 @@ sb.append('a'); // use this instead
|
||||
</example>
|
||||
</rule>
|
||||
|
||||
<rule name="ConsecutiveAppendsShouldReuse"
|
||||
language="java"
|
||||
since="5.1"
|
||||
message="StringBuffer (or StringBuilder).append is called consecutively without reusing the target variable."
|
||||
class="net.sourceforge.pmd.lang.rule.XPathRule"
|
||||
externalInfoUrl="${pmd.website.baseurl}/rules/java/strings.html#ConsecutiveAppendsShouldReuse">
|
||||
<description>
|
||||
Consecutively calls to StringBuffer/StringBuilder .append must reuse the target object. This will improve the performance.
|
||||
</description>
|
||||
<priority>3</priority>
|
||||
<properties>
|
||||
<property name="xpath">
|
||||
<value>
|
||||
<![CDATA[
|
||||
//BlockStatement[./Statement/StatementExpression//PrimaryPrefix/Name[ends-with(@Image,'.append')]
|
||||
[substring-before(@Image, '.') =
|
||||
ancestor::Block//LocalVariableDeclaration[./Type//ClassOrInterfaceType[@Image='StringBuffer']]//VariableDeclaratorId/@Image
|
||||
]
|
||||
]/following-sibling::*[1][./Statement/StatementExpression//PrimaryPrefix/Name[ends-with(@Image,'.append')]
|
||||
[substring-before(@Image, '.') =
|
||||
ancestor::Block//LocalVariableDeclaration[./Type//ClassOrInterfaceType[@Image='StringBuffer']]//VariableDeclaratorId/@Image
|
||||
]
|
||||
]
|
||||
|
|
||||
//BlockStatement[./Statement/StatementExpression//PrimaryPrefix/Name[ends-with(@Image,'.append')]
|
||||
[substring-before(@Image, '.') =
|
||||
ancestor::Block//LocalVariableDeclaration[./Type//ClassOrInterfaceType[@Image='StringBuilder']]//VariableDeclaratorId/@Image
|
||||
]
|
||||
]/following-sibling::*[1][./Statement/StatementExpression//PrimaryPrefix/Name[ends-with(@Image,'.append')]
|
||||
[substring-before(@Image, '.') =
|
||||
ancestor::Block//LocalVariableDeclaration[./Type//ClassOrInterfaceType[@Image='StringBuilder']]//VariableDeclaratorId/@Image
|
||||
]
|
||||
]
|
||||
]]>
|
||||
</value>
|
||||
</property>
|
||||
</properties>
|
||||
<example>
|
||||
<![CDATA[
|
||||
String foo = " ";
|
||||
|
||||
StringBuffer buf = new StringBuffer();
|
||||
buf.append("Hello"); // poor
|
||||
buf.append(foo);
|
||||
buf.append("World");
|
||||
|
||||
StringBuffer buf = new StringBuffer();
|
||||
buf.append("Hello").append(foo).append("World"); // good
|
||||
]]>
|
||||
</example>
|
||||
</rule>
|
||||
|
||||
<rule name="ConsecutiveLiteralAppends"
|
||||
since="3.5"
|
||||
message="StringBuffer (or StringBuilder).append is called {0} consecutive times with literal Strings. Use a single append with a single combined String."
|
||||
|
||||
@@ -13,6 +13,7 @@ public class StringsRulesTest extends SimpleAggregatorTst {
|
||||
public void setUp() {
|
||||
addRule(RULESET, "AppendCharacterWithChar");
|
||||
addRule(RULESET, "AvoidStringBufferField");
|
||||
addRule(RULESET, "ConsecutiveAppendsShouldReuse");
|
||||
addRule(RULESET, "ConsecutiveLiteralAppends");
|
||||
addRule(RULESET, "InefficientEmptyStringCheck");
|
||||
addRule(RULESET, "InefficientStringBuffering");
|
||||
|
||||
+187
@@ -0,0 +1,187 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<test-data>
|
||||
<test-code>
|
||||
<description><![CDATA[
|
||||
1, Single append, should be ok
|
||||
]]></description>
|
||||
<expected-problems>0</expected-problems>
|
||||
<code><![CDATA[
|
||||
public class Foo {
|
||||
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Foo.class);
|
||||
public void bar() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("foo");
|
||||
}
|
||||
|
||||
public void bar2() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("foo");
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
<test-code>
|
||||
<description><![CDATA[
|
||||
2, Consecutive appends with reuse, should be ok
|
||||
]]></description>
|
||||
<expected-problems>0</expected-problems>
|
||||
<code><![CDATA[
|
||||
public class Foo {
|
||||
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Foo.class);
|
||||
public void bar() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("Hello").append("World");
|
||||
}
|
||||
|
||||
public void bar2() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("Hello").append("World");
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
<test-code>
|
||||
<description><![CDATA[
|
||||
3, Single append on different method, should be ok
|
||||
]]></description>
|
||||
<expected-problems>0</expected-problems>
|
||||
<code><![CDATA[
|
||||
public class Foo {
|
||||
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Foo.class);
|
||||
public void bar() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("Hello");
|
||||
}
|
||||
|
||||
public void bar2() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("Hello");
|
||||
}
|
||||
|
||||
public void bar3() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("Hello");
|
||||
}
|
||||
|
||||
public void bar4() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("Hello");
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
<test-code>
|
||||
<description><![CDATA[
|
||||
4, Single append on different objects, should be ok
|
||||
]]></description>
|
||||
<expected-problems>0</expected-problems>
|
||||
<code><![CDATA[
|
||||
public class Foo {
|
||||
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Foo.class);
|
||||
public void bar() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("Hello");
|
||||
StringBuffer sb2 = new StringBuffer(15);
|
||||
sb2.append("World");
|
||||
}
|
||||
|
||||
public void bar2() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("Hello");
|
||||
StringBuilder sb2 = new StringBuilder(15);
|
||||
sb2.append("World");
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
<test-code>
|
||||
<description><![CDATA[
|
||||
5, Consecutive literal appends without reuse, not ok
|
||||
]]></description>
|
||||
<expected-problems>2</expected-problems>
|
||||
<code><![CDATA[
|
||||
public class Foo {
|
||||
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Foo.class);
|
||||
public void bar() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("Hello");
|
||||
sb.append("World");
|
||||
}
|
||||
|
||||
public void bar2() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("Hello");
|
||||
sb.append("World");
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
<test-code>
|
||||
<description><![CDATA[
|
||||
6, Consecutive variable appends without reuse, not ok
|
||||
]]></description>
|
||||
<expected-problems>2</expected-problems>
|
||||
<code><![CDATA[
|
||||
public class Foo {
|
||||
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Foo.class);
|
||||
public void bar() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
String foo = "Hello";
|
||||
String foo2 = "World";
|
||||
sb.append(foo);
|
||||
sb.append(foo2);
|
||||
}
|
||||
|
||||
public void bar2() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
String foo = "Hello";
|
||||
String foo2 = "World";
|
||||
sb.append(foo);
|
||||
sb.append(foo2);
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
<test-code>
|
||||
<description><![CDATA[
|
||||
7, Consecutive appends in different blocks, should be ok
|
||||
]]></description>
|
||||
<expected-problems>0</expected-problems>
|
||||
<code><![CDATA[
|
||||
public class Foo {
|
||||
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Foo.class);
|
||||
public void bar() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("Hello");
|
||||
while(true) {
|
||||
sb.append("World");
|
||||
}
|
||||
}
|
||||
|
||||
public void bar2() {
|
||||
StringBuffer sb = new StringBuffer(15);
|
||||
sb.append("Hello");
|
||||
if(true) {
|
||||
sb.append("World");
|
||||
}
|
||||
}
|
||||
|
||||
public void bar3() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("Hello");
|
||||
while(true) {
|
||||
sb.append("World");
|
||||
}
|
||||
}
|
||||
|
||||
public void bar4() {
|
||||
StringBuilder sb = new StringBuilder(15);
|
||||
sb.append("Hello");
|
||||
if(true) {
|
||||
sb.append("World");
|
||||
}
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
</test-data>
|
||||
Reference in new issue
Block a user