1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package org.codehaus.groovy.ast;
47
48 import java.util.HashMap;
49 import java.util.Map;
50
51 /***
52 * Represents a variable scope. This is primarily used to determine variable sharing
53 * across method and closure boundaries.
54 *
55 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
56 * @author Jochen Theodorou
57 * @version $Revision: 1.6 $
58 */
59 public class VariableScope {
60 private Map declaredVariables = new HashMap();
61 private Map referencedLocalVariables = new HashMap();
62 private Map referencedClassVariables = new HashMap();
63
64 private boolean inStaticContext = false;
65 private boolean resolvesDynamic = false;
66 private ClassNode clazzScope;
67 private VariableScope parent;
68
69 public VariableScope() {
70 }
71 public VariableScope(VariableScope parent) {
72 this.parent = parent;
73 }
74 public Map getDeclaredVariables() {
75 return declaredVariables;
76 }
77 public Variable getDeclaredVariable(String name) {
78 return (Variable) declaredVariables.get(name);
79 }
80 public Map getReferencedLocalVariables() {
81 return referencedLocalVariables;
82 }
83
84 public boolean isReferencedLocalVariable(String name) {
85 return referencedLocalVariables.containsKey(name);
86 }
87
88 public Map getReferencedClassVariables() {
89 return referencedClassVariables;
90 }
91
92 public boolean isReferencedClassVariable(String name) {
93 return referencedClassVariables.containsKey(name);
94 }
95 public VariableScope getParent() {
96 return parent;
97 }
98
99 public boolean isInStaticContext() {
100 return inStaticContext;
101 }
102
103 public void setInStaticContext(boolean inStaticContext) {
104 this.inStaticContext = inStaticContext;
105 }
106
107 public boolean isResolvingDynamic() {
108 return resolvesDynamic;
109 }
110
111 public void setDynamicResolving(boolean resolvesDynamic) {
112 this.resolvesDynamic = resolvesDynamic;
113 }
114
115 public void setClassScope(ClassNode node) {
116 this.clazzScope = node;
117 }
118
119 public ClassNode getClassScope(){
120 return clazzScope;
121 }
122
123 public boolean isClassScope(){
124 return clazzScope!=null;
125 }
126
127 public boolean isRoot() {
128 return parent==null;
129 }
130
131 public VariableScope copy() {
132 VariableScope copy = new VariableScope();
133 copy.clazzScope = clazzScope;
134 copy.declaredVariables.putAll(declaredVariables);
135 copy.inStaticContext = inStaticContext;
136 copy.parent = parent;
137 copy.referencedClassVariables.putAll(referencedClassVariables);
138 copy.referencedLocalVariables.putAll(referencedLocalVariables);
139 copy.resolvesDynamic = resolvesDynamic;
140 return copy;
141 }
142 }