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
48
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 }