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.GroovyCodeVisitor;
51 import org.codehaus.groovy.classgen.AsmClassGenerator2;
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.5 $
58 */
59 public class MethodCallExpression extends Expression {
60
61 private Expression objectExpression;
62 private String method;
63 private Expression arguments;
64 private boolean safe;
65 private boolean implicitThis;
66
67 public MetaMethod getMetaMethod() {
68 return metaMethod;
69 }
70
71 private MetaMethod metaMethod = null;
72
73 public MethodCallExpression(Expression objectExpression, String method, Expression arguments) {
74 this.objectExpression = objectExpression;
75 this.method = method;
76 this.arguments = arguments;
77 }
78
79 public void visit(GroovyCodeVisitor visitor) {
80 visitor.visitMethodCallExpression(this);
81 }
82
83 public Expression transformExpression(ExpressionTransformer transformer) {
84 MethodCallExpression answer =
85 new MethodCallExpression(transformer.transform(objectExpression), method, transformer.transform(arguments));
86 answer.setSafe(safe);
87 return answer;
88 }
89
90 protected void resolveType(AsmClassGenerator2 resolver) {
91 this.objectExpression.resolve(resolver);
92 this.arguments.resolve(resolver);
93 resolver.resolve(this);
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 /***
125 * @return true if no object expression was specified otherwise if
126 * some expression was specified for the object on which to evaluate
127 * the method then return false
128 */
129 public boolean isImplicitThis() {
130 return implicitThis;
131 }
132
133 public void setImplicitThis(boolean implicitThis) {
134 this.implicitThis = implicitThis;
135 }
136
137 public String toString() {
138 return super.toString()
139 + "[object: "
140 + objectExpression
141 + " method: "
142 + method
143 + " arguments: "
144 + arguments
145 + "]";
146 }
147
148 public static boolean isSuperMethodCall(MethodCallExpression call) {
149 Expression expression = call.getObjectExpression();
150 if (expression instanceof VariableExpression) {
151 VariableExpression varExp = (VariableExpression) expression;
152 String variable = varExp.getVariable();
153 return variable.equals("super");
154 }
155 return false;
156 }
157
158 public void setMethod(MetaMethod mmeth) {
159 this.metaMethod = mmeth;
160 super.setTypeClass(mmeth.getReturnType());
161 }
162 }