1 package net.sourceforge.pmd.symboltable;
2
3 import net.sourceforge.pmd.util.Applier;
4
5 import java.util.ArrayList;
6 import java.util.HashMap;
7 import java.util.Iterator;
8 import java.util.List;
9 import java.util.Map;
10
11 /***
12 * Provides behavior common to all Scopes
13 */
14 public abstract class AbstractScope implements Scope {
15
16 private Scope parent;
17 protected Map variableNames = new HashMap();
18 protected Map methodNames = new HashMap();
19
20 public ClassScope getEnclosingClassScope() {
21 return parent.getEnclosingClassScope();
22 }
23
24 public void setParent(Scope parent) {
25 this.parent = parent;
26 }
27
28 public Scope getParent() {
29 return parent;
30 }
31
32 public void addDeclaration(VariableNameDeclaration variableDecl) {
33 if (variableNames.containsKey(variableDecl)) {
34 throw new RuntimeException("Variable " + variableDecl + " is already in the symbol table");
35 }
36 variableNames.put(variableDecl, new ArrayList());
37 }
38
39 public void addDeclaration(MethodNameDeclaration methodDecl) {
40 parent.addDeclaration(methodDecl);
41 }
42
43 public boolean contains(NameOccurrence occurrence) {
44 return findVariableHere(occurrence) != null;
45 }
46
47 public Map getVariableDeclarations(boolean lookingForUsed) {
48 VariableUsageFinderFunction f = new VariableUsageFinderFunction(variableNames, lookingForUsed);
49 Applier.apply(f, variableNames.keySet().iterator());
50 return f.getUsed();
51 }
52
53 public NameDeclaration addVariableNameOccurrence(NameOccurrence occurrence) {
54 NameDeclaration decl = findVariableHere(occurrence);
55 if (decl != null && !occurrence.isThisOrSuper()) {
56 List nameOccurrences = (List) variableNames.get(decl);
57 nameOccurrences.add(occurrence);
58 }
59 return decl;
60 }
61
62 protected abstract NameDeclaration findVariableHere(NameOccurrence occurrence);
63
64 protected String glomNames() {
65 String result = "";
66 for (Iterator i = variableNames.keySet().iterator(); i.hasNext();) {
67 result += i.next().toString() + ",";
68 }
69 return result;
70 }
71
72 }
This page was automatically generated by Maven