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.ASTMethodDeclaration; 6 import net.sourceforge.pmd.dfa.IDataFlowNode; 7 import net.sourceforge.pmd.dfa.pathfinder.CurrentPath; 8 import net.sourceforge.pmd.dfa.pathfinder.DAAPathFinder; 9 import net.sourceforge.pmd.dfa.pathfinder.Executable; 10 import net.sourceforge.pmd.dfa.variableaccess.VariableAccess; 11 12 import java.util.HashMap ; 13 import java.util.Iterator ; 14 import java.util.Map ; 15 16 public class UselessAssignment extends AbstractRule implements Executable { 17 18 private RuleContext rc; 19 20 public Object visit(ASTMethodDeclaration node, Object data) { 21 this.rc = (RuleContext) data; 22 23 36 37 DAAPathFinder a = new DAAPathFinder((IDataFlowNode) node.getDataFlowNode().getFlow().get(0), this); 38 a.run(); 39 40 return data; 41 } 42 43 private static class Usage { 44 public int accessType; 45 public IDataFlowNode node; 46 47 public Usage(int accessType, IDataFlowNode node) { 48 this.accessType = accessType; 49 this.node = node; 50 } 51 52 public String toString() { 53 return "accessType = " + accessType + ", line = " + node.getLine(); 54 } 55 } 56 57 public void execute(CurrentPath path) { 58 Map hash = new HashMap (); 59 for (Iterator i = path.iterator(); i.hasNext();) { 61 IDataFlowNode inode = (IDataFlowNode) i.next(); 63 if (inode.getVariableAccess() == null) { 64 continue; 65 } 66 for (int j = 0; j < inode.getVariableAccess().size(); j++) { 67 VariableAccess va = (VariableAccess) inode.getVariableAccess().get(j); 68 Object o = hash.get(va.getVariableName()); 70 if (o != null) { 71 Usage u = (Usage) o; 72 75 if (va.isDefinition() && va.accessTypeMatches(u.accessType)) { 78 addViolation(rc, u.node.getSimpleNode(), va.getVariableName()); 80 } 81 93 } 94 Usage u = new Usage(va.getAccessType(), inode); 95 hash.put(va.getVariableName(), u); 96 } 97 } 98 } 99 } 100 | Popular Tags |