Merge pull request #3343 from adangel:clone-method-must-implement-cloneable-fn
[java] CloneMethodMustImplementCloneable: FN with local classes #3343
This commit is contained in:
@ -59,6 +59,7 @@ This is a {{ site.pmd.release_type }} release.
|
|||||||
* [#2895](https://github.com/pmd/pmd/issues/2895): \[java] Improve BadComparison and rename to ComparisonWithNaN
|
* [#2895](https://github.com/pmd/pmd/issues/2895): \[java] Improve BadComparison and rename to ComparisonWithNaN
|
||||||
* [#3284](https://github.com/pmd/pmd/issues/3284): \[java] InvalidLogMessageFormat may examine the value of a different but identically named String variable
|
* [#3284](https://github.com/pmd/pmd/issues/3284): \[java] InvalidLogMessageFormat may examine the value of a different but identically named String variable
|
||||||
* [#3304](https://github.com/pmd/pmd/issues/3304): \[java] NPE in MoreThanOneLoggerRule on a java 16 record
|
* [#3304](https://github.com/pmd/pmd/issues/3304): \[java] NPE in MoreThanOneLoggerRule on a java 16 record
|
||||||
|
* [#3343](https://github.com/pmd/pmd/pull/3343): \[java] CloneMethodMustImplementCloneable: FN with local classes
|
||||||
|
|
||||||
### API Changes
|
### API Changes
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
|
|||||||
import net.sourceforge.pmd.lang.java.ast.ASTExtendsList;
|
import net.sourceforge.pmd.lang.java.ast.ASTExtendsList;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTImplementsList;
|
import net.sourceforge.pmd.lang.java.ast.ASTImplementsList;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
|
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator;
|
|
||||||
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
|
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -83,9 +82,10 @@ public class CloneMethodMustImplementCloneableRule extends AbstractJavaRule {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object visit(final ASTMethodDeclaration node, final Object data) {
|
public Object visit(final ASTMethodDeclaration node, final Object data) {
|
||||||
|
super.visit(node, data);
|
||||||
|
|
||||||
// Is this a clone method?
|
// Is this a clone method?
|
||||||
final ASTMethodDeclarator methodDeclarator = node.getFirstChildOfType(ASTMethodDeclarator.class);
|
if (!isCloneMethod(node)) {
|
||||||
if (!isCloneMethod(methodDeclarator)) {
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,10 +159,10 @@ public class CloneMethodMustImplementCloneableRule extends AbstractJavaRule {
|
|||||||
return classesNames;
|
return classesNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCloneMethod(final ASTMethodDeclarator method) {
|
public boolean isCloneMethod(final ASTMethodDeclaration method) {
|
||||||
if (!"clone".equals(method.getImage())) {
|
if (!"clone".equals(method.getName())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return method.getParameterCount() == 0;
|
return method.getArity() == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -183,6 +183,28 @@ class CloneableClass implements TestInterface {
|
|||||||
public CloneableClass clone() {
|
public CloneableClass clone() {
|
||||||
// clone implementation
|
// clone implementation
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
]]></code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>[java] CloneMethodMustImplementCloneable: False negative with local classes #3343</description>
|
||||||
|
<expected-problems>2</expected-problems>
|
||||||
|
<expected-linenumbers>3,9</expected-linenumbers>
|
||||||
|
<code><![CDATA[
|
||||||
|
public class Outer {
|
||||||
|
public static class Inner {
|
||||||
|
public Object clone() throws CloneNotSupportedException {
|
||||||
|
return super.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void foo() {
|
||||||
|
class Local {
|
||||||
|
public Object clone() throws CloneNotSupportedException {
|
||||||
|
return super.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]]></code>
|
]]></code>
|
||||||
</test-code>
|
</test-code>
|
||||||
|
Reference in New Issue
Block a user