1 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 variableNames = new HashMap (); 18 19 public NameDeclaration addVariableNameOccurrence(NameOccurrence occurrence) { 20 NameDeclaration decl = findVariableHere(occurrence); 21 if (decl != null && !occurrence.isThisOrSuper()) { 22 List nameOccurrences = (List ) variableNames.get(decl); 23 nameOccurrences.add(occurrence); 24 SimpleNode n = occurrence.getLocation(); 25 if (n instanceof ASTName) { 26 ((ASTName) n).setNameDeclaration(decl); 27 } } 29 return decl; 30 } 31 32 public Map 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 ()); 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().iterator()); 56 } 57 } 58 | Popular Tags |