Merge branch 'addCloneMethodMustBePublicRule' of https://github.com/Monits/pmd into Monits-addCloneMethodMustBePublicRule

This commit is contained in:
Andreas Dangel
2015-09-04 19:02:05 +02:00
3 changed files with 156 additions and 0 deletions

View File

@ -172,4 +172,49 @@ public class Foo implements Cloneable {
]]>
</example>
</rule>
<rule name="CloneMethodMustBePublic"
language="java"
since="5.4.0"
message="clone() method must be public if the class implements Cloneable"
class="net.sourceforge.pmd.lang.rule.XPathRule"
externalInfoUrl="${pmd.website.baseurl}/rules/java/clone.html#CloneMethodMustBePublic">
<description>
The java Manual says "By convention, classes that implement this interface should override
Object.clone (which is protected) with a public method."
</description>
<priority>3</priority>
<properties>
<property name="xpath">
<value>
<![CDATA[
//MethodDeclaration[@Public='false']
[
MethodDeclarator/@Image = 'clone'
and MethodDeclarator/FormalParameters/@ParameterCount = 0
]
]]>
</value>
</property>
</properties>
<example>
<![CDATA[
public class Foo implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException { // Violation, must be public
}
}
public class Foo implements Cloneable {
@Override
protected Foo clone() { // Violation, must be public
}
}
public class Foo implements Cloneable {
@Override
public Object clone() // Ok
}
]]></example>
</rule>
</ruleset>

View File

@ -15,5 +15,6 @@ public class CloneRulesTest extends SimpleAggregatorTst {
addRule(RULESET, "CloneThrowsCloneNotSupportedException");
addRule(RULESET, "ProperCloneImplementation");
addRule(RULESET, "CloneMethodReturnTypeMustMatchClassName");
addRule(RULESET, "CloneMethodMustBePublic");
}
}

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<test-data>
<test-code>
<description>
<![CDATA[
protected method clone
]]>
</description>
<expected-problems>1</expected-problems>
<code>
<![CDATA[
public class Foo implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
}
}
]]>
</code>
</test-code>
<test-code>
<description>
<![CDATA[
protected method clone 2
]]>
</description>
<expected-problems>1</expected-problems>
<code>
<![CDATA[
public class Object implements Cloneable {
@Override
protected Object clone() {
}
}
]]>
</code>
</test-code>
<test-code>
<description>
<![CDATA[
public method clone
]]>
</description>
<expected-problems>0</expected-problems>
<code>
<![CDATA[
public class Foo implements Cloneable {
@Override
public Object clone() {
}
}
]]>
</code>
</test-code>
<test-code>
<description>
<![CDATA[
public method clone 2
]]>
</description>
<expected-problems>0</expected-problems>
<code>
<![CDATA[
public class Foo implements Cloneable {
@Override
public Foo clone() {
}
}
]]>
</code>
</test-code>
<test-code>
<description>
<![CDATA[
final class with protected clone method
]]>
</description>
<expected-problems>1</expected-problems>
<code>
<![CDATA[
public final class Foo implements Cloneable {
@Override
protected Object clone() {
}
}
]]>
</code>
</test-code>
<test-code>
<description>
<![CDATA[
final class with public method
]]>
</description>
<expected-problems>0</expected-problems>
<code>
<![CDATA[
public final class Foo implements Cloneable {
@Override
public Foo clone() {
}
}
]]>
</code>
</test-code>
</test-data>