/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.java.rule.naming; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBody; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; public class AvoidFieldNameMatchingMethodNameRule extends AbstractJavaRule { @Override public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { if (node.isInterface()) { return data; } return super.visit(node, data); } @Override public Object visit(ASTClassOrInterfaceBody node, Object data) { int n = node.jjtGetNumChildren(); List<ASTFieldDeclaration> fields = new ArrayList<>(); Set<String> methodNames = new HashSet<>(); for (int i = 0; i < n; i++) { Node child = node.jjtGetChild(i); if (child.jjtGetNumChildren() == 0) { continue; } child = child.jjtGetChild(child.jjtGetNumChildren() - 1); if (child instanceof ASTFieldDeclaration) { fields.add((ASTFieldDeclaration) child); } else if (child instanceof ASTMethodDeclaration) { methodNames.add(((ASTMethodDeclaration) child).getMethodName().toLowerCase()); } } for (ASTFieldDeclaration field : fields) { String varName = field.getVariableName().toLowerCase(); if (methodNames.contains(varName)) { addViolation(data, field, field.getVariableName()); } } return super.visit(node, data); } }