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