Clover coverage report - PMD - 3.7 Coverage timestamp: Wed May 31 2006 09:25:59 EDT FRAMES NO FRAMES |
file stats: | LOC: | 163 |  | Methods: | 20
| NCLOC: | 125 |  | Classes: | 1
Source file | Conditionals | Statements | Methods | TOTAL
NameOccurrence.java | 85.7% | 96.2% | 95% | 93.1% |

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 | 2096 | public NameOccurrence(SimpleNode location, String image) {
28 | 2096 | this.location = location;
29 | 2096 | this.image = image;
30 |  | }
31 |  |
32 | 737 | public void setIsMethodOrConstructorInvocation() {
33 | 737 | isMethodOrConstructorInvocation = true;
34 |  | }
35 |  |
36 | 737 | public void setArgumentCount(int count) {
37 | 737 | argumentCount = count;
38 |  | }
39 |  |
40 | 246 | public int getArgumentCount() {
41 | 246 | return argumentCount;
42 |  | }
43 |  |
44 | 6454 | public boolean isMethodOrConstructorInvocation() {
45 | 6454 | return isMethodOrConstructorInvocation;
46 |  | }
47 |  |
48 | 624 | public void setNameWhichThisQualifies(NameOccurrence qualifiedName) {
49 | 624 | this.qualifiedName = qualifiedName;
50 |  | }
51 |  |
52 | 45 | public NameOccurrence getNameForWhichThisIsAQualifier() {
53 | 45 | return qualifiedName;
54 |  | }
55 |  |
56 | 90 | public boolean isPartOfQualifiedName() {
57 | 90 | return qualifiedName != null;
58 |  | }
59 |  |
60 | 2927 | public SimpleNode getLocation() {
61 | 2927 | return location;
62 |  | }
63 |  |
64 | 100 | public boolean isOnRightHandSide() {
65 | 100 | SimpleNode node = (SimpleNode) location.jjtGetParent().jjtGetParent().jjtGetParent();
66 | 100 | return node instanceof ASTExpression && node.jjtGetNumChildren() == 3;
67 |  | }
68 |  |
69 |  |
70 | 233 | public boolean isOnLeftHandSide() {
71 |  | // I detest this method with every atom of my being
72 | 233 | SimpleNode primaryExpression;
73 | 233 | if (location.jjtGetParent() instanceof ASTPrimaryExpression) {
74 | 5 | primaryExpression = (SimpleNode) location.jjtGetParent().jjtGetParent();
75 | 228 | } else if (location.jjtGetParent().jjtGetParent() instanceof ASTPrimaryExpression) {
76 | 228 | 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 | 233 | if (isStandAlonePostfix(primaryExpression)) {
82 | 37 | return true;
83 |  | }
84 |  |
85 | 196 | if (primaryExpression.jjtGetNumChildren() <= 1) {
86 | 30 | return false;
87 |  | }
88 |  |
89 | 166 | if (!(primaryExpression.jjtGetChild(1) instanceof ASTAssignmentOperator)) {
90 | 102 | return false;
91 |  | }
92 |  |
93 | 64 | if (isPartOfQualifiedName() /* or is an array type */) {
94 | 4 | return false;
95 |  | }
96 |  |
97 | 60 | if (isCompoundAssignment(primaryExpression)) {
98 | 4 | return false;
99 |  | }
100 |  |
101 | 56 | return true;
102 |  | }
103 |  |
104 | 60 | private boolean isCompoundAssignment(SimpleNode primaryExpression) {
105 | 60 | return ((ASTAssignmentOperator) (primaryExpression.jjtGetChild(1))).isCompound();
106 |  | }
107 |  |
108 | 233 | private boolean isStandAlonePostfix(SimpleNode primaryExpression) {
109 | 233 | if (!(primaryExpression instanceof ASTPostfixExpression) || !(primaryExpression.jjtGetParent() instanceof ASTStatementExpression)) {
110 | 195 | return false;
111 |  | }
112 |  |
113 | 38 | ASTPrimaryPrefix pf = (ASTPrimaryPrefix) ((ASTPrimaryExpression) primaryExpression.jjtGetChild(0)).jjtGetChild(0);
114 | 38 | if (pf.usesThisModifier()) {
115 | 1 | return true;
116 |  | }
117 |  |
118 | 37 | return thirdChildHasDottedName(primaryExpression);
119 |  | }
120 |  |
121 | 37 | private boolean thirdChildHasDottedName(SimpleNode primaryExpression) {
122 | 37 | Node thirdChild = primaryExpression.jjtGetChild(0).jjtGetChild(0).jjtGetChild(0);
123 | 37 | return thirdChild instanceof ASTName && ((ASTName) thirdChild).getImage().indexOf(".") == -1;
124 |  | }
125 |  |
126 | 16 | public boolean isSelfAssignment() {
127 | 16 | if (location.jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTPreDecrementExpression || location.jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTPreIncrementExpression || location.jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTPostfixExpression) {
128 | 7 | return true;
129 |  | }
130 |  |
131 | 9 | if (location.jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTStatementExpression) {
132 | 4 | ASTStatementExpression exp = (ASTStatementExpression) location.jjtGetParent().jjtGetParent().jjtGetParent();
133 | 4 | if (exp.jjtGetNumChildren() >= 2 && exp.jjtGetChild(1) instanceof ASTAssignmentOperator) {
134 | 4 | ASTAssignmentOperator op = (ASTAssignmentOperator) exp.jjtGetChild(1);
135 | 4 | if (op.isCompound()) {
136 | 3 | return true;
137 |  | }
138 |  | }
139 |  | }
140 | 6 | return false;
141 |  | }
142 |  |
143 | 7501 | public boolean isThisOrSuper() {
144 | 7501 | return image.equals("this") || image.equals("super");
145 |  | }
146 |  |
147 | 1 | public boolean equals(Object o) {
148 | 1 | NameOccurrence n = (NameOccurrence) o;
149 | 1 | return n.getImage().equals(getImage());
150 |  | }
151 |  |
152 | 366 | public int hashCode() {
153 | 366 | return getImage().hashCode();
154 |  | }
155 |  |
156 | 9960 | public String getImage() {
157 | 9960 | return image;
158 |  | }
159 |  |
160 | 0 | public String toString() {
161 | 0 | return getImage() + ":" + location.getBeginLine() + ":" + location.getClass() + (this.isMethodOrConstructorInvocation() ? "(method call)" : "");
162 |  | }
163 |  | }