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.List;
7   import java.util.Map;
8   
9   import net.sourceforge.pmd.lang.ast.Node;
10  import net.sourceforge.pmd.lang.java.ast.ASTName;
11  import net.sourceforge.pmd.lang.symboltable.NameDeclaration;
12  import net.sourceforge.pmd.lang.symboltable.NameOccurrence;
13  
14  /**
15   * A LocalScope can have variable declarations and class declarations within it.
16   */
17  public class LocalScope extends AbstractJavaScope {
18  
19      public Map<VariableNameDeclaration, List<NameOccurrence>> getVariableDeclarations() {
20          return getDeclarations(VariableNameDeclaration.class);
21      }
22  
23      public NameDeclaration addNameOccurrence(NameOccurrence occurrence) {
24          JavaNameOccurrence javaOccurrence = (JavaNameOccurrence) occurrence;
25          NameDeclaration decl = findVariableHere(javaOccurrence);
26          if (decl != null && !javaOccurrence.isThisOrSuper()) {
27              List<NameOccurrence> nameOccurrences = getVariableDeclarations().get(decl);
28              nameOccurrences.add(javaOccurrence);
29              Node n = javaOccurrence.getLocation();
30              if (n instanceof ASTName) {
31                  ((ASTName) n).setNameDeclaration(decl);
32              } // TODO what to do with PrimarySuffix case?
33          }
34          return decl;
35      }
36  
37      public void addDeclaration(NameDeclaration nameDecl) {
38          if (!(nameDecl instanceof VariableNameDeclaration || nameDecl instanceof ClassNameDeclaration)) {
39              throw new IllegalArgumentException(
40                      "A LocalScope can contain only VariableNameDeclarations or ClassNameDeclarations. "
41                              + "Tried to add " + nameDecl.getClass() + "(" + nameDecl + ")");
42          }
43          super.addDeclaration(nameDecl);
44      }
45  
46      public NameDeclaration findVariableHere(JavaNameOccurrence occurrence) {
47          if (occurrence.isThisOrSuper() || occurrence.isMethodOrConstructorInvocation()) {
48              return null;
49          }
50          ImageFinderFunction finder = new ImageFinderFunction(occurrence.getImage());
51          Applier.apply(finder, getVariableDeclarations().keySet().iterator());
52          return finder.getDecl();
53      }
54  
55      public String toString() {
56          return "LocalScope:" + glomNames(getVariableDeclarations().keySet());
57      }
58  }