NameFinder.java
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 = (ASTPrimaryPrefixnode.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() && node.jjtGetChild(0instanceof ASTName) {
43             ASTName grandchild = (ASTNamenode.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 = (ASTPrimarySuffixnode;
50             if (suffix.isArguments()) {
51                 NameOccurrence occurrence = names.get(names.size() 1);
52                 occurrence.setIsMethodOrConstructorInvocation();
53                 ASTArguments args = (ASTArguments) ((ASTPrimarySuffixnode).jjtGetChild(0);
54                 occurrence.setArgumentCount(args.getArgumentCount());
55             else if (suffix.jjtGetNumChildren() == && suffix.jjtGetChild(0instanceof 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 }