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