01 /**
02 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03 */
04 package net.sourceforge.pmd.lang.java.symboltable;
05
06 import java.util.ArrayList;
07 import java.util.List;
08 import java.util.StringTokenizer;
09
10 import net.sourceforge.pmd.lang.java.ast.ASTArguments;
11 import net.sourceforge.pmd.lang.java.ast.ASTMemberSelector;
12 import net.sourceforge.pmd.lang.java.ast.ASTName;
13 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
14 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
15 import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
16 import net.sourceforge.pmd.lang.java.ast.JavaNode;
17
18 public class NameFinder {
19
20 private List<NameOccurrence> names = new ArrayList<NameOccurrence>();
21
22 public NameFinder(ASTPrimaryExpression node) {
23 ASTPrimaryPrefix prefix = (ASTPrimaryPrefix) node.jjtGetChild(0);
24 if (prefix.usesSuperModifier()) {
25 add(new NameOccurrence(prefix, "super"));
26 } else if (prefix.usesThisModifier()) {
27 add(new NameOccurrence(prefix, "this"));
28 }
29 for (int i = 0; i < node.jjtGetNumChildren(); i++) {
30 checkForNameChild((JavaNode)node.jjtGetChild(i));
31 }
32 }
33
34 public List<NameOccurrence> getNames() {
35 return names;
36 }
37
38 private void checkForNameChild(JavaNode node) {
39 if (node.getImage() != null) {
40 add(new NameOccurrence(node, node.getImage()));
41 }
42 if (node.jjtGetNumChildren() > 0 && node.jjtGetChild(0) instanceof ASTName) {
43 ASTName grandchild = (ASTName) node.jjtGetChild(0);
44 for (StringTokenizer st = new StringTokenizer(grandchild.getImage(), "."); st.hasMoreTokens();) {
45 add(new NameOccurrence(grandchild, st.nextToken()));
46 }
47 }
48 if (node instanceof ASTPrimarySuffix) {
49 ASTPrimarySuffix suffix = (ASTPrimarySuffix) node;
50 if (suffix.isArguments()) {
51 NameOccurrence occurrence = names.get(names.size() - 1);
52 occurrence.setIsMethodOrConstructorInvocation();
53 ASTArguments args = (ASTArguments) ((ASTPrimarySuffix) node).jjtGetChild(0);
54 occurrence.setArgumentCount(args.getArgumentCount());
55 } else if (suffix.jjtGetNumChildren() == 1 && suffix.jjtGetChild(0) instanceof ASTMemberSelector) {
56 add(new NameOccurrence((JavaNode)suffix.jjtGetChild(0), suffix.jjtGetChild(0).getImage()));
57 }
58 }
59 }
60
61 private void add(NameOccurrence name) {
62 names.add(name);
63 if (names.size() > 1) {
64 NameOccurrence qualifiedName = names.get(names.size() - 2);
65 qualifiedName.setNameWhichThisQualifies(name);
66 }
67 }
68
69
70 @Override
71 public String toString() {
72 StringBuffer result = new StringBuffer();
73 for (NameOccurrence occ: names) {
74 result.append(occ.getImage());
75 }
76 return result.toString();
77 }
78 }
|