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
51 import org.codehaus.groovy.ast.GroovyCodeVisitor;
52
53
54 /***
55 * Represents an attribute access (accessing the field of a class) such as the expression "foo.@bar".
56 *
57 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
58 * @version $Revision: 1.5 $
59 */
60 public class AttributeExpression extends Expression {
61
62 private Expression objectExpression;
63 private String property;
64 private boolean spreadSafe = false;
65 private boolean safe = false;
66 private boolean isStatic = false;
67
68 private Method getter = null;
69 private Method setter = null;
70
71 private Field field = null;
72 private int access = -1;
73
74 public boolean isStatic() {
75 return isStatic;
76 }
77
78 public AttributeExpression(Expression objectExpression, String property) {
79 this(objectExpression, property, false);
80 }
81
82 public AttributeExpression(Expression objectExpression, String property, boolean safe) {
83 this.objectExpression = objectExpression;
84 this.property = property;
85 this.safe = safe;
86 }
87
88 public void visit(GroovyCodeVisitor visitor) {
89 visitor.visitAttributeExpression(this);
90 }
91
92 public Expression transformExpression(ExpressionTransformer transformer) {
93 Expression ret = new AttributeExpression(transformer.transform(objectExpression),property,safe);
94 ret.setSourcePosition(this);
95 return ret;
96 }
97
98 public Expression getObjectExpression() {
99 return objectExpression;
100 }
101
102 public String getProperty() {
103 return property;
104 }
105
106 public String getText() {
107 return objectExpression.getText() + "." + property;
108 }
109
110 /***
111 * @return is this a safe navigation, i.e. if true then if the source object is null
112 * then this navigation will return null
113 */
114 public boolean isSafe() {
115 return safe;
116 }
117
118 public boolean isSpreadSafe() {
119 return spreadSafe;
120 }
121
122 public void setSpreadSafe(boolean value) {
123 spreadSafe = value;
124 }
125
126 public String toString() {
127 return super.toString() + "[object: " + objectExpression + " property: " + property + "]";
128 }
129
130 public void setStatic(boolean aStatic) {
131 this.isStatic = aStatic;
132 }
133
134 public Method getGetter() {
135 return getter;
136 }
137
138 public Method getSetter() {
139 return setter;
140 }
141
142 public Field getField() {
143 return field;
144 }
145
146 public void setAccess(int access) {
147 this.access = access;
148 }
149
150 public int getAccess() {
151 return access;
152 }
153 }