Clover coverage report - PMD - 3.9 Coverage timestamp: Tue Dec 19 2006 09:38:44 EST FRAMES NO FRAMES |
file stats: | LOC: | 179 |  | Methods: | 20
| NCLOC: | 138 |  | Classes: | 1
Source file | Conditionals | Statements | Methods | TOTAL
NameOccurrence.java | 86.7% | 96.7% | 95% | 93.7% |

1 |  | /**
2 |  | * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 |  | */
4 |  | package net.sourceforge.pmd.symboltable;
5 |  |
6 |  | import net.sourceforge.pmd.ast.ASTAssignmentOperator;
7 |  | import net.sourceforge.pmd.ast.ASTExpression;
8 |  | import net.sourceforge.pmd.ast.ASTName;
9 |  | import net.sourceforge.pmd.ast.ASTPostfixExpression;
10 |  | import net.sourceforge.pmd.ast.ASTPreDecrementExpression;
11 |  | import net.sourceforge.pmd.ast.ASTPreIncrementExpression;
12 |  | import net.sourceforge.pmd.ast.ASTPrimaryExpression;
13 |  | import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
14 |  | import net.sourceforge.pmd.ast.ASTStatementExpression;
15 |  | import net.sourceforge.pmd.ast.Node;
16 |  | import net.sourceforge.pmd.ast.SimpleNode;
17 |  |
18 |  | public class NameOccurrence {
19 |  |
20 |  | private SimpleNode location;
21 |  | private String image;
22 |  | private NameOccurrence qualifiedName;
23 |  |
24 |  | private boolean isMethodOrConstructorInvocation;
25 |  | private int argumentCount;
26 |  |
27 | 2527 | public NameOccurrence(SimpleNode location, String image) {
28 | 2527 | this.location = location;
29 | 2527 | this.image = image;
30 |  | }
31 |  |
32 | 896 | public void setIsMethodOrConstructorInvocation() {
33 | 896 | isMethodOrConstructorInvocation = true;
34 |  | }
35 |  |
36 | 896 | public void setArgumentCount(int count) {
37 | 896 | argumentCount = count;
38 |  | }
39 |  |
40 | 255 | public int getArgumentCount() {
41 | 255 | return argumentCount;
42 |  | }
43 |  |
44 | 7898 | public boolean isMethodOrConstructorInvocation() {
45 | 7898 | return isMethodOrConstructorInvocation;
46 |  | }
47 |  |
48 | 710 | public void setNameWhichThisQualifies(NameOccurrence qualifiedName) {
49 | 710 | this.qualifiedName = qualifiedName;
50 |  | }
51 |  |
52 | 51 | public NameOccurrence getNameForWhichThisIsAQualifier() {
53 | 51 | return qualifiedName;
54 |  | }
55 |  |
56 | 101 | public boolean isPartOfQualifiedName() {
57 | 101 | return qualifiedName != null;
58 |  | }
59 |  |
60 | 3552 | public SimpleNode getLocation() {
61 | 3552 | return location;
62 |  | }
63 |  |
64 | 110 | public boolean isOnRightHandSide() {
65 | 110 | SimpleNode node = (SimpleNode) location.jjtGetParent().jjtGetParent().jjtGetParent();
66 | 110 | return node instanceof ASTExpression && node.jjtGetNumChildren() == 3;
67 |  | }
68 |  |
69 |  |
70 | 268 | public boolean isOnLeftHandSide() {
71 |  | // I detest this method with every atom of my being
72 | 268 | SimpleNode primaryExpression;
73 | 268 | if (location.jjtGetParent() instanceof ASTPrimaryExpression) {
74 | 5 | primaryExpression = (SimpleNode) location.jjtGetParent().jjtGetParent();
75 | 263 | } else if (location.jjtGetParent().jjtGetParent() instanceof ASTPrimaryExpression) {
76 | 263 | primaryExpression = (SimpleNode) location.jjtGetParent().jjtGetParent().jjtGetParent();
77 |  | } else {
78 | 0 | throw new RuntimeException("Found a NameOccurrence that didn't have an ASTPrimary Expression as parent or grandparent. Parent = " + location.jjtGetParent() + " and grandparent = " + location.jjtGetParent().jjtGetParent());
79 |  | }
80 |  |
81 | 268 | if (isStandAlonePostfix(primaryExpression)) {
82 | 40 | return true;
83 |  | }
84 |  |
85 | 228 | if (primaryExpression.jjtGetNumChildren() <= 1) {
86 | 41 | return false;
87 |  | }
88 |  |
89 | 187 | if (!(primaryExpression.jjtGetChild(1) instanceof ASTAssignmentOperator)) {
90 | 112 | return false;
91 |  | }
92 |  |
93 | 75 | if (isPartOfQualifiedName() /* or is an array type */) {
94 | 4 | return false;
95 |  | }
96 |  |
97 | 71 | if (isCompoundAssignment(primaryExpression)) {
98 | 6 | return false;
99 |  | }
100 |  |
101 | 65 | return true;
102 |  | }
103 |  |
104 | 71 | private boolean isCompoundAssignment(SimpleNode primaryExpression) {
105 | 71 | return ((ASTAssignmentOperator) (primaryExpression.jjtGetChild(1))).isCompound();
106 |  | }
107 |  |
108 | 268 | private boolean isStandAlonePostfix(SimpleNode primaryExpression) {
109 | 268 | if (!(primaryExpression instanceof ASTPostfixExpression) || !(primaryExpression.jjtGetParent() instanceof ASTStatementExpression)) {
110 | 227 | return false;
111 |  | }
112 |  |
113 | 41 | ASTPrimaryPrefix pf = (ASTPrimaryPrefix) ((ASTPrimaryExpression) primaryExpression.jjtGetChild(0)).jjtGetChild(0);
114 | 41 | if (pf.usesThisModifier()) {
115 | 1 | return true;
116 |  | }
117 |  |
118 | 40 | return thirdChildHasDottedName(primaryExpression);
119 |  | }
120 |  |
121 | 40 | private boolean thirdChildHasDottedName(SimpleNode primaryExpression) {
122 | 40 | Node thirdChild = primaryExpression.jjtGetChild(0).jjtGetChild(0).jjtGetChild(0);
123 | 40 | return thirdChild instanceof ASTName && ((ASTName) thirdChild).getImage().indexOf('.') == -1;
124 |  | }
125 |  |
126 | 23 | public boolean isSelfAssignment() {
127 | 23 | Node l = location;
128 | 23 | while (true) {
129 | 24 | Node p = l.jjtGetParent();
130 | 24 | Node gp = p.jjtGetParent();
131 | 24 | Node node = gp.jjtGetParent();
132 | 24 | if (node instanceof ASTPreDecrementExpression || node instanceof ASTPreIncrementExpression || node instanceof ASTPostfixExpression) {
133 | 9 | return true;
134 |  | }
135 |  |
136 | 15 | if (node instanceof ASTStatementExpression) {
137 | 6 | ASTStatementExpression exp = (ASTStatementExpression) node;
138 | 6 | if (exp.jjtGetNumChildren() >= 2 && exp.jjtGetChild(1) instanceof ASTAssignmentOperator) {
139 | 6 | ASTAssignmentOperator op = (ASTAssignmentOperator) exp.jjtGetChild(1);
140 | 6 | if (op.isCompound()) {
141 | 5 | return true;
142 |  | }
143 |  | }
144 |  | }
145 |  |
146 |  | // deal with extra parenthesis: "(i)++"
147 | 10 | if (p instanceof ASTPrimaryPrefix && p.jjtGetNumChildren() == 1 &&
148 |  | gp instanceof ASTPrimaryExpression && gp.jjtGetNumChildren() == 1&&
149 |  | node instanceof ASTExpression && node.jjtGetNumChildren() == 1 &&
150 |  | node.jjtGetParent() instanceof ASTPrimaryPrefix && node.jjtGetParent().jjtGetNumChildren() == 1) {
151 | 1 | l = node;
152 | 1 | continue;
153 |  | }
154 |  |
155 | 9 | return false;
156 |  | }
157 |  | }
158 |  |
159 | 9159 | public boolean isThisOrSuper() {
160 | 9159 | return image.equals("this") || image.equals("super");
161 |  | }
162 |  |
163 | 1 | public boolean equals(Object o) {
164 | 1 | NameOccurrence n = (NameOccurrence) o;
165 | 1 | return n.getImage().equals(getImage());
166 |  | }
167 |  |
168 | 389 | public int hashCode() {
169 | 389 | return getImage().hashCode();
170 |  | }
171 |  |
172 | 12132 | public String getImage() {
173 | 12132 | return image;
174 |  | }
175 |  |
176 | 0 | public String toString() {
177 | 0 | return getImage() + ":" + location.getBeginLine() + ":" + location.getClass() + (this.isMethodOrConstructorInvocation() ? "(method call)" : "");
178 |  | }
179 |  | }