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.9 $
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 return answer;
94 }
95
96 public Expression getArguments() {
97 return arguments;
98 }
99
100 public String getMethod() {
101 return method;
102 }
103
104 public Expression getObjectExpression() {
105 return objectExpression;
106 }
107
108 public String getText() {
109 return objectExpression.getText() + "." + method + arguments.getText();
110 }
111
112 /***
113 * @return is this a safe method call, i.e. if true then if the source object is null
114 * then this method call will return null rather than throwing a null pointer exception
115 */
116 public boolean isSafe() {
117 return safe;
118 }
119
120 public void setSafe(boolean safe) {
121 this.safe = safe;
122 }
123
124 public boolean isSpreadSafe() {
125 return spreadSafe;
126 }
127
128 public void setSpreadSafe(boolean value) {
129 spreadSafe = value;
130 }
131
132 /***
133 * @return true if no object expression was specified otherwise if
134 * some expression was specified for the object on which to evaluate
135 * the method then return false
136 */
137 public boolean isImplicitThis() {
138 return implicitThis;
139 }
140
141 public void setImplicitThis(boolean implicitThis) {
142 this.implicitThis = implicitThis;
143 }
144
145 public String toString() {
146 return super.toString()
147 + "[object: "
148 + objectExpression
149 + " method: "
150 + method
151 + " arguments: "
152 + arguments
153 + "]";
154 }
155
156 public static boolean isSuperMethodCall(MethodCallExpression call) {
157 Expression expression = call.getObjectExpression();
158 if (expression instanceof VariableExpression) {
159 VariableExpression varExp = (VariableExpression) expression;
160 String variable = varExp.getName();
161 return variable.equals("super");
162 }
163 return false;
164 }
165
166 public void setMethod(MetaMethod mmeth) {
167 this.metaMethod = mmeth;
168 super.setType(ClassHelper.make(mmeth.getReturnType()));
169 }
170 }