1 /*** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package net.sourceforge.pmd.rules; 5 6 import net.sourceforge.pmd.AbstractRule; 7 import net.sourceforge.pmd.RuleContext; 8 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration; 9 import net.sourceforge.pmd.symboltable.NameOccurrence; 10 import net.sourceforge.pmd.symboltable.VariableNameDeclaration; 11 12 import java.text.MessageFormat; 13 import java.util.Iterator; 14 import java.util.List; 15 import java.util.Map; 16 17 public class UnusedPrivateFieldRule extends AbstractRule { 18 19 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { 20 Map vars = node.getScope().getVariableDeclarations(); 21 for (Iterator i = vars.keySet().iterator(); i.hasNext();) { 22 VariableNameDeclaration decl = (VariableNameDeclaration) i.next(); 23 if (!decl.getAccessNodeParent().isPrivate() || isOK(decl.getImage())) { 24 continue; 25 } 26 if (!actuallyUsed((List) vars.get(decl))) { 27 ((RuleContext) data).getReport().addRuleViolation(createRuleViolation((RuleContext) data, decl, MessageFormat.format(getMessage(), new Object[]{decl.getImage()}))); 28 } 29 } 30 return super.visit(node, data); 31 } 32 33 private boolean actuallyUsed(List usages) { 34 for (Iterator j = usages.iterator(); j.hasNext();) { 35 NameOccurrence nameOccurrence = (NameOccurrence) j.next(); 36 if (!nameOccurrence.isOnLeftHandSide()) { 37 return true; 38 } 39 } 40 return false; 41 } 42 43 private boolean isOK(String image) { 44 return image.equals("serialVersionUID") || image.equals("serialPersistentFields") || image.equals("IDENT"); 45 } 46 }