Merge pull request #3343 from adangel:clone-method-must-implement-cloneable-fn

[java] CloneMethodMustImplementCloneable: FN with local classes #3343
This commit is contained in:
Andreas Dangel
2021-06-24 11:34:11 +02:00
3 changed files with 29 additions and 6 deletions

View File

@ -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

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.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;
} }
} }

View File

@ -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>