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: 1.8 $
60 */
61 public class PropertyExpression extends Expression {
62
63 private Expression objectExpression;
64 private String 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
75 public boolean isStatic() {
76 return isStatic;
77 }
78
79 public PropertyExpression(Expression objectExpression, String property) {
80 this(objectExpression, property, false);
81 }
82
83 public PropertyExpression(Expression objectExpression, String property, boolean safe) {
84 this.objectExpression = objectExpression;
85 this.property = property;
86 this.safe = safe;
87 }
88
89 public void visit(GroovyCodeVisitor visitor) {
90 visitor.visitPropertyExpression(this);
91 }
92
93 public boolean isDynamic() {
94 return true;
95 }
96
97 public Expression transformExpression(ExpressionTransformer transformer) {
98 return this;
99 }
100
101 public Expression getObjectExpression() {
102 return objectExpression;
103 }
104
105 public void setObjectExpression(Expression exp) {
106 objectExpression=exp;
107 }
108
109 public String getProperty() {
110 return property;
111 }
112
113 public String getText() {
114 return objectExpression.getText() + "." + property;
115 }
116
117 /***
118 * @return is this a safe navigation, i.e. if true then if the source object is null
119 * then this navigation will return null
120 */
121 public boolean isSafe() {
122 return safe;
123 }
124
125 public boolean isSpreadSafe() {
126 return spreadSafe;
127 }
128
129 public void setSpreadSafe(boolean value) {
130 spreadSafe = value;
131 }
132
133 public String toString() {
134 return super.toString() + "[object: " + objectExpression + " property: " + property + "]";
135 }
136
137 public void setStatic(boolean aStatic) {
138 this.isStatic = aStatic;
139 }
140
141 public Method getGetter() {
142 return getter;
143 }
144
145 public Method getSetter() {
146 return setter;
147 }
148
149 public void setField(Field fld) {
150 field = fld;
151 setStatic(Modifier.isStatic(fld.getModifiers()));
152 setType(ClassHelper.make(fld.getType()));
153 }
154
155 public Field getField() {
156 return field;
157 }
158
159 public void setAccess(int access) {
160 this.access = access;
161 }
162
163 public int getAccess() {
164 return access;
165 }
166 }