View Javadoc

1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
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  }