View Javadoc

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.ASTConstructorDeclaration;
7   import net.sourceforge.pmd.ast.ASTName;
8   import net.sourceforge.pmd.ast.SimpleNode;
9   import net.sourceforge.pmd.util.Applier;
10  
11  import java.util.ArrayList;
12  import java.util.HashMap;
13  import java.util.List;
14  import java.util.Map;
15  
16  public class MethodScope extends AbstractScope {
17  
18      protected Map<VariableNameDeclaration, List<NameOccurrence>> variableNames = new HashMap<VariableNameDeclaration, List<NameOccurrence>>();
19      private SimpleNode node;
20  
21      public MethodScope(SimpleNode node) {
22          this.node = node;
23      }
24  
25      public MethodScope getEnclosingMethodScope() {
26          return this;
27      }
28  
29      public Map<VariableNameDeclaration, List<NameOccurrence>> getVariableDeclarations() {
30          VariableUsageFinderFunction f = new VariableUsageFinderFunction(variableNames);
31          Applier.apply(f, variableNames.keySet().iterator());
32          return f.getUsed();
33      }
34  
35      public NameDeclaration addVariableNameOccurrence(NameOccurrence occurrence) {
36          NameDeclaration decl = findVariableHere(occurrence);
37          if (decl != null && !occurrence.isThisOrSuper()) {
38              variableNames.get(decl).add(occurrence);
39              SimpleNode n = occurrence.getLocation();
40              if (n instanceof ASTName) {
41                  ((ASTName) n).setNameDeclaration(decl);
42              } // TODO what to do with PrimarySuffix case?
43          }
44          return decl;
45      }
46  
47      public void addDeclaration(VariableNameDeclaration variableDecl) {
48          if (variableNames.containsKey(variableDecl)) {
49              throw new RuntimeException("Variable " + variableDecl + " is already in the symbol table");
50          }
51          variableNames.put(variableDecl, new ArrayList<NameOccurrence>());
52      }
53  
54      public NameDeclaration findVariableHere(NameOccurrence occurrence) {
55          if (occurrence.isThisOrSuper() || occurrence.isMethodOrConstructorInvocation()) {
56              return null;
57          }
58          ImageFinderFunction finder = new ImageFinderFunction(occurrence.getImage());
59          Applier.apply(finder, variableNames.keySet().iterator());
60          return finder.getDecl();
61      }
62  
63      public String getName() {
64          if (node instanceof ASTConstructorDeclaration) {
65              return this.getEnclosingClassScope().getClassName();
66          }
67          return ((SimpleNode) node.jjtGetChild(1)).getImage();
68      }
69  
70      public String toString() {
71          return "MethodScope:" + glomNames(variableNames.keySet());
72      }
73  }