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
24
25
26
27
28
29
30
31
32
33
34
35
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
60 for (Iterator i = path.iterator(); i.hasNext();) {
61
62 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
69 Object o = hash.get(va.getVariableName());
70 if (o != null) {
71 Usage u = (Usage) o;
72
73
74
75
76
77 if (va.isDefinition() && va.accessTypeMatches(u.accessType)) {
78
79 addViolation(rc, u.node.getSimpleNode(), va.getVariableName());
80 }
81
82
83
84
85
86
87
88
89
90
91
92
93 }
94 Usage u = new Usage(va.getAccessType(), inode);
95 hash.put(va.getVariableName(), u);
96 }
97 }
98 }
99 }