UnusedModifierRule.java
01 package net.sourceforge.pmd.lang.java.rule.unusedcode;
02 
03 import net.sourceforge.pmd.lang.ast.Node;
04 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
05 import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
06 import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
07 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
08 
09 public class UnusedModifierRule extends AbstractJavaRule {
10 
11     public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
12         if (!node.isInterface() && node.isNested() && (node.isPublic() || node.isStatic())) {
13             ASTClassOrInterfaceDeclaration parent = node.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
14             if (parent != null && parent.isInterface()) {
15                 addViolation(data, node, getMessage());
16             }
17         else if (node.isInterface() && node.isNested() && (node.isPublic() || node.isStatic())) {
18             ASTClassOrInterfaceDeclaration parent = node.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
19             if (parent.isInterface() || (!parent.isInterface() && node.isStatic())) {
20                 addViolation(data, node, getMessage());
21             }
22         }
23         return super.visit(node, data);
24     }
25 
26     public Object visit(ASTMethodDeclaration node, Object data) {
27         if (node.isSyntacticallyPublic() || node.isSyntacticallyAbstract()) {
28             check(node, data);
29         }
30         return super.visit(node, data);
31     }
32 
33     public Object visit(ASTFieldDeclaration node, Object data) {
34         if (node.isSyntacticallyPublic() || node.isSyntacticallyStatic() || node.isSyntacticallyFinal()) {
35             check(node, data);
36         }
37         return super.visit(node, data);
38     }
39 
40     private void check(Node fieldOrMethod, Object data) {
41         // third ancestor could be an AllocationExpression
42         // if this is a method in an anonymous inner class
43         Node parent = fieldOrMethod.jjtGetParent().jjtGetParent().jjtGetParent();
44         if (parent instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclarationparent).isInterface()) {
45             addViolation(data, fieldOrMethod);
46         }
47     }
48 
49 }