[java] CommentDefaultAccessModifierRule should consider constructors too

- Resolves #536
This commit is contained in:
Juan Martín Sotuyo Dodero
2017-08-02 23:56:34 -03:00
parent be5ae89bc0
commit 86501e6bc0
3 changed files with 34 additions and 3 deletions

View File

@ -12,6 +12,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTAnnotation;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator;
@ -86,6 +87,14 @@ public class CommentDefaultAccessModifierRule extends AbstractCommentRule {
return super.visit(decl, data);
}
@Override
public Object visit(final ASTConstructorDeclaration decl, Object data) {
if (shouldReport(decl)) {
addViolationWithMessage(data, decl, String.format(MESSAGE, decl.getImage(), "constructor"));
}
return super.visit(decl, data);
}
private boolean shouldReport(final AbstractJavaAccessNode decl) {
List<ASTClassOrInterfaceDeclaration> parentClassOrInterface = decl
.getParentsOfType(ASTClassOrInterfaceDeclaration.class);

View File

@ -82,9 +82,9 @@ A rule for the politically correct... we don't want to offend anyone.
message="Missing commented default access modifier"
externalInfoUrl="${pmd.website.baseurl}/rules/java/comments.html#CommentDefaultAccessModifier">
<description>
To avoid mistakes if we want that a Method, Field or Nested class have a default access modifier
we must add a comment at the beginning of the Method, Field or Nested class.
By default the comment must be /* default */, if you want another, you have to provide a regex.
To avoid mistakes if we want that a Method, Constructor, Field or Nested class have a default access modifier
we must add a comment at the beginning of it's declaration.
By default the comment must be /* default */, if you want another, you have to provide a regexp.
</description>
<priority>3</priority>
<properties>

View File

@ -155,6 +155,28 @@ public enum TestEnum {
<code><![CDATA[
public class CommentDefaultAccessModifier {
@VisibleForTesting void method() {}
}
]]></code>
</test-code>
<test-code>
<description>#536 Constructor with default access modifier should trigger</description>
<expected-problems>1</expected-problems>
<code><![CDATA[
public class Foo {
Foo() {}
}
]]></code>
</test-code>
<test-code>
<description>#536 Enum constructor with implicit private modifier should not trigger</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
public enum Bar {
ONE, TWO;
Bar() {}
}
]]></code>
</test-code>