AvoidFieldNameMatchingMethodNameRule.java
01 /**
02  * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03  */
04 package net.sourceforge.pmd.lang.java.rule.naming;
05 
06 import java.util.ArrayList;
07 import java.util.HashSet;
08 import java.util.List;
09 import java.util.Set;
10 
11 import net.sourceforge.pmd.lang.ast.Node;
12 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBody;
13 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
14 import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
15 import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
16 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
17 
18 public class AvoidFieldNameMatchingMethodNameRule extends AbstractJavaRule {
19 
20     @Override
21     public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
22         if (node.isInterface()) {
23             return data;
24         }
25         return super.visit(node, data);
26     }
27 
28     @Override
29     public Object visit(ASTClassOrInterfaceBody node, Object data) {
30         int n = node.jjtGetNumChildren();
31         List<ASTFieldDeclaration> fields = new ArrayList<ASTFieldDeclaration>();
32         Set<String> methodNames = new HashSet<String>();
33         for (int i = 0; i < n; i++) {
34             Node child = node.jjtGetChild(i);
35             if (child.jjtGetNumChildren() == 0) {
36                 continue;
37             }
38             child = child.jjtGetChild(child.jjtGetNumChildren()-1);
39             if (child instanceof ASTFieldDeclaration) {
40                 fields.add((ASTFieldDeclarationchild);
41             else if (child instanceof ASTMethodDeclaration) {
42                 methodNames.add(((ASTMethodDeclarationchild).getMethodName().toLowerCase());
43             }
44         }
45         for (ASTFieldDeclaration field : fields) {
46             String varName = field.getVariableName().toLowerCase();
47             if (methodNames.contains(varName)) {
48                 addViolation(data, field, field.getVariableName());
49             }
50         }
51         return super.visit(node, data);
52     }
53 
54 }