[java] CloneMethodMustImplementCloneable: FN with local classes

This commit is contained in:
Andreas Dangel
2021-06-17 16:16:02 +02:00
parent 0b6c0594f1
commit f89478125a
2 changed files with 28 additions and 6 deletions

View File

@ -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.ASTImplementsList;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator;
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
/**
@ -83,9 +82,10 @@ public class CloneMethodMustImplementCloneableRule extends AbstractJavaRule {
@Override
public Object visit(final ASTMethodDeclaration node, final Object data) {
super.visit(node, data);
// Is this a clone method?
final ASTMethodDeclarator methodDeclarator = node.getFirstChildOfType(ASTMethodDeclarator.class);
if (!isCloneMethod(methodDeclarator)) {
if (!isCloneMethod(node)) {
return data;
}
@ -159,10 +159,10 @@ public class CloneMethodMustImplementCloneableRule extends AbstractJavaRule {
return classesNames;
}
public boolean isCloneMethod(final ASTMethodDeclarator method) {
if (!"clone".equals(method.getImage())) {
public boolean isCloneMethod(final ASTMethodDeclaration method) {
if (!"clone".equals(method.getName())) {
return false;
}
return method.getParameterCount() == 0;
return method.getArity() == 0;
}
}

View File

@ -183,6 +183,28 @@ class CloneableClass implements TestInterface {
public CloneableClass clone() {
// clone implementation
}
}
]]></code>
</test-code>
<test-code>
<description>[java] CloneMethodMustImplementCloneable: False negative with local classes</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>
</test-code>