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: 1.10 $
58 */
59 public class MethodCallExpression extends Expression {
60
61 private Expression objectExpression;
62 private String method;
63 private Expression arguments;
64 private boolean spreadSafe = false;
65 private boolean safe = false;
66 private boolean implicitThis;
67
68 public MetaMethod getMetaMethod() {
69 return metaMethod;
70 }
71
72 private MetaMethod metaMethod = null;
73
74 public MethodCallExpression(Expression objectExpression, String method, Expression arguments) {
75 this.objectExpression = objectExpression;
76 this.method = method;
77 this.arguments = arguments;
78
79
80
81
82 this.setType(ClassHelper.DYNAMIC_TYPE);
83 }
84
85 public void visit(GroovyCodeVisitor visitor) {
86 visitor.visitMethodCallExpression(this);
87 }
88
89 public Expression transformExpression(ExpressionTransformer transformer) {
90 MethodCallExpression answer =
91 new MethodCallExpression(transformer.transform(objectExpression), method, transformer.transform(arguments));
92 answer.setSafe(safe);
93 answer.setSourcePosition(this);
94 return answer;
95 }
96
97 public Expression getArguments() {
98 return arguments;
99 }
100
101 public String getMethod() {
102 return method;
103 }
104
105 public Expression getObjectExpression() {
106 return objectExpression;
107 }
108
109 public String getText() {
110 return objectExpression.getText() + "." + method + arguments.getText();
111 }
112
113 /***
114 * @return is this a safe method call, i.e. if true then if the source object is null
115 * then this method call will return null rather than throwing a null pointer exception
116 */
117 public boolean isSafe() {
118 return safe;
119 }
120
121 public void setSafe(boolean safe) {
122 this.safe = safe;
123 }
124
125 public boolean isSpreadSafe() {
126 return spreadSafe;
127 }
128
129 public void setSpreadSafe(boolean value) {
130 spreadSafe = value;
131 }
132
133 /***
134 * @return true if no object expression was specified otherwise if
135 * some expression was specified for the object on which to evaluate
136 * the method then return false
137 */
138 public boolean isImplicitThis() {
139 return implicitThis;
140 }
141
142 public void setImplicitThis(boolean implicitThis) {
143 this.implicitThis = implicitThis;
144 }
145
146 public String toString() {
147 return super.toString()
148 + "[object: "
149 + objectExpression
150 + " method: "
151 + method
152 + " arguments: "
153 + arguments
154 + "]";
155 }
156
157 public static boolean isSuperMethodCall(MethodCallExpression call) {
158 Expression expression = call.getObjectExpression();
159 if (expression instanceof VariableExpression) {
160 VariableExpression varExp = (VariableExpression) expression;
161 String variable = varExp.getName();
162 return variable.equals("super");
163 }
164 return false;
165 }
166
167 public void setMethod(MetaMethod mmeth) {
168 this.metaMethod = mmeth;
169 super.setType(ClassHelper.make(mmeth.getReturnType()));
170 }
171 }