View Javadoc

1   package net.sourceforge.pmd.rules;
2   
3   import net.sourceforge.pmd.AbstractRule;
4   import net.sourceforge.pmd.RuleContext;
5   import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
6   import net.sourceforge.pmd.ast.ASTMethodDeclaration;
7   import net.sourceforge.pmd.ast.Node;
8   import net.sourceforge.pmd.ast.ASTFieldDeclaration;
9   import net.sourceforge.pmd.ast.SimpleNode;
10  
11  public class UnusedModifier extends AbstractRule {
12  
13      public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
14          if (!node.isInterface() && node.isNested() && (node.isPublic() || node.isStatic())) {
15              ASTClassOrInterfaceDeclaration parent = (ASTClassOrInterfaceDeclaration)node.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
16              if (parent.isInterface()) {
17                  flag(data, node);
18              }
19          } else if (node.isInterface() && node.isNested() && (node.isPublic() || node.isStatic())) {
20              ASTClassOrInterfaceDeclaration parent = (ASTClassOrInterfaceDeclaration)node.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
21              if (parent.isInterface()) {
22                  flag(data, node);
23              } else {
24                  if (node.isStatic()) {
25                      flag(data, node);
26                  }
27              }
28          }
29          return super.visit(node, data);
30      }
31  
32      public Object visit(ASTMethodDeclaration node, Object data) {
33          if (node.isPublic() || node.isAbstract()) {
34              check(node, data);
35          }
36          return super.visit(node, data);
37      }
38  
39      public Object visit(ASTFieldDeclaration node, Object data) {
40          if (node.isPublic() || node.isStatic() || node.isFinal()) {
41              check(node, data);
42          }
43          return super.visit(node, data);
44      }
45  
46      private void check(SimpleNode fieldOrMethod, Object data) {
47          // third ancestor could be an AllocationExpression
48          // if this is a method in an anonymous inner class
49          Node parent = fieldOrMethod.jjtGetParent().jjtGetParent().jjtGetParent();
50          if (parent instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclaration)parent).isInterface()) {
51              ((RuleContext) data).getReport().addRuleViolation(createRuleViolation((RuleContext) data, fieldOrMethod, getMessage()));
52          }
53      }
54  
55      private void flag(Object data, ASTClassOrInterfaceDeclaration node) {
56          ((RuleContext) data).getReport().addRuleViolation(createRuleViolation((RuleContext) data, node, getMessage()));
57      }
58  }