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