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.expr;
47
48 import org.codehaus.groovy.ast.ClassHelper;
49 import org.codehaus.groovy.ast.ClassNode;
50 import org.codehaus.groovy.ast.GroovyCodeVisitor;
51 import org.codehaus.groovy.ast.Variable;
52
53 /***
54 * Represents a local variable name, the simplest form of expression. e.g. "foo".
55 *
56 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
57 * @version $Revision: 1.14 $
58 */
59 public class VariableExpression extends Expression implements Variable {
60
61 public static final VariableExpression THIS_EXPRESSION = new VariableExpression("this", ClassHelper.DYNAMIC_TYPE);
62 public static final VariableExpression SUPER_EXPRESSION = new VariableExpression("super", ClassHelper.DYNAMIC_TYPE);
63
64 private String variable;
65 private boolean inStaticContext;
66 private boolean isDynamicTyped=false;
67 private Variable accessedVariable;
68 boolean closureShare=false;
69
70 public Variable getAccessedVariable() {
71 return accessedVariable;
72 }
73
74 public void setAccessedVariable(Variable origin) {
75 this.accessedVariable = origin;
76 }
77
78 public VariableExpression(String variable, ClassNode type) {
79 this.variable = variable;
80 super.setType(ClassHelper.getWrapper(type));
81 }
82
83 public VariableExpression(String variable) {
84 this(variable, ClassHelper.DYNAMIC_TYPE);
85 }
86
87 public VariableExpression(Variable variable) {
88 this(variable.getName(), variable.getType());
89 setAccessedVariable(variable);
90 }
91
92 public void visit(GroovyCodeVisitor visitor) {
93 visitor.visitVariableExpression(this);
94 }
95
96 public Expression transformExpression(ExpressionTransformer transformer) {
97 return this;
98 }
99
100 public String getText() {
101 return variable;
102 }
103
104 public String getName() {
105 return variable;
106 }
107
108 /***
109 * @return true if this variable is dynamically typed
110 */
111 public String toString() {
112 return super.toString() + "[variable: " + variable + (this.isDynamicTyped() ? "" : " type: " + getType()) + "]";
113 }
114
115 public Expression getInitialExpression() {
116 return null;
117 }
118
119 public boolean hasInitialExpression() {
120 return false;
121 }
122
123 public boolean isInStaticContext() {
124 if (accessedVariable!=null && accessedVariable!=this) return accessedVariable.isInStaticContext();
125 return inStaticContext;
126 }
127
128 public void setInStaticContext(boolean inStaticContext) {
129 this.inStaticContext = inStaticContext;
130 }
131
132 public void setType(ClassNode cn){
133 super.setType(cn);
134 isDynamicTyped |= ClassHelper.DYNAMIC_TYPE==cn;
135 }
136
137 public boolean isDynamicTyped() {
138 return isDynamicTyped;
139 }
140
141 public boolean isClosureSharedVariable() {
142 if (accessedVariable!=null && accessedVariable!=this) return accessedVariable.isClosureSharedVariable();
143 return closureShare;
144 }
145
146 public void setClosureSharedVariable(boolean inClosure) {
147 closureShare = inClosure;
148 }
149
150 public ClassNode getType() {
151 if (accessedVariable!=null && accessedVariable!=this) return accessedVariable.getType();
152 return super.getType();
153 }
154 }