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 groovy.lang.MetaMethod;
49
50 import org.codehaus.groovy.ast.ClassHelper;
51 import org.codehaus.groovy.ast.GroovyCodeVisitor;
52
53 /***
54 * A method call on an object or class
55 *
56 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
57 * @version $Revision: 4287 $
58 */
59 public class MethodCallExpression extends Expression {
60
61 private Expression objectExpression;
62 private Expression method;
63 private Expression arguments;
64 private boolean spreadSafe = false;
65 private boolean safe = false;
66 private boolean implicitThis;
67
68 public static Expression NO_ARGUMENTS = new TupleExpression();
69
70 public MetaMethod getMetaMethod() {
71 return metaMethod;
72 }
73
74 private MetaMethod metaMethod = null;
75
76 public MethodCallExpression(Expression objectExpression, String method, Expression arguments) {
77 this(objectExpression,new ConstantExpression(method),arguments);
78 }
79
80 public MethodCallExpression(Expression objectExpression, Expression method, Expression arguments) {
81 this.objectExpression = objectExpression;
82 this.method = method;
83 this.arguments = arguments;
84
85
86
87
88 this.setType(ClassHelper.DYNAMIC_TYPE);
89 this.setImplicitThis(true);
90 }
91
92 public void visit(GroovyCodeVisitor visitor) {
93 visitor.visitMethodCallExpression(this);
94 }
95
96 public Expression transformExpression(ExpressionTransformer transformer) {
97 MethodCallExpression answer =
98 new MethodCallExpression(transformer.transform(objectExpression), transformer.transform(method), transformer.transform(arguments));
99 answer.setSafe(safe);
100 answer.setSourcePosition(this);
101 return answer;
102 }
103
104 public Expression getArguments() {
105 return arguments;
106 }
107
108 public Expression getMethod() {
109 return method;
110 }
111
112 /***
113 * This method returns the method name as String if it is no dynamic
114 * calculated method name, but an constant.
115 */
116 public String getMethodAsString() {
117 if (! (method instanceof ConstantExpression)) return null;
118 ConstantExpression constant = (ConstantExpression) method;
119 return constant.getText();
120 }
121
122 public Expression getObjectExpression() {
123 return objectExpression;
124 }
125
126 public String getText() {
127 return objectExpression.getText() + "." + method.getText() + arguments.getText();
128 }
129
130 /***
131 * @return is this a safe method call, i.e. if true then if the source object is null
132 * then this method call will return null rather than throwing a null pointer exception
133 */
134 public boolean isSafe() {
135 return safe;
136 }
137
138 public void setSafe(boolean safe) {
139 this.safe = safe;
140 }
141
142 public boolean isSpreadSafe() {
143 return spreadSafe;
144 }
145
146 public void setSpreadSafe(boolean value) {
147 spreadSafe = value;
148 }
149
150 /***
151 * @return true if no object expression was specified otherwise if
152 * some expression was specified for the object on which to evaluate
153 * the method then return false
154 */
155 public boolean isImplicitThis() {
156 return implicitThis;
157 }
158
159 public void setImplicitThis(boolean implicitThis) {
160 this.implicitThis = implicitThis;
161 }
162
163 public String toString() {
164 return super.toString()
165 + "[object: "
166 + objectExpression
167 + " method: "
168 + method
169 + " arguments: "
170 + arguments
171 + "]";
172 }
173
174 public void setMethod(MetaMethod mmeth) {
175 this.metaMethod = mmeth;
176 super.setType(ClassHelper.make(mmeth.getReturnType()));
177 }
178 }