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 java.lang.reflect.Field;
49 import java.lang.reflect.Method;
50 import java.lang.reflect.Modifier;
51
52 import org.codehaus.groovy.ast.ClassHelper;
53 import org.codehaus.groovy.ast.GroovyCodeVisitor;
54
55 /***
56 * Represents a property access such as the expression "foo.bar".
57 *
58 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
59 * @version $Revision: 4287 $
60 */
61 public class PropertyExpression extends Expression {
62
63 private Expression objectExpression;
64 private Expression property;
65 private boolean spreadSafe = false;
66 private boolean safe = false;
67 private boolean isStatic = false;
68
69 private Method getter = null;
70 private Method setter = null;
71
72 private Field field = null;
73 private int access = -1;
74 private boolean implicitThis = false;
75
76 public boolean isStatic() {
77 return isStatic;
78 }
79
80 public PropertyExpression(Expression objectExpression, String property) {
81 this(objectExpression, new ConstantExpression(property), false);
82 }
83
84 public PropertyExpression(Expression objectExpression, Expression property) {
85 this(objectExpression, property, false);
86 }
87
88 public PropertyExpression(Expression objectExpression, Expression property, boolean safe) {
89 this.objectExpression = objectExpression;
90 this.property = property;
91 this.safe = safe;
92 }
93
94 public void visit(GroovyCodeVisitor visitor) {
95 visitor.visitPropertyExpression(this);
96 }
97
98 public boolean isDynamic() {
99 return true;
100 }
101
102 public Expression transformExpression(ExpressionTransformer transformer) {
103 return this;
104 }
105
106 public Expression getObjectExpression() {
107 return objectExpression;
108 }
109
110 public void setObjectExpression(Expression exp) {
111 objectExpression=exp;
112 }
113
114 public Expression getProperty() {
115 return property;
116 }
117
118 public String getPropertyAsString() {
119 if (property==null) return null;
120 if (! (property instanceof ConstantExpression)) return null;
121 ConstantExpression constant = (ConstantExpression) property;
122 return constant.getText();
123 }
124
125 public String getText() {
126 return objectExpression.getText() + "." + property.getText();
127 }
128
129 /***
130 * @return is this a safe navigation, i.e. if true then if the source object is null
131 * then this navigation will return null
132 */
133 public boolean isSafe() {
134 return safe;
135 }
136
137 public boolean isSpreadSafe() {
138 return spreadSafe;
139 }
140
141 public void setSpreadSafe(boolean value) {
142 spreadSafe = value;
143 }
144
145 public String toString() {
146 return super.toString() + "[object: " + objectExpression + " property: " + property + "]";
147 }
148
149 public void setStatic(boolean aStatic) {
150 this.isStatic = aStatic;
151 }
152
153 public Method getGetter() {
154 return getter;
155 }
156
157 public Method getSetter() {
158 return setter;
159 }
160
161 public void setField(Field fld) {
162 field = fld;
163 setStatic(Modifier.isStatic(fld.getModifiers()));
164 setType(ClassHelper.make(fld.getType()));
165 }
166
167 public Field getField() {
168 return field;
169 }
170
171 public void setAccess(int access) {
172 this.access = access;
173 }
174
175 public int getAccess() {
176 return access;
177 }
178
179 public boolean isImplicitThis(){
180 return implicitThis;
181 }
182
183 public void setImplicitThis(boolean it) {
184 implicitThis = it;
185 }
186 }