Skip to content

Commit

Permalink
Merge pull request #3543 from adangel:issue-3542-missing-override-enum
Browse files Browse the repository at this point in the history
[java] MissingOverride: False negative for enum method #3542
  • Loading branch information
adangel committed Oct 29, 2021
2 parents f5fd79d + a1a3586 commit 15270c8
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 22 deletions.
2 changes: 2 additions & 0 deletions docs/pages/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ This is a {{ site.pmd.release_type }} release.
* [#3570](https://github.com/pmd/pmd/issues/3570): \[apex] OneDeclarationPerLine: should provide an option to ignore multiple declarations in a for loop initializer
* [#3576](https://github.com/pmd/pmd/issues/3576): \[apex] ApexCRUDViolation should provide an option to specify additional patterns for methods that encapsulate authorization checks
* [#3579](https://github.com/pmd/pmd/issues/3579): \[apex] ApexCRUDViolation: false negative with undelete
* java-bestpractices
* [#3542](https://github.com/pmd/pmd/issues/3542): \[java] MissingOverride: False negative for enum method
* java-errorprone
* [#3560](https://github.com/pmd/pmd/issues/3560): \[java] InvalidLogMessageFormat: False positive with message and exception in a block inside a lambda
* java-performance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
*
* </pre>
*/
public class ASTEnumConstant extends AbstractJavaNode implements JavaQualifiableNode {
public class ASTEnumConstant extends AbstractJavaTypeNode implements JavaQualifiableNode {

private JavaTypeQualifiedName qualifiedName;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,14 @@ public Object visit(ASTAllocationExpression node, Object data) {

@Override
public Object visit(ASTEnumConstant node, Object data) {
// FIXME, ASTEnumConstant needs typeres support!
// if (node.isAnonymousClass()) {
// currentExploredClass.push(node.getType());
// }
if (node.isAnonymousClass()) {
currentLookup.push(getMethodLookup(node.getType()));
}
super.visit(node, data);

// if (node.isAnonymousClass()) {
// currentExploredClass.pop();
// }
if (node.isAnonymousClass()) {
currentLookup.pop();
}

return data;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import net.sourceforge.pmd.lang.java.ast.ASTBooleanLiteral;
import net.sourceforge.pmd.lang.java.ast.ASTBreakStatement;
import net.sourceforge.pmd.lang.java.ast.ASTCastExpression;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBody;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
Expand All @@ -48,6 +49,7 @@
import net.sourceforge.pmd.lang.java.ast.ASTConditionalOrExpression;
import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTEnumConstant;
import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTEqualityExpression;
import net.sourceforge.pmd.lang.java.ast.ASTExclusiveOrExpression;
import net.sourceforge.pmd.lang.java.ast.ASTExpression;
Expand Down Expand Up @@ -258,14 +260,34 @@ public Object visit(ASTTypeDeclaration node, Object data) {
return data;
}

@Override
public Object visit(ASTEnumConstant node, Object data) {
super.visit(node, data);

if (node.getNumChildren() > 0 && node.getFirstChildOfType(ASTClassOrInterfaceBody.class) != null) {
ASTEnumDeclaration enumDecl = (ASTEnumDeclaration) node.getParent().getParent();
int clazznumber = node.getIndexInParent() + 1;
JavaTypeDefinition enumType = enumDecl.getTypeDefinition();

if (enumType != null) {
String constantType = enumType.getType().getName() + "$" + clazznumber;
Class<?> enumConstantClass = pmdClassLoader.loadClassOrNull(constantType);
if (enumConstantClass != null) {
node.setTypeDefinition(JavaTypeDefinition.forClass(enumConstantClass));
}
}
}
return data;
}

@Override
public Object visit(ASTClassOrInterfaceType node, Object data) {
super.visit(node, data);

String typeName = node.getImage();

if (node.isAnonymousClass()) {
QualifiableNode parent = node.getFirstParentOfAnyType(ASTAllocationExpression.class, ASTEnumConstant.class);
QualifiableNode parent = node.getFirstParentOfType(ASTAllocationExpression.class);

if (parent != null) {
typeName = parent.getQualifiedName().toString();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/

package net.sourceforge.pmd.lang.java.rule.bestpractices.missingoverride;

public enum EnumToString {
sub_EnumClazz {
// missing @Override
public String toString() {
return "test";
}

// missing @Override
public void notOverride() {
System.out.println("test");
}
};

// missing @Override
public String toString() {
return "test";
}

public void notOverride() {
System.out.println("test");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,18 @@
*/
public enum EnumWithAnonClass {
Foo {
@Override
// missing
public String toString() {
return super.toString();
}

// missing
public String getSomething() {
return null;
}
};


public Object getSomething() {
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -202,32 +202,26 @@ public class ConcreteClassArrayParams extends AbstractClass {
]]></code>
</test-code>

<test-code regressionTest="false"> <!-- FIXME bug in typeres, anon constants are not resolved -->
<description>Consider enum anon class</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>10</expected-linenumbers>
<test-code>
<description>Consider enum anon class (#3542)</description>
<expected-problems>2</expected-problems>
<expected-linenumbers>6,11</expected-linenumbers>
<code><![CDATA[
package net.sourceforge.pmd.lang.java.rule.bestpractices.missingoverride;
import net.sourceforge.pmd.lang.java.ast.ASTAnyTypeDeclaration;
import net.sourceforge.pmd.lang.metrics.Metric;
import net.sourceforge.pmd.lang.metrics.MetricKey;
public enum EnumWithAnonClass {
Foo {
// missing
public String toString() {
return super.toString();
}
// missing
public String getSomething() {
return null;
}
};
public Object getSomething() {
return null;
}
Expand Down Expand Up @@ -565,4 +559,36 @@ public record Point(int x, int y) {
]]></code>
<source-type>java 16</source-type>
</test-code>

<test-code>
<description>[java] MissingOverride: False negative for enum method #3542</description>
<expected-problems>3</expected-problems>
<expected-linenumbers>6,11,17</expected-linenumbers>
<code><![CDATA[
package net.sourceforge.pmd.lang.java.rule.bestpractices.missingoverride;
public enum EnumToString {
sub_EnumClazz {
// missing @Override
public String toString() {
return "test";
}
// missing @Override
public void notOverride() {
System.out.println("test");
}
};
// missing @Override
public String toString() {
return "test";
}
public void notOverride() {
System.out.println("test");
}
}
]]></code>
</test-code>
</test-data>

0 comments on commit 15270c8

Please sign in to comment.