Add ignore override property

This commit is contained in:
Clément Fournier
2017-11-11 20:59:27 +01:00
parent c647f73811
commit 2efb52be14
2 changed files with 98 additions and 0 deletions

View File

@ -5,14 +5,18 @@
package net.sourceforge.pmd.lang.java.rule.documentation; package net.sourceforge.pmd.lang.java.rule.documentation;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTMarkerAnnotation;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTName;
import net.sourceforge.pmd.lang.java.ast.AbstractJavaAccessNode; import net.sourceforge.pmd.lang.java.ast.AbstractJavaAccessNode;
import net.sourceforge.pmd.properties.BooleanProperty;
import net.sourceforge.pmd.properties.EnumeratedProperty; import net.sourceforge.pmd.properties.EnumeratedProperty;
import net.sourceforge.pmd.properties.PropertySource; import net.sourceforge.pmd.properties.PropertySource;
@ -40,6 +44,14 @@ public class CommentRequiredRule extends AbstractCommentRule {
} }
} }
private boolean ignoreOverrideMethods = true;
public static final BooleanProperty IGNORE_OVERRIDE_DESCRIPTOR =
BooleanProperty.named("ignoreOverride")
.desc("Ignore methods marked with @Override")
.defaultValue(true)
.build();
public static final EnumeratedProperty<CommentRequirement> HEADER_CMT_REQUIREMENT_DESCRIPTOR = new EnumeratedProperty<>( public static final EnumeratedProperty<CommentRequirement> HEADER_CMT_REQUIREMENT_DESCRIPTOR = new EnumeratedProperty<>(
"headerCommentRequirement", "headerCommentRequirement",
"Header comments. Possible values: " + Arrays.toString(CommentRequirement.values()), "Header comments. Possible values: " + Arrays.toString(CommentRequirement.values()),
@ -70,6 +82,7 @@ public class CommentRequiredRule extends AbstractCommentRule {
CommentRequirement.labels(), CommentRequirement.values(), 1, CommentRequirement.class, 6.0f); CommentRequirement.labels(), CommentRequirement.values(), 1, CommentRequirement.class, 6.0f);
public CommentRequiredRule() { public CommentRequiredRule() {
definePropertyDescriptor(IGNORE_OVERRIDE_DESCRIPTOR);
definePropertyDescriptor(HEADER_CMT_REQUIREMENT_DESCRIPTOR); definePropertyDescriptor(HEADER_CMT_REQUIREMENT_DESCRIPTOR);
definePropertyDescriptor(FIELD_CMT_REQUIREMENT_DESCRIPTOR); definePropertyDescriptor(FIELD_CMT_REQUIREMENT_DESCRIPTOR);
definePropertyDescriptor(PUB_METHOD_CMT_REQUIREMENT_DESCRIPTOR); definePropertyDescriptor(PUB_METHOD_CMT_REQUIREMENT_DESCRIPTOR);
@ -122,6 +135,15 @@ public class CommentRequiredRule extends AbstractCommentRule {
@Override @Override
public Object visit(ASTMethodDeclaration decl, Object data) { public Object visit(ASTMethodDeclaration decl, Object data) {
if (ignoreOverrideMethods) {
List<ASTMarkerAnnotation> annotations = decl.jjtGetParent().findDescendantsOfType(ASTMarkerAnnotation.class);
for (ASTMarkerAnnotation ann : annotations) {
if (ann.getFirstChildOfType(ASTName.class).getImage().equals("Override")) {
return super.visit(decl, data);
}
}
}
checkComment(decl, data); checkComment(decl, data);
return super.visit(decl, data); return super.visit(decl, data);
} }
@ -249,6 +271,7 @@ public class CommentRequiredRule extends AbstractCommentRule {
@Override @Override
public Object visit(ASTCompilationUnit cUnit, Object data) { public Object visit(ASTCompilationUnit cUnit, Object data) {
assignCommentsToDeclarations(cUnit); assignCommentsToDeclarations(cUnit);
ignoreOverrideMethods = getProperty(IGNORE_OVERRIDE_DESCRIPTOR);
return super.visit(cUnit, data); return super.visit(cUnit, data);
} }

View File

@ -216,4 +216,79 @@ public class PmdMissingHeaderCommentTest {
} }
]]></code> ]]></code>
</test-code> </test-code>
<test-code>
<description>Comment required ignores @override methods by default</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
/**
* Comment required test class.
*/
public class CommentRequired {
@Override
public void noComment() {
Object o = new Object() {
@Override
public String toString() {
return "Inner Class";
}
};
}
}
]]></code>
</test-code>
<test-code>
<description>Test @override methods reporting</description>
<rule-property name="ignoreOverride">false</rule-property>
<expected-problems>2</expected-problems>
<code><![CDATA[
/**
* Comment required test class.
*/
public class CommentRequired {
@Override
public void noComment() {
Object o = new Object() {
@Override
public String toString() {
return "Inner Class";
}
};
}
}
]]></code>
</test-code>
<test-code>
<description>Test @override methods reporting #2</description>
<rule-property name="ignoreOverride">false</rule-property>
<expected-problems>0</expected-problems>
<code><![CDATA[
/**
* Comment required test class.
*/
public class CommentRequired {
/**
* Comment provided
*/
@Override
public void noComment() {
Object o = new Object() {
/**
* @inheritDoc
*/
@Override
public String toString() {
return "Inner Class";
}
};
}
}
]]></code>
</test-code>
</test-data> </test-data>