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.4 $
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 return new AttributeExpression(transformer.transform(objectExpression),property,safe);
94 }
95
96 public Expression getObjectExpression() {
97 return objectExpression;
98 }
99
100 public String getProperty() {
101 return property;
102 }
103
104 public String getText() {
105 return objectExpression.getText() + "." + property;
106 }
107
108 /***
109 * @return is this a safe navigation, i.e. if true then if the source object is null
110 * then this navigation will return null
111 */
112 public boolean isSafe() {
113 return safe;
114 }
115
116 public boolean isSpreadSafe() {
117 return spreadSafe;
118 }
119
120 public void setSpreadSafe(boolean value) {
121 spreadSafe = value;
122 }
123
124 public String toString() {
125 return super.toString() + "[object: " + objectExpression + " property: " + property + "]";
126 }
127
128 public void setStatic(boolean aStatic) {
129 this.isStatic = aStatic;
130 }
131
132 public Method getGetter() {
133 return getter;
134 }
135
136 public Method getSetter() {
137 return setter;
138 }
139
140 public Field getField() {
141 return field;
142 }
143
144 public void setAccess(int access) {
145 this.access = access;
146 }
147
148 public int getAccess() {
149 return access;
150 }
151 }