OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.resolution.send_structure; | 5 library dart2js.resolution.send_structure; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../constants/expressions.dart'; | 8 import '../constants/expressions.dart'; |
9 import '../dart_types.dart'; | 9 import '../dart_types.dart'; |
10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
11 import '../resolution/tree_elements.dart' show | 11 import '../resolution/tree_elements.dart' show TreeElements; |
12 TreeElements; | |
13 import '../tree/tree.dart'; | 12 import '../tree/tree.dart'; |
14 import '../universe/call_structure.dart' show | 13 import '../universe/call_structure.dart' show CallStructure; |
15 CallStructure; | 14 import '../universe/selector.dart' show Selector; |
16 import '../universe/selector.dart' show | |
17 Selector; | |
18 | 15 |
19 import 'access_semantics.dart'; | 16 import 'access_semantics.dart'; |
20 import 'operators.dart'; | 17 import 'operators.dart'; |
21 import 'semantic_visitor.dart'; | 18 import 'semantic_visitor.dart'; |
22 | 19 |
23 /// Interface for the structure of the semantics of a [Send] or [NewExpression] | 20 /// Interface for the structure of the semantics of a [Send] or [NewExpression] |
24 /// node. | 21 /// node. |
25 abstract class SemanticSendStructure<R, A> { | 22 abstract class SemanticSendStructure<R, A> { |
26 /// Calls the matching visit method on [visitor] with [node] and [arg]. | 23 /// Calls the matching visit method on [visitor] with [node] and [arg]. |
27 R dispatch(SemanticSendVisitor<R, A> visitor, Node node, A arg); | 24 R dispatch(SemanticSendVisitor<R, A> visitor, Node node, A arg); |
28 } | 25 } |
29 | 26 |
30 /// Interface for the structure of the semantics of a [Send] node. | 27 /// Interface for the structure of the semantics of a [Send] node. |
31 /// | 28 /// |
32 /// Subclasses handle each of the [Send] variations; `assert(e)`, `a && b`, | 29 /// Subclasses handle each of the [Send] variations; `assert(e)`, `a && b`, |
33 /// `a.b`, `a.b(c)`, etc. | 30 /// `a.b`, `a.b(c)`, etc. |
34 abstract class SendStructure<R, A> extends SemanticSendStructure<R, A> { | 31 abstract class SendStructure<R, A> extends SemanticSendStructure<R, A> { |
35 /// Calls the matching visit method on [visitor] with [send] and [arg]. | 32 /// Calls the matching visit method on [visitor] with [send] and [arg]. |
36 R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg); | 33 R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg); |
37 } | 34 } |
38 | 35 |
39 /// The structure for a [Send] of the form `a ?? b`. | 36 /// The structure for a [Send] of the form `a ?? b`. |
40 class IfNullStructure<R, A> implements SendStructure<R, A> { | 37 class IfNullStructure<R, A> implements SendStructure<R, A> { |
41 const IfNullStructure(); | 38 const IfNullStructure(); |
42 | 39 |
43 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 40 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
44 return visitor.visitIfNull( | 41 return visitor.visitIfNull(node, node.receiver, node.arguments.single, arg); |
45 node, | |
46 node.receiver, | |
47 node.arguments.single, | |
48 arg); | |
49 } | 42 } |
50 | 43 |
51 String toString() => '??'; | 44 String toString() => '??'; |
52 } | 45 } |
53 | 46 |
54 /// The structure for a [Send] of the form `a && b`. | 47 /// The structure for a [Send] of the form `a && b`. |
55 class LogicalAndStructure<R, A> implements SendStructure<R, A> { | 48 class LogicalAndStructure<R, A> implements SendStructure<R, A> { |
56 const LogicalAndStructure(); | 49 const LogicalAndStructure(); |
57 | 50 |
58 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 51 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
59 return visitor.visitLogicalAnd( | 52 return visitor.visitLogicalAnd( |
60 node, | 53 node, node.receiver, node.arguments.single, arg); |
61 node.receiver, | |
62 node.arguments.single, | |
63 arg); | |
64 } | 54 } |
65 | 55 |
66 String toString() => '&&'; | 56 String toString() => '&&'; |
67 } | 57 } |
68 | 58 |
69 /// The structure for a [Send] of the form `a || b`. | 59 /// The structure for a [Send] of the form `a || b`. |
70 class LogicalOrStructure<R, A> implements SendStructure<R, A> { | 60 class LogicalOrStructure<R, A> implements SendStructure<R, A> { |
71 const LogicalOrStructure(); | 61 const LogicalOrStructure(); |
72 | 62 |
73 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 63 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
74 return visitor.visitLogicalOr( | 64 return visitor.visitLogicalOr( |
75 node, | 65 node, node.receiver, node.arguments.single, arg); |
76 node.receiver, | |
77 node.arguments.single, | |
78 arg); | |
79 } | 66 } |
80 | 67 |
81 String toString() => '||'; | 68 String toString() => '||'; |
82 } | 69 } |
83 | 70 |
84 /// The structure for a [Send] of the form `a is T`. | 71 /// The structure for a [Send] of the form `a is T`. |
85 class IsStructure<R, A> implements SendStructure<R, A> { | 72 class IsStructure<R, A> implements SendStructure<R, A> { |
86 /// The type that the expression is tested against. | 73 /// The type that the expression is tested against. |
87 final DartType type; | 74 final DartType type; |
88 | 75 |
89 IsStructure(this.type); | 76 IsStructure(this.type); |
90 | 77 |
91 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 78 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
92 return visitor.visitIs( | 79 return visitor.visitIs(node, node.receiver, type, arg); |
93 node, | |
94 node.receiver, | |
95 type, | |
96 arg); | |
97 } | 80 } |
98 | 81 |
99 String toString() => 'is $type'; | 82 String toString() => 'is $type'; |
100 } | 83 } |
101 | 84 |
102 /// The structure for a [Send] of the form `a is! T`. | 85 /// The structure for a [Send] of the form `a is! T`. |
103 class IsNotStructure<R, A> implements SendStructure<R, A> { | 86 class IsNotStructure<R, A> implements SendStructure<R, A> { |
104 /// The type that the expression is tested against. | 87 /// The type that the expression is tested against. |
105 final DartType type; | 88 final DartType type; |
106 | 89 |
107 IsNotStructure(this.type); | 90 IsNotStructure(this.type); |
108 | 91 |
109 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 92 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
110 return visitor.visitIsNot( | 93 return visitor.visitIsNot(node, node.receiver, type, arg); |
111 node, | |
112 node.receiver, | |
113 type, | |
114 arg); | |
115 } | 94 } |
116 | 95 |
117 String toString() => 'is! $type'; | 96 String toString() => 'is! $type'; |
118 } | 97 } |
119 | 98 |
120 /// The structure for a [Send] of the form `a as T`. | 99 /// The structure for a [Send] of the form `a as T`. |
121 class AsStructure<R, A> implements SendStructure<R, A> { | 100 class AsStructure<R, A> implements SendStructure<R, A> { |
122 /// The type that the expression is cast to. | 101 /// The type that the expression is cast to. |
123 final DartType type; | 102 final DartType type; |
124 | 103 |
125 AsStructure(this.type); | 104 AsStructure(this.type); |
126 | 105 |
127 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 106 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
128 return visitor.visitAs( | 107 return visitor.visitAs(node, node.receiver, type, arg); |
129 node, | |
130 node.receiver, | |
131 type, | |
132 arg); | |
133 } | 108 } |
134 | 109 |
135 String toString() => 'as $type'; | 110 String toString() => 'as $type'; |
136 } | 111 } |
137 | 112 |
138 /// The structure for a [Send] that is an invocation. | 113 /// The structure for a [Send] that is an invocation. |
139 class InvokeStructure<R, A> implements SendStructure<R, A> { | 114 class InvokeStructure<R, A> implements SendStructure<R, A> { |
140 /// The target of the invocation. | 115 /// The target of the invocation. |
141 final AccessSemantics semantics; | 116 final AccessSemantics semantics; |
142 | 117 |
143 /// The [Selector] for the invocation. | 118 /// The [Selector] for the invocation. |
144 // TODO(johnniwinther): Store this only for dynamic invocations. | 119 // TODO(johnniwinther): Store this only for dynamic invocations. |
145 final Selector selector; | 120 final Selector selector; |
146 | 121 |
147 /// The [CallStructure] of the invocation. | 122 /// The [CallStructure] of the invocation. |
148 // TODO(johnniwinther): Store this directly for static invocations. | 123 // TODO(johnniwinther): Store this directly for static invocations. |
149 CallStructure get callStructure => selector.callStructure; | 124 CallStructure get callStructure => selector.callStructure; |
150 | 125 |
151 InvokeStructure(this.semantics, this.selector); | 126 InvokeStructure(this.semantics, this.selector); |
152 | 127 |
153 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 128 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
154 switch (semantics.kind) { | 129 switch (semantics.kind) { |
155 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: | 130 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
156 return visitor.visitIfNotNullDynamicPropertyInvoke( | 131 return visitor.visitIfNotNullDynamicPropertyInvoke( |
157 node, | 132 node, node.receiver, node.argumentsNode, selector, arg); |
158 node.receiver, | |
159 node.argumentsNode, | |
160 selector, | |
161 arg); | |
162 case AccessKind.DYNAMIC_PROPERTY: | 133 case AccessKind.DYNAMIC_PROPERTY: |
163 return visitor.visitDynamicPropertyInvoke( | 134 return visitor.visitDynamicPropertyInvoke( |
164 node, | 135 node, node.receiver, node.argumentsNode, selector, arg); |
165 node.receiver, | |
166 node.argumentsNode, | |
167 selector, | |
168 arg); | |
169 case AccessKind.LOCAL_FUNCTION: | 136 case AccessKind.LOCAL_FUNCTION: |
170 return visitor.visitLocalFunctionInvoke( | 137 return visitor.visitLocalFunctionInvoke( |
171 node, | 138 node, |
172 semantics.element, | 139 semantics.element, |
173 node.argumentsNode, | 140 node.argumentsNode, |
174 // TODO(johnniwinther): Store the call selector instead of the | 141 // TODO(johnniwinther): Store the call selector instead of the |
175 // selector using the name of the function. | 142 // selector using the name of the function. |
176 callStructure, | 143 callStructure, |
177 arg); | 144 arg); |
178 case AccessKind.LOCAL_VARIABLE: | 145 case AccessKind.LOCAL_VARIABLE: |
(...skipping 12 matching lines...) Expand all Loading... |
191 node, | 158 node, |
192 semantics.element, | 159 semantics.element, |
193 node.argumentsNode, | 160 node.argumentsNode, |
194 // TODO(johnniwinther): Store the call selector instead of the | 161 // TODO(johnniwinther): Store the call selector instead of the |
195 // selector using the name of the parameter. | 162 // selector using the name of the parameter. |
196 callStructure, | 163 callStructure, |
197 arg); | 164 arg); |
198 case AccessKind.STATIC_FIELD: | 165 case AccessKind.STATIC_FIELD: |
199 case AccessKind.FINAL_STATIC_FIELD: | 166 case AccessKind.FINAL_STATIC_FIELD: |
200 return visitor.visitStaticFieldInvoke( | 167 return visitor.visitStaticFieldInvoke( |
201 node, | 168 node, semantics.element, node.argumentsNode, callStructure, arg); |
202 semantics.element, | |
203 node.argumentsNode, | |
204 callStructure, | |
205 arg); | |
206 case AccessKind.STATIC_METHOD: | 169 case AccessKind.STATIC_METHOD: |
207 return visitor.visitStaticFunctionInvoke( | 170 return visitor.visitStaticFunctionInvoke( |
208 node, | 171 node, semantics.element, node.argumentsNode, callStructure, arg); |
209 semantics.element, | |
210 node.argumentsNode, | |
211 callStructure, | |
212 arg); | |
213 case AccessKind.STATIC_GETTER: | 172 case AccessKind.STATIC_GETTER: |
214 return visitor.visitStaticGetterInvoke( | 173 return visitor.visitStaticGetterInvoke( |
215 node, | 174 node, semantics.element, node.argumentsNode, callStructure, arg); |
216 semantics.element, | |
217 node.argumentsNode, | |
218 callStructure, | |
219 arg); | |
220 case AccessKind.STATIC_SETTER: | 175 case AccessKind.STATIC_SETTER: |
221 return visitor.visitStaticSetterInvoke( | 176 return visitor.visitStaticSetterInvoke( |
222 node, | 177 node, semantics.element, node.argumentsNode, callStructure, arg); |
223 semantics.element, | |
224 node.argumentsNode, | |
225 callStructure, | |
226 arg); | |
227 case AccessKind.TOPLEVEL_FIELD: | 178 case AccessKind.TOPLEVEL_FIELD: |
228 case AccessKind.FINAL_TOPLEVEL_FIELD: | 179 case AccessKind.FINAL_TOPLEVEL_FIELD: |
229 return visitor.visitTopLevelFieldInvoke( | 180 return visitor.visitTopLevelFieldInvoke( |
230 node, | 181 node, semantics.element, node.argumentsNode, callStructure, arg); |
231 semantics.element, | |
232 node.argumentsNode, | |
233 callStructure, | |
234 arg); | |
235 case AccessKind.TOPLEVEL_METHOD: | 182 case AccessKind.TOPLEVEL_METHOD: |
236 return visitor.visitTopLevelFunctionInvoke( | 183 return visitor.visitTopLevelFunctionInvoke( |
237 node, | 184 node, semantics.element, node.argumentsNode, callStructure, arg); |
238 semantics.element, | |
239 node.argumentsNode, | |
240 callStructure, | |
241 arg); | |
242 case AccessKind.TOPLEVEL_GETTER: | 185 case AccessKind.TOPLEVEL_GETTER: |
243 return visitor.visitTopLevelGetterInvoke( | 186 return visitor.visitTopLevelGetterInvoke( |
244 node, | 187 node, semantics.element, node.argumentsNode, callStructure, arg); |
245 semantics.element, | |
246 node.argumentsNode, | |
247 callStructure, | |
248 arg); | |
249 case AccessKind.TOPLEVEL_SETTER: | 188 case AccessKind.TOPLEVEL_SETTER: |
250 return visitor.visitTopLevelSetterInvoke( | 189 return visitor.visitTopLevelSetterInvoke( |
251 node, | 190 node, semantics.element, node.argumentsNode, callStructure, arg); |
252 semantics.element, | |
253 node.argumentsNode, | |
254 callStructure, | |
255 arg); | |
256 case AccessKind.CLASS_TYPE_LITERAL: | 191 case AccessKind.CLASS_TYPE_LITERAL: |
257 return visitor.visitClassTypeLiteralInvoke( | 192 return visitor.visitClassTypeLiteralInvoke( |
258 node, | 193 node, semantics.constant, node.argumentsNode, callStructure, arg); |
259 semantics.constant, | |
260 node.argumentsNode, | |
261 callStructure, | |
262 arg); | |
263 case AccessKind.TYPEDEF_TYPE_LITERAL: | 194 case AccessKind.TYPEDEF_TYPE_LITERAL: |
264 return visitor.visitTypedefTypeLiteralInvoke( | 195 return visitor.visitTypedefTypeLiteralInvoke( |
265 node, | 196 node, semantics.constant, node.argumentsNode, callStructure, arg); |
266 semantics.constant, | |
267 node.argumentsNode, | |
268 callStructure, | |
269 arg); | |
270 case AccessKind.DYNAMIC_TYPE_LITERAL: | 197 case AccessKind.DYNAMIC_TYPE_LITERAL: |
271 return visitor.visitDynamicTypeLiteralInvoke( | 198 return visitor.visitDynamicTypeLiteralInvoke( |
272 node, | 199 node, semantics.constant, node.argumentsNode, callStructure, arg); |
273 semantics.constant, | |
274 node.argumentsNode, | |
275 callStructure, | |
276 arg); | |
277 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 200 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
278 return visitor.visitTypeVariableTypeLiteralInvoke( | 201 return visitor.visitTypeVariableTypeLiteralInvoke( |
279 node, | 202 node, semantics.element, node.argumentsNode, callStructure, arg); |
280 semantics.element, | |
281 node.argumentsNode, | |
282 callStructure, | |
283 arg); | |
284 case AccessKind.EXPRESSION: | 203 case AccessKind.EXPRESSION: |
285 return visitor.visitExpressionInvoke( | 204 return visitor.visitExpressionInvoke( |
286 node, | 205 node, node.selector, node.argumentsNode, callStructure, arg); |
287 node.selector, | |
288 node.argumentsNode, | |
289 callStructure, | |
290 arg); | |
291 case AccessKind.THIS: | 206 case AccessKind.THIS: |
292 return visitor.visitThisInvoke( | 207 return visitor.visitThisInvoke( |
293 node, | 208 node, node.argumentsNode, callStructure, arg); |
294 node.argumentsNode, | |
295 callStructure, | |
296 arg); | |
297 case AccessKind.THIS_PROPERTY: | 209 case AccessKind.THIS_PROPERTY: |
298 return visitor.visitThisPropertyInvoke( | 210 return visitor.visitThisPropertyInvoke( |
299 node, | 211 node, node.argumentsNode, selector, arg); |
300 node.argumentsNode, | |
301 selector, | |
302 arg); | |
303 case AccessKind.SUPER_FIELD: | 212 case AccessKind.SUPER_FIELD: |
304 case AccessKind.SUPER_FINAL_FIELD: | 213 case AccessKind.SUPER_FINAL_FIELD: |
305 return visitor.visitSuperFieldInvoke( | 214 return visitor.visitSuperFieldInvoke( |
306 node, | 215 node, semantics.element, node.argumentsNode, callStructure, arg); |
307 semantics.element, | |
308 node.argumentsNode, | |
309 callStructure, | |
310 arg); | |
311 case AccessKind.SUPER_METHOD: | 216 case AccessKind.SUPER_METHOD: |
312 return visitor.visitSuperMethodInvoke( | 217 return visitor.visitSuperMethodInvoke( |
313 node, | 218 node, semantics.element, node.argumentsNode, callStructure, arg); |
314 semantics.element, | |
315 node.argumentsNode, | |
316 callStructure, | |
317 arg); | |
318 case AccessKind.SUPER_GETTER: | 219 case AccessKind.SUPER_GETTER: |
319 return visitor.visitSuperGetterInvoke( | 220 return visitor.visitSuperGetterInvoke( |
320 node, | 221 node, semantics.element, node.argumentsNode, callStructure, arg); |
321 semantics.element, | |
322 node.argumentsNode, | |
323 callStructure, | |
324 arg); | |
325 case AccessKind.SUPER_SETTER: | 222 case AccessKind.SUPER_SETTER: |
326 return visitor.visitSuperSetterInvoke( | 223 return visitor.visitSuperSetterInvoke( |
327 node, | 224 node, semantics.element, node.argumentsNode, callStructure, arg); |
328 semantics.element, | |
329 node.argumentsNode, | |
330 callStructure, | |
331 arg); | |
332 case AccessKind.CONSTANT: | 225 case AccessKind.CONSTANT: |
333 return visitor.visitConstantInvoke( | 226 return visitor.visitConstantInvoke( |
334 node, | 227 node, semantics.constant, node.argumentsNode, callStructure, arg); |
335 semantics.constant, | |
336 node.argumentsNode, | |
337 callStructure, | |
338 arg); | |
339 case AccessKind.UNRESOLVED: | 228 case AccessKind.UNRESOLVED: |
340 return visitor.visitUnresolvedInvoke( | 229 return visitor.visitUnresolvedInvoke( |
341 node, | 230 node, semantics.element, node.argumentsNode, selector, arg); |
342 semantics.element, | |
343 node.argumentsNode, | |
344 selector, | |
345 arg); | |
346 case AccessKind.UNRESOLVED_SUPER: | 231 case AccessKind.UNRESOLVED_SUPER: |
347 return visitor.visitUnresolvedSuperInvoke( | 232 return visitor.visitUnresolvedSuperInvoke( |
348 node, | 233 node, semantics.element, node.argumentsNode, selector, arg); |
349 semantics.element, | |
350 node.argumentsNode, | |
351 selector, | |
352 arg); | |
353 case AccessKind.INVALID: | 234 case AccessKind.INVALID: |
354 return visitor.errorInvalidInvoke( | 235 return visitor.errorInvalidInvoke( |
355 node, | 236 node, semantics.element, node.argumentsNode, selector, arg); |
356 semantics.element, | |
357 node.argumentsNode, | |
358 selector, | |
359 arg); | |
360 case AccessKind.COMPOUND: | 237 case AccessKind.COMPOUND: |
361 // This is not a valid case. | 238 // This is not a valid case. |
362 break; | 239 break; |
363 } | 240 } |
364 throw new SpannableAssertionFailure(node, "Invalid invoke: ${semantics}"); | 241 throw new SpannableAssertionFailure(node, "Invalid invoke: ${semantics}"); |
365 } | 242 } |
366 | 243 |
367 String toString() => 'invoke($selector, $semantics)'; | 244 String toString() => 'invoke($selector, $semantics)'; |
368 } | 245 } |
369 | 246 |
(...skipping 10 matching lines...) Expand all Loading... |
380 /// The [CallStructure] of the invocation. | 257 /// The [CallStructure] of the invocation. |
381 // TODO(johnniwinther): Store this directly for static invocations. | 258 // TODO(johnniwinther): Store this directly for static invocations. |
382 CallStructure get callStructure => selector.callStructure; | 259 CallStructure get callStructure => selector.callStructure; |
383 | 260 |
384 IncompatibleInvokeStructure(this.semantics, this.selector); | 261 IncompatibleInvokeStructure(this.semantics, this.selector); |
385 | 262 |
386 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 263 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
387 switch (semantics.kind) { | 264 switch (semantics.kind) { |
388 case AccessKind.STATIC_METHOD: | 265 case AccessKind.STATIC_METHOD: |
389 return visitor.visitStaticFunctionIncompatibleInvoke( | 266 return visitor.visitStaticFunctionIncompatibleInvoke( |
390 node, | 267 node, semantics.element, node.argumentsNode, callStructure, arg); |
391 semantics.element, | |
392 node.argumentsNode, | |
393 callStructure, | |
394 arg); | |
395 case AccessKind.SUPER_METHOD: | 268 case AccessKind.SUPER_METHOD: |
396 return visitor.visitSuperMethodIncompatibleInvoke( | 269 return visitor.visitSuperMethodIncompatibleInvoke( |
397 node, | 270 node, semantics.element, node.argumentsNode, callStructure, arg); |
398 semantics.element, | |
399 node.argumentsNode, | |
400 callStructure, | |
401 arg); | |
402 case AccessKind.TOPLEVEL_METHOD: | 271 case AccessKind.TOPLEVEL_METHOD: |
403 return visitor.visitTopLevelFunctionIncompatibleInvoke( | 272 return visitor.visitTopLevelFunctionIncompatibleInvoke( |
404 node, | 273 node, semantics.element, node.argumentsNode, callStructure, arg); |
405 semantics.element, | |
406 node.argumentsNode, | |
407 callStructure, | |
408 arg); | |
409 case AccessKind.LOCAL_FUNCTION: | 274 case AccessKind.LOCAL_FUNCTION: |
410 return visitor.visitLocalFunctionIncompatibleInvoke( | 275 return visitor.visitLocalFunctionIncompatibleInvoke( |
411 node, | 276 node, semantics.element, node.argumentsNode, callStructure, arg); |
412 semantics.element, | 277 default: |
413 node.argumentsNode, | |
414 callStructure, | |
415 arg); | |
416 default: | |
417 // TODO(johnniwinther): Support more variants of this invoke structure. | 278 // TODO(johnniwinther): Support more variants of this invoke structure. |
418 break; | 279 break; |
419 } | 280 } |
420 throw new SpannableAssertionFailure( | 281 throw new SpannableAssertionFailure( |
421 node, "Invalid incompatible invoke: ${semantics}"); | 282 node, "Invalid incompatible invoke: ${semantics}"); |
422 } | 283 } |
423 | 284 |
424 String toString() => 'incompatible-invoke($selector, $semantics)'; | 285 String toString() => 'incompatible-invoke($selector, $semantics)'; |
425 } | 286 } |
426 | 287 |
427 /// The structure for a [Send] that is a read access. | 288 /// The structure for a [Send] that is a read access. |
428 class GetStructure<R, A> implements SendStructure<R, A> { | 289 class GetStructure<R, A> implements SendStructure<R, A> { |
429 /// The target of the read access. | 290 /// The target of the read access. |
430 final AccessSemantics semantics; | 291 final AccessSemantics semantics; |
431 | 292 |
432 GetStructure(this.semantics); | 293 GetStructure(this.semantics); |
433 | 294 |
434 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 295 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
435 switch (semantics.kind) { | 296 switch (semantics.kind) { |
436 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: | 297 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
437 return visitor.visitIfNotNullDynamicPropertyGet( | 298 return visitor.visitIfNotNullDynamicPropertyGet( |
438 node, | 299 node, node.receiver, semantics.name, arg); |
439 node.receiver, | |
440 semantics.name, | |
441 arg); | |
442 case AccessKind.DYNAMIC_PROPERTY: | 300 case AccessKind.DYNAMIC_PROPERTY: |
443 return visitor.visitDynamicPropertyGet( | 301 return visitor.visitDynamicPropertyGet( |
444 node, | 302 node, node.receiver, semantics.name, arg); |
445 node.receiver, | |
446 semantics.name, | |
447 arg); | |
448 case AccessKind.LOCAL_FUNCTION: | 303 case AccessKind.LOCAL_FUNCTION: |
449 return visitor.visitLocalFunctionGet( | 304 return visitor.visitLocalFunctionGet(node, semantics.element, arg); |
450 node, | |
451 semantics.element, | |
452 arg); | |
453 case AccessKind.LOCAL_VARIABLE: | 305 case AccessKind.LOCAL_VARIABLE: |
454 case AccessKind.FINAL_LOCAL_VARIABLE: | 306 case AccessKind.FINAL_LOCAL_VARIABLE: |
455 return visitor.visitLocalVariableGet( | 307 return visitor.visitLocalVariableGet(node, semantics.element, arg); |
456 node, | |
457 semantics.element, | |
458 arg); | |
459 case AccessKind.PARAMETER: | 308 case AccessKind.PARAMETER: |
460 case AccessKind.FINAL_PARAMETER: | 309 case AccessKind.FINAL_PARAMETER: |
461 return visitor.visitParameterGet( | 310 return visitor.visitParameterGet(node, semantics.element, arg); |
462 node, | |
463 semantics.element, | |
464 arg); | |
465 case AccessKind.STATIC_FIELD: | 311 case AccessKind.STATIC_FIELD: |
466 case AccessKind.FINAL_STATIC_FIELD: | 312 case AccessKind.FINAL_STATIC_FIELD: |
467 return visitor.visitStaticFieldGet( | 313 return visitor.visitStaticFieldGet(node, semantics.element, arg); |
468 node, | |
469 semantics.element, | |
470 arg); | |
471 case AccessKind.STATIC_METHOD: | 314 case AccessKind.STATIC_METHOD: |
472 return visitor.visitStaticFunctionGet( | 315 return visitor.visitStaticFunctionGet(node, semantics.element, arg); |
473 node, | |
474 semantics.element, | |
475 arg); | |
476 case AccessKind.STATIC_GETTER: | 316 case AccessKind.STATIC_GETTER: |
477 return visitor.visitStaticGetterGet( | 317 return visitor.visitStaticGetterGet(node, semantics.element, arg); |
478 node, | |
479 semantics.element, | |
480 arg); | |
481 case AccessKind.STATIC_SETTER: | 318 case AccessKind.STATIC_SETTER: |
482 return visitor.visitStaticSetterGet( | 319 return visitor.visitStaticSetterGet(node, semantics.element, arg); |
483 node, | |
484 semantics.element, | |
485 arg); | |
486 case AccessKind.TOPLEVEL_FIELD: | 320 case AccessKind.TOPLEVEL_FIELD: |
487 case AccessKind.FINAL_TOPLEVEL_FIELD: | 321 case AccessKind.FINAL_TOPLEVEL_FIELD: |
488 return visitor.visitTopLevelFieldGet( | 322 return visitor.visitTopLevelFieldGet(node, semantics.element, arg); |
489 node, | |
490 semantics.element, | |
491 arg); | |
492 case AccessKind.TOPLEVEL_METHOD: | 323 case AccessKind.TOPLEVEL_METHOD: |
493 return visitor.visitTopLevelFunctionGet( | 324 return visitor.visitTopLevelFunctionGet(node, semantics.element, arg); |
494 node, | |
495 semantics.element, | |
496 arg); | |
497 case AccessKind.TOPLEVEL_GETTER: | 325 case AccessKind.TOPLEVEL_GETTER: |
498 return visitor.visitTopLevelGetterGet( | 326 return visitor.visitTopLevelGetterGet(node, semantics.element, arg); |
499 node, | |
500 semantics.element, | |
501 arg); | |
502 case AccessKind.TOPLEVEL_SETTER: | 327 case AccessKind.TOPLEVEL_SETTER: |
503 return visitor.visitTopLevelSetterGet( | 328 return visitor.visitTopLevelSetterGet(node, semantics.element, arg); |
504 node, | |
505 semantics.element, | |
506 arg); | |
507 case AccessKind.CLASS_TYPE_LITERAL: | 329 case AccessKind.CLASS_TYPE_LITERAL: |
508 return visitor.visitClassTypeLiteralGet( | 330 return visitor.visitClassTypeLiteralGet(node, semantics.constant, arg); |
509 node, | |
510 semantics.constant, | |
511 arg); | |
512 case AccessKind.TYPEDEF_TYPE_LITERAL: | 331 case AccessKind.TYPEDEF_TYPE_LITERAL: |
513 return visitor.visitTypedefTypeLiteralGet( | 332 return visitor.visitTypedefTypeLiteralGet( |
514 node, | 333 node, semantics.constant, arg); |
515 semantics.constant, | |
516 arg); | |
517 case AccessKind.DYNAMIC_TYPE_LITERAL: | 334 case AccessKind.DYNAMIC_TYPE_LITERAL: |
518 return visitor.visitDynamicTypeLiteralGet( | 335 return visitor.visitDynamicTypeLiteralGet( |
519 node, | 336 node, semantics.constant, arg); |
520 semantics.constant, | |
521 arg); | |
522 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 337 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
523 return visitor.visitTypeVariableTypeLiteralGet( | 338 return visitor.visitTypeVariableTypeLiteralGet( |
524 node, | 339 node, semantics.element, arg); |
525 semantics.element, | |
526 arg); | |
527 case AccessKind.EXPRESSION: | 340 case AccessKind.EXPRESSION: |
528 // This is not a valid case. | 341 // This is not a valid case. |
529 break; | 342 break; |
530 case AccessKind.THIS: | 343 case AccessKind.THIS: |
531 // TODO(johnniwinther): Handle this when `this` is a [Send]. | 344 // TODO(johnniwinther): Handle this when `this` is a [Send]. |
532 break; | 345 break; |
533 case AccessKind.THIS_PROPERTY: | 346 case AccessKind.THIS_PROPERTY: |
534 return visitor.visitThisPropertyGet( | 347 return visitor.visitThisPropertyGet(node, semantics.name, arg); |
535 node, | |
536 semantics.name, | |
537 arg); | |
538 case AccessKind.SUPER_FIELD: | 348 case AccessKind.SUPER_FIELD: |
539 case AccessKind.SUPER_FINAL_FIELD: | 349 case AccessKind.SUPER_FINAL_FIELD: |
540 return visitor.visitSuperFieldGet( | 350 return visitor.visitSuperFieldGet(node, semantics.element, arg); |
541 node, | |
542 semantics.element, | |
543 arg); | |
544 case AccessKind.SUPER_METHOD: | 351 case AccessKind.SUPER_METHOD: |
545 return visitor.visitSuperMethodGet( | 352 return visitor.visitSuperMethodGet(node, semantics.element, arg); |
546 node, | |
547 semantics.element, | |
548 arg); | |
549 case AccessKind.SUPER_GETTER: | 353 case AccessKind.SUPER_GETTER: |
550 return visitor.visitSuperGetterGet( | 354 return visitor.visitSuperGetterGet(node, semantics.element, arg); |
551 node, | |
552 semantics.element, | |
553 arg); | |
554 case AccessKind.SUPER_SETTER: | 355 case AccessKind.SUPER_SETTER: |
555 return visitor.visitSuperSetterGet( | 356 return visitor.visitSuperSetterGet(node, semantics.element, arg); |
556 node, | |
557 semantics.element, | |
558 arg); | |
559 case AccessKind.CONSTANT: | 357 case AccessKind.CONSTANT: |
560 return visitor.visitConstantGet( | 358 return visitor.visitConstantGet(node, semantics.constant, arg); |
561 node, | |
562 semantics.constant, | |
563 arg); | |
564 case AccessKind.UNRESOLVED: | 359 case AccessKind.UNRESOLVED: |
565 return visitor.visitUnresolvedGet( | 360 return visitor.visitUnresolvedGet(node, semantics.element, arg); |
566 node, | |
567 semantics.element, | |
568 arg); | |
569 case AccessKind.UNRESOLVED_SUPER: | 361 case AccessKind.UNRESOLVED_SUPER: |
570 return visitor.visitUnresolvedSuperGet( | 362 return visitor.visitUnresolvedSuperGet(node, semantics.element, arg); |
571 node, | |
572 semantics.element, | |
573 arg); | |
574 case AccessKind.INVALID: | 363 case AccessKind.INVALID: |
575 return visitor.errorInvalidGet( | 364 return visitor.errorInvalidGet(node, semantics.element, arg); |
576 node, | |
577 semantics.element, | |
578 arg); | |
579 case AccessKind.COMPOUND: | 365 case AccessKind.COMPOUND: |
580 // This is not a valid case. | 366 // This is not a valid case. |
581 break; | 367 break; |
582 } | 368 } |
583 throw new SpannableAssertionFailure(node, "Invalid getter: ${semantics}"); | 369 throw new SpannableAssertionFailure(node, "Invalid getter: ${semantics}"); |
584 } | 370 } |
585 | 371 |
586 String toString() => 'get($semantics)'; | 372 String toString() => 'get($semantics)'; |
587 } | 373 } |
588 | 374 |
589 /// The structure for a [Send] that is an assignment. | 375 /// The structure for a [Send] that is an assignment. |
590 class SetStructure<R, A> implements SendStructure<R, A> { | 376 class SetStructure<R, A> implements SendStructure<R, A> { |
591 /// The target of the assignment. | 377 /// The target of the assignment. |
592 final AccessSemantics semantics; | 378 final AccessSemantics semantics; |
593 | 379 |
594 SetStructure(this.semantics); | 380 SetStructure(this.semantics); |
595 | 381 |
596 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 382 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
597 switch (semantics.kind) { | 383 switch (semantics.kind) { |
598 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: | 384 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
599 return visitor.visitIfNotNullDynamicPropertySet( | 385 return visitor.visitIfNotNullDynamicPropertySet( |
600 node, | 386 node, node.receiver, semantics.name, node.arguments.single, arg); |
601 node.receiver, | |
602 semantics.name, | |
603 node.arguments.single, | |
604 arg); | |
605 case AccessKind.DYNAMIC_PROPERTY: | 387 case AccessKind.DYNAMIC_PROPERTY: |
606 return visitor.visitDynamicPropertySet( | 388 return visitor.visitDynamicPropertySet( |
607 node, | 389 node, node.receiver, semantics.name, node.arguments.single, arg); |
608 node.receiver, | |
609 semantics.name, | |
610 node.arguments.single, | |
611 arg); | |
612 case AccessKind.LOCAL_FUNCTION: | 390 case AccessKind.LOCAL_FUNCTION: |
613 return visitor.visitLocalFunctionSet( | 391 return visitor.visitLocalFunctionSet( |
614 node, | 392 node, semantics.element, node.arguments.single, arg); |
615 semantics.element, | |
616 node.arguments.single, | |
617 arg); | |
618 case AccessKind.LOCAL_VARIABLE: | 393 case AccessKind.LOCAL_VARIABLE: |
619 return visitor.visitLocalVariableSet( | 394 return visitor.visitLocalVariableSet( |
620 node, | 395 node, semantics.element, node.arguments.single, arg); |
621 semantics.element, | |
622 node.arguments.single, | |
623 arg); | |
624 case AccessKind.FINAL_LOCAL_VARIABLE: | 396 case AccessKind.FINAL_LOCAL_VARIABLE: |
625 return visitor.visitFinalLocalVariableSet( | 397 return visitor.visitFinalLocalVariableSet( |
626 node, | 398 node, semantics.element, node.arguments.single, arg); |
627 semantics.element, | |
628 node.arguments.single, | |
629 arg); | |
630 case AccessKind.PARAMETER: | 399 case AccessKind.PARAMETER: |
631 return visitor.visitParameterSet( | 400 return visitor.visitParameterSet( |
632 node, | 401 node, semantics.element, node.arguments.single, arg); |
633 semantics.element, | |
634 node.arguments.single, | |
635 arg); | |
636 case AccessKind.FINAL_PARAMETER: | 402 case AccessKind.FINAL_PARAMETER: |
637 return visitor.visitFinalParameterSet( | 403 return visitor.visitFinalParameterSet( |
638 node, | 404 node, semantics.element, node.arguments.single, arg); |
639 semantics.element, | |
640 node.arguments.single, | |
641 arg); | |
642 case AccessKind.STATIC_FIELD: | 405 case AccessKind.STATIC_FIELD: |
643 return visitor.visitStaticFieldSet( | 406 return visitor.visitStaticFieldSet( |
644 node, | 407 node, semantics.element, node.arguments.single, arg); |
645 semantics.element, | |
646 node.arguments.single, | |
647 arg); | |
648 case AccessKind.FINAL_STATIC_FIELD: | 408 case AccessKind.FINAL_STATIC_FIELD: |
649 return visitor.visitFinalStaticFieldSet( | 409 return visitor.visitFinalStaticFieldSet( |
650 node, | 410 node, semantics.element, node.arguments.single, arg); |
651 semantics.element, | |
652 node.arguments.single, | |
653 arg); | |
654 case AccessKind.STATIC_METHOD: | 411 case AccessKind.STATIC_METHOD: |
655 return visitor.visitStaticFunctionSet( | 412 return visitor.visitStaticFunctionSet( |
656 node, | 413 node, semantics.element, node.arguments.single, arg); |
657 semantics.element, | |
658 node.arguments.single, | |
659 arg); | |
660 case AccessKind.STATIC_GETTER: | 414 case AccessKind.STATIC_GETTER: |
661 return visitor.visitStaticGetterSet( | 415 return visitor.visitStaticGetterSet( |
662 node, | 416 node, semantics.element, node.arguments.single, arg); |
663 semantics.element, | |
664 node.arguments.single, | |
665 arg); | |
666 case AccessKind.STATIC_SETTER: | 417 case AccessKind.STATIC_SETTER: |
667 return visitor.visitStaticSetterSet( | 418 return visitor.visitStaticSetterSet( |
668 node, | 419 node, semantics.element, node.arguments.single, arg); |
669 semantics.element, | |
670 node.arguments.single, | |
671 arg); | |
672 case AccessKind.TOPLEVEL_FIELD: | 420 case AccessKind.TOPLEVEL_FIELD: |
673 return visitor.visitTopLevelFieldSet( | 421 return visitor.visitTopLevelFieldSet( |
674 node, | 422 node, semantics.element, node.arguments.single, arg); |
675 semantics.element, | |
676 node.arguments.single, | |
677 arg); | |
678 case AccessKind.FINAL_TOPLEVEL_FIELD: | 423 case AccessKind.FINAL_TOPLEVEL_FIELD: |
679 return visitor.visitFinalTopLevelFieldSet( | 424 return visitor.visitFinalTopLevelFieldSet( |
680 node, | 425 node, semantics.element, node.arguments.single, arg); |
681 semantics.element, | |
682 node.arguments.single, | |
683 arg); | |
684 case AccessKind.TOPLEVEL_METHOD: | 426 case AccessKind.TOPLEVEL_METHOD: |
685 return visitor.visitTopLevelFunctionSet( | 427 return visitor.visitTopLevelFunctionSet( |
686 node, | 428 node, semantics.element, node.arguments.single, arg); |
687 semantics.element, | |
688 node.arguments.single, | |
689 arg); | |
690 case AccessKind.TOPLEVEL_GETTER: | 429 case AccessKind.TOPLEVEL_GETTER: |
691 return visitor.visitTopLevelGetterSet( | 430 return visitor.visitTopLevelGetterSet( |
692 node, | 431 node, semantics.element, node.arguments.single, arg); |
693 semantics.element, | |
694 node.arguments.single, | |
695 arg); | |
696 case AccessKind.TOPLEVEL_SETTER: | 432 case AccessKind.TOPLEVEL_SETTER: |
697 return visitor.visitTopLevelSetterSet( | 433 return visitor.visitTopLevelSetterSet( |
698 node, | 434 node, semantics.element, node.arguments.single, arg); |
699 semantics.element, | |
700 node.arguments.single, | |
701 arg); | |
702 case AccessKind.CLASS_TYPE_LITERAL: | 435 case AccessKind.CLASS_TYPE_LITERAL: |
703 return visitor.visitClassTypeLiteralSet( | 436 return visitor.visitClassTypeLiteralSet( |
704 node, | 437 node, semantics.constant, node.arguments.single, arg); |
705 semantics.constant, | |
706 node.arguments.single, | |
707 arg); | |
708 case AccessKind.TYPEDEF_TYPE_LITERAL: | 438 case AccessKind.TYPEDEF_TYPE_LITERAL: |
709 return visitor.visitTypedefTypeLiteralSet( | 439 return visitor.visitTypedefTypeLiteralSet( |
710 node, | 440 node, semantics.constant, node.arguments.single, arg); |
711 semantics.constant, | |
712 node.arguments.single, | |
713 arg); | |
714 case AccessKind.DYNAMIC_TYPE_LITERAL: | 441 case AccessKind.DYNAMIC_TYPE_LITERAL: |
715 return visitor.visitDynamicTypeLiteralSet( | 442 return visitor.visitDynamicTypeLiteralSet( |
716 node, | 443 node, semantics.constant, node.arguments.single, arg); |
717 semantics.constant, | |
718 node.arguments.single, | |
719 arg); | |
720 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 444 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
721 return visitor.visitTypeVariableTypeLiteralSet( | 445 return visitor.visitTypeVariableTypeLiteralSet( |
722 node, | 446 node, semantics.element, node.arguments.single, arg); |
723 semantics.element, | |
724 node.arguments.single, | |
725 arg); | |
726 case AccessKind.EXPRESSION: | 447 case AccessKind.EXPRESSION: |
727 // This is not a valid case. | 448 // This is not a valid case. |
728 break; | 449 break; |
729 case AccessKind.THIS: | 450 case AccessKind.THIS: |
730 // This is not a valid case. | 451 // This is not a valid case. |
731 break; | 452 break; |
732 case AccessKind.THIS_PROPERTY: | 453 case AccessKind.THIS_PROPERTY: |
733 return visitor.visitThisPropertySet( | 454 return visitor.visitThisPropertySet( |
734 node, | 455 node, semantics.name, node.arguments.single, arg); |
735 semantics.name, | |
736 node.arguments.single, | |
737 arg); | |
738 case AccessKind.SUPER_FIELD: | 456 case AccessKind.SUPER_FIELD: |
739 return visitor.visitSuperFieldSet( | 457 return visitor.visitSuperFieldSet( |
740 node, | 458 node, semantics.element, node.arguments.single, arg); |
741 semantics.element, | |
742 node.arguments.single, | |
743 arg); | |
744 case AccessKind.SUPER_FINAL_FIELD: | 459 case AccessKind.SUPER_FINAL_FIELD: |
745 return visitor.visitFinalSuperFieldSet( | 460 return visitor.visitFinalSuperFieldSet( |
746 node, | 461 node, semantics.element, node.arguments.single, arg); |
747 semantics.element, | |
748 node.arguments.single, | |
749 arg); | |
750 case AccessKind.SUPER_METHOD: | 462 case AccessKind.SUPER_METHOD: |
751 return visitor.visitSuperMethodSet( | 463 return visitor.visitSuperMethodSet( |
752 node, | 464 node, semantics.element, node.arguments.single, arg); |
753 semantics.element, | |
754 node.arguments.single, | |
755 arg); | |
756 case AccessKind.SUPER_GETTER: | 465 case AccessKind.SUPER_GETTER: |
757 return visitor.visitSuperGetterSet( | 466 return visitor.visitSuperGetterSet( |
758 node, | 467 node, semantics.element, node.arguments.single, arg); |
759 semantics.element, | |
760 node.arguments.single, | |
761 arg); | |
762 case AccessKind.SUPER_SETTER: | 468 case AccessKind.SUPER_SETTER: |
763 return visitor.visitSuperSetterSet( | 469 return visitor.visitSuperSetterSet( |
764 node, | 470 node, semantics.element, node.arguments.single, arg); |
765 semantics.element, | |
766 node.arguments.single, | |
767 arg); | |
768 case AccessKind.CONSTANT: | 471 case AccessKind.CONSTANT: |
769 // TODO(johnniwinther): Should this be a valid case? | 472 // TODO(johnniwinther): Should this be a valid case? |
770 break; | 473 break; |
771 case AccessKind.UNRESOLVED_SUPER: | 474 case AccessKind.UNRESOLVED_SUPER: |
772 return visitor.visitUnresolvedSuperSet( | 475 return visitor.visitUnresolvedSuperSet( |
773 node, | 476 node, semantics.element, node.arguments.single, arg); |
774 semantics.element, | |
775 node.arguments.single, | |
776 arg); | |
777 case AccessKind.UNRESOLVED: | 477 case AccessKind.UNRESOLVED: |
778 return visitor.visitUnresolvedSet( | 478 return visitor.visitUnresolvedSet( |
779 node, | 479 node, semantics.element, node.arguments.single, arg); |
780 semantics.element, | |
781 node.arguments.single, | |
782 arg); | |
783 case AccessKind.INVALID: | 480 case AccessKind.INVALID: |
784 return visitor.errorInvalidSet( | 481 return visitor.errorInvalidSet( |
785 node, | 482 node, semantics.element, node.arguments.single, arg); |
786 semantics.element, | |
787 node.arguments.single, | |
788 arg); | |
789 case AccessKind.COMPOUND: | 483 case AccessKind.COMPOUND: |
790 // This is not a valid case. | 484 // This is not a valid case. |
791 break; | 485 break; |
792 } | 486 } |
793 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); | 487 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); |
794 } | 488 } |
795 | 489 |
796 String toString() => 'set($semantics)'; | 490 String toString() => 'set($semantics)'; |
797 } | 491 } |
798 | 492 |
799 /// The structure for a [Send] that is a negation, i.e. of the form `!e`. | 493 /// The structure for a [Send] that is a negation, i.e. of the form `!e`. |
800 class NotStructure<R, A> implements SendStructure<R, A> { | 494 class NotStructure<R, A> implements SendStructure<R, A> { |
801 const NotStructure(); | 495 const NotStructure(); |
802 | 496 |
803 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 497 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
804 return visitor.visitNot( | 498 return visitor.visitNot(node, node.receiver, arg); |
805 node, | |
806 node.receiver, | |
807 arg); | |
808 } | 499 } |
809 | 500 |
810 String toString() => 'not()'; | 501 String toString() => 'not()'; |
811 } | 502 } |
812 | 503 |
813 /// The structure for a [Send] that is an invocation of a user definable unary | 504 /// The structure for a [Send] that is an invocation of a user definable unary |
814 /// operator. | 505 /// operator. |
815 class UnaryStructure<R, A> implements SendStructure<R, A> { | 506 class UnaryStructure<R, A> implements SendStructure<R, A> { |
816 /// The target of the unary operation. | 507 /// The target of the unary operation. |
817 final AccessSemantics semantics; | 508 final AccessSemantics semantics; |
818 | 509 |
819 /// The user definable unary operator. | 510 /// The user definable unary operator. |
820 final UnaryOperator operator; | 511 final UnaryOperator operator; |
821 | 512 |
822 UnaryStructure(this.semantics, this.operator); | 513 UnaryStructure(this.semantics, this.operator); |
823 | 514 |
824 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 515 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
825 switch (semantics.kind) { | 516 switch (semantics.kind) { |
826 case AccessKind.EXPRESSION: | 517 case AccessKind.EXPRESSION: |
827 return visitor.visitUnary( | 518 return visitor.visitUnary(node, operator, node.receiver, arg); |
828 node, | |
829 operator, | |
830 node.receiver, | |
831 arg); | |
832 case AccessKind.SUPER_METHOD: | 519 case AccessKind.SUPER_METHOD: |
833 return visitor.visitSuperUnary( | 520 return visitor.visitSuperUnary(node, operator, semantics.element, arg); |
834 node, | |
835 operator, | |
836 semantics.element, | |
837 arg); | |
838 case AccessKind.UNRESOLVED_SUPER: | 521 case AccessKind.UNRESOLVED_SUPER: |
839 return visitor.visitUnresolvedSuperUnary( | 522 return visitor.visitUnresolvedSuperUnary( |
840 node, | 523 node, operator, semantics.element, arg); |
841 operator, | |
842 semantics.element, | |
843 arg); | |
844 case AccessKind.INVALID: | 524 case AccessKind.INVALID: |
845 return visitor.errorInvalidUnary( | 525 return visitor.errorInvalidUnary( |
846 node, | 526 node, operator, semantics.element, arg); |
847 operator, | |
848 semantics.element, | |
849 arg); | |
850 default: | 527 default: |
851 // This is not a valid case. | 528 // This is not a valid case. |
852 break; | 529 break; |
853 } | 530 } |
854 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); | 531 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); |
855 } | 532 } |
856 | 533 |
857 String toString() => 'unary($operator,$semantics)'; | 534 String toString() => 'unary($operator,$semantics)'; |
858 } | 535 } |
859 | 536 |
860 /// The structure for a [Send] that is an invocation of a undefined unary | 537 /// The structure for a [Send] that is an invocation of a undefined unary |
861 /// operator. | 538 /// operator. |
862 class InvalidUnaryStructure<R, A> implements SendStructure<R, A> { | 539 class InvalidUnaryStructure<R, A> implements SendStructure<R, A> { |
863 const InvalidUnaryStructure(); | 540 const InvalidUnaryStructure(); |
864 | 541 |
865 @override | 542 @override |
866 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 543 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
867 return visitor.errorUndefinedUnaryExpression( | 544 return visitor.errorUndefinedUnaryExpression( |
868 node, | 545 node, node.selector, node.receiver, arg); |
869 node.selector, | |
870 node.receiver, | |
871 arg); | |
872 } | 546 } |
873 | 547 |
874 String toString() => 'invalid unary'; | 548 String toString() => 'invalid unary'; |
875 } | 549 } |
876 | 550 |
877 /// The structure for a [Send] that is an index expression, i.e. of the form | 551 /// The structure for a [Send] that is an index expression, i.e. of the form |
878 /// `a[b]`. | 552 /// `a[b]`. |
879 class IndexStructure<R, A> implements SendStructure<R, A> { | 553 class IndexStructure<R, A> implements SendStructure<R, A> { |
880 /// The target of the left operand. | 554 /// The target of the left operand. |
881 final AccessSemantics semantics; | 555 final AccessSemantics semantics; |
882 | 556 |
883 IndexStructure(this.semantics); | 557 IndexStructure(this.semantics); |
884 | 558 |
885 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 559 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
886 switch (semantics.kind) { | 560 switch (semantics.kind) { |
887 case AccessKind.EXPRESSION: | 561 case AccessKind.EXPRESSION: |
888 return visitor.visitIndex( | 562 return visitor.visitIndex( |
889 node, | 563 node, node.receiver, node.arguments.single, arg); |
890 node.receiver, | |
891 node.arguments.single, | |
892 arg); | |
893 case AccessKind.SUPER_METHOD: | 564 case AccessKind.SUPER_METHOD: |
894 return visitor.visitSuperIndex( | 565 return visitor.visitSuperIndex( |
895 node, | 566 node, semantics.element, node.arguments.single, arg); |
896 semantics.element, | |
897 node.arguments.single, | |
898 arg); | |
899 case AccessKind.UNRESOLVED_SUPER: | 567 case AccessKind.UNRESOLVED_SUPER: |
900 return visitor.visitUnresolvedSuperIndex( | 568 return visitor.visitUnresolvedSuperIndex( |
901 node, | 569 node, semantics.element, node.arguments.single, arg); |
902 semantics.element, | |
903 node.arguments.single, | |
904 arg); | |
905 case AccessKind.INVALID: | 570 case AccessKind.INVALID: |
906 return visitor.errorInvalidIndex( | 571 return visitor.errorInvalidIndex( |
907 node, | 572 node, semantics.element, node.arguments.single, arg); |
908 semantics.element, | |
909 node.arguments.single, | |
910 arg); | |
911 default: | 573 default: |
912 // This is not a valid case. | 574 // This is not a valid case. |
913 break; | 575 break; |
914 } | 576 } |
915 throw new SpannableAssertionFailure(node, "Invalid index: ${semantics}"); | 577 throw new SpannableAssertionFailure(node, "Invalid index: ${semantics}"); |
916 } | 578 } |
917 } | 579 } |
918 | 580 |
919 /// The structure for a [Send] that is an equals test, i.e. of the form | 581 /// The structure for a [Send] that is an equals test, i.e. of the form |
920 /// `a == b`. | 582 /// `a == b`. |
921 class EqualsStructure<R, A> implements SendStructure<R, A> { | 583 class EqualsStructure<R, A> implements SendStructure<R, A> { |
922 /// The target of the left operand. | 584 /// The target of the left operand. |
923 final AccessSemantics semantics; | 585 final AccessSemantics semantics; |
924 | 586 |
925 EqualsStructure(this.semantics); | 587 EqualsStructure(this.semantics); |
926 | 588 |
927 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 589 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
928 switch (semantics.kind) { | 590 switch (semantics.kind) { |
929 case AccessKind.EXPRESSION: | 591 case AccessKind.EXPRESSION: |
930 return visitor.visitEquals( | 592 return visitor.visitEquals( |
931 node, | 593 node, node.receiver, node.arguments.single, arg); |
932 node.receiver, | |
933 node.arguments.single, | |
934 arg); | |
935 case AccessKind.SUPER_METHOD: | 594 case AccessKind.SUPER_METHOD: |
936 return visitor.visitSuperEquals( | 595 return visitor.visitSuperEquals( |
937 node, | 596 node, semantics.element, node.arguments.single, arg); |
938 semantics.element, | |
939 node.arguments.single, | |
940 arg); | |
941 case AccessKind.INVALID: | 597 case AccessKind.INVALID: |
942 return visitor.errorInvalidEquals( | 598 return visitor.errorInvalidEquals( |
943 node, | 599 node, semantics.element, node.arguments.single, arg); |
944 semantics.element, | |
945 node.arguments.single, | |
946 arg); | |
947 default: | 600 default: |
948 // This is not a valid case. | 601 // This is not a valid case. |
949 break; | 602 break; |
950 } | 603 } |
951 throw new SpannableAssertionFailure(node, "Invalid equals: ${semantics}"); | 604 throw new SpannableAssertionFailure(node, "Invalid equals: ${semantics}"); |
952 } | 605 } |
953 | 606 |
954 String toString() => '==($semantics)'; | 607 String toString() => '==($semantics)'; |
955 } | 608 } |
956 | 609 |
957 /// The structure for a [Send] that is a not-equals test, i.e. of the form | 610 /// The structure for a [Send] that is a not-equals test, i.e. of the form |
958 /// `a != b`. | 611 /// `a != b`. |
959 class NotEqualsStructure<R, A> implements SendStructure<R, A> { | 612 class NotEqualsStructure<R, A> implements SendStructure<R, A> { |
960 /// The target of the left operand. | 613 /// The target of the left operand. |
961 final AccessSemantics semantics; | 614 final AccessSemantics semantics; |
962 | 615 |
963 NotEqualsStructure(this.semantics); | 616 NotEqualsStructure(this.semantics); |
964 | 617 |
965 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 618 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
966 switch (semantics.kind) { | 619 switch (semantics.kind) { |
967 case AccessKind.EXPRESSION: | 620 case AccessKind.EXPRESSION: |
968 return visitor.visitNotEquals( | 621 return visitor.visitNotEquals( |
969 node, | 622 node, node.receiver, node.arguments.single, arg); |
970 node.receiver, | |
971 node.arguments.single, | |
972 arg); | |
973 case AccessKind.SUPER_METHOD: | 623 case AccessKind.SUPER_METHOD: |
974 return visitor.visitSuperNotEquals( | 624 return visitor.visitSuperNotEquals( |
975 node, | 625 node, semantics.element, node.arguments.single, arg); |
976 semantics.element, | |
977 node.arguments.single, | |
978 arg); | |
979 case AccessKind.INVALID: | 626 case AccessKind.INVALID: |
980 return visitor.errorInvalidNotEquals( | 627 return visitor.errorInvalidNotEquals( |
981 node, | 628 node, semantics.element, node.arguments.single, arg); |
982 semantics.element, | |
983 node.arguments.single, | |
984 arg); | |
985 default: | 629 default: |
986 // This is not a valid case. | 630 // This is not a valid case. |
987 break; | 631 break; |
988 } | 632 } |
989 throw new SpannableAssertionFailure( | 633 throw new SpannableAssertionFailure( |
990 node, "Invalid not equals: ${semantics}"); | 634 node, "Invalid not equals: ${semantics}"); |
991 } | 635 } |
992 | 636 |
993 String toString() => '!=($semantics)'; | 637 String toString() => '!=($semantics)'; |
994 } | 638 } |
995 | 639 |
996 /// The structure for a [Send] that is an invocation of a user-definable binary | 640 /// The structure for a [Send] that is an invocation of a user-definable binary |
997 /// operator. | 641 /// operator. |
998 class BinaryStructure<R, A> implements SendStructure<R, A> { | 642 class BinaryStructure<R, A> implements SendStructure<R, A> { |
999 /// The target of the left operand. | 643 /// The target of the left operand. |
1000 final AccessSemantics semantics; | 644 final AccessSemantics semantics; |
1001 | 645 |
1002 /// The user definable binary operator. | 646 /// The user definable binary operator. |
1003 final BinaryOperator operator; | 647 final BinaryOperator operator; |
1004 | 648 |
1005 BinaryStructure(this.semantics, this.operator); | 649 BinaryStructure(this.semantics, this.operator); |
1006 | 650 |
1007 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 651 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1008 switch (semantics.kind) { | 652 switch (semantics.kind) { |
1009 case AccessKind.EXPRESSION: | 653 case AccessKind.EXPRESSION: |
1010 return visitor.visitBinary( | 654 return visitor.visitBinary( |
1011 node, | 655 node, node.receiver, operator, node.arguments.single, arg); |
1012 node.receiver, | |
1013 operator, | |
1014 node.arguments.single, | |
1015 arg); | |
1016 case AccessKind.SUPER_METHOD: | 656 case AccessKind.SUPER_METHOD: |
1017 return visitor.visitSuperBinary( | 657 return visitor.visitSuperBinary( |
1018 node, | 658 node, semantics.element, operator, node.arguments.single, arg); |
1019 semantics.element, | |
1020 operator, | |
1021 node.arguments.single, | |
1022 arg); | |
1023 case AccessKind.UNRESOLVED_SUPER: | 659 case AccessKind.UNRESOLVED_SUPER: |
1024 return visitor.visitUnresolvedSuperBinary( | 660 return visitor.visitUnresolvedSuperBinary( |
1025 node, | 661 node, semantics.element, operator, node.arguments.single, arg); |
1026 semantics.element, | |
1027 operator, | |
1028 node.arguments.single, | |
1029 arg); | |
1030 case AccessKind.INVALID: | 662 case AccessKind.INVALID: |
1031 return visitor.errorInvalidBinary( | 663 return visitor.errorInvalidBinary( |
1032 node, | 664 node, semantics.element, operator, node.arguments.single, arg); |
1033 semantics.element, | |
1034 operator, | |
1035 node.arguments.single, | |
1036 arg); | |
1037 default: | 665 default: |
1038 // This is not a valid case. | 666 // This is not a valid case. |
1039 break; | 667 break; |
1040 } | 668 } |
1041 throw new SpannableAssertionFailure( | 669 throw new SpannableAssertionFailure(node, "Invalid binary: ${semantics}"); |
1042 node, "Invalid binary: ${semantics}"); | |
1043 } | 670 } |
1044 | 671 |
1045 String toString() => 'binary($operator,$semantics)'; | 672 String toString() => 'binary($operator,$semantics)'; |
1046 } | 673 } |
1047 | 674 |
1048 /// The structure for a [Send] that is an invocation of a undefined binary | 675 /// The structure for a [Send] that is an invocation of a undefined binary |
1049 /// operator. | 676 /// operator. |
1050 class InvalidBinaryStructure<R, A> implements SendStructure<R, A> { | 677 class InvalidBinaryStructure<R, A> implements SendStructure<R, A> { |
1051 const InvalidBinaryStructure(); | 678 const InvalidBinaryStructure(); |
1052 | 679 |
1053 @override | 680 @override |
1054 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 681 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1055 return visitor.errorUndefinedBinaryExpression( | 682 return visitor.errorUndefinedBinaryExpression( |
1056 node, | 683 node, node.receiver, node.selector, node.arguments.single, arg); |
1057 node.receiver, | |
1058 node.selector, | |
1059 node.arguments.single, | |
1060 arg); | |
1061 } | 684 } |
1062 | 685 |
1063 String toString() => 'invalid binary'; | 686 String toString() => 'invalid binary'; |
1064 } | 687 } |
1065 | 688 |
1066 /// The structure for a [Send] that is of the form `a[b] = c`. | 689 /// The structure for a [Send] that is of the form `a[b] = c`. |
1067 class IndexSetStructure<R, A> implements SendStructure<R, A> { | 690 class IndexSetStructure<R, A> implements SendStructure<R, A> { |
1068 /// The target of the index set operation. | 691 /// The target of the index set operation. |
1069 final AccessSemantics semantics; | 692 final AccessSemantics semantics; |
1070 | 693 |
1071 IndexSetStructure(this.semantics); | 694 IndexSetStructure(this.semantics); |
1072 | 695 |
1073 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 696 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1074 switch (semantics.kind) { | 697 switch (semantics.kind) { |
1075 case AccessKind.EXPRESSION: | 698 case AccessKind.EXPRESSION: |
1076 return visitor.visitIndexSet( | 699 return visitor.visitIndexSet(node, node.receiver, node.arguments.first, |
1077 node, | 700 node.arguments.tail.head, arg); |
1078 node.receiver, | |
1079 node.arguments.first, | |
1080 node.arguments.tail.head, | |
1081 arg); | |
1082 case AccessKind.SUPER_METHOD: | 701 case AccessKind.SUPER_METHOD: |
1083 return visitor.visitSuperIndexSet( | 702 return visitor.visitSuperIndexSet(node, semantics.element, |
1084 node, | 703 node.arguments.first, node.arguments.tail.head, arg); |
1085 semantics.element, | |
1086 node.arguments.first, | |
1087 node.arguments.tail.head, | |
1088 arg); | |
1089 case AccessKind.UNRESOLVED_SUPER: | 704 case AccessKind.UNRESOLVED_SUPER: |
1090 case AccessKind.UNRESOLVED: | 705 case AccessKind.UNRESOLVED: |
1091 return visitor.visitUnresolvedSuperIndexSet( | 706 return visitor.visitUnresolvedSuperIndexSet(node, semantics.element, |
1092 node, | 707 node.arguments.first, node.arguments.tail.head, arg); |
1093 semantics.element, | |
1094 node.arguments.first, | |
1095 node.arguments.tail.head, | |
1096 arg); | |
1097 case AccessKind.INVALID: | 708 case AccessKind.INVALID: |
1098 return visitor.errorInvalidIndexSet( | 709 return visitor.errorInvalidIndexSet(node, semantics.element, |
1099 node, | 710 node.arguments.first, node.arguments.tail.head, arg); |
1100 semantics.element, | |
1101 node.arguments.first, | |
1102 node.arguments.tail.head, | |
1103 arg); | |
1104 default: | 711 default: |
1105 // This is not a valid case. | 712 // This is not a valid case. |
1106 break; | 713 break; |
1107 } | 714 } |
1108 throw new SpannableAssertionFailure( | 715 throw new SpannableAssertionFailure( |
1109 node, "Invalid index set: ${semantics}"); | 716 node, "Invalid index set: ${semantics}"); |
1110 } | 717 } |
1111 | 718 |
1112 String toString() => '[]=($semantics)'; | 719 String toString() => '[]=($semantics)'; |
1113 } | 720 } |
1114 | 721 |
1115 /// The structure for a [Send] that is an prefix operation on an index | 722 /// The structure for a [Send] that is an prefix operation on an index |
1116 /// expression, i.e. of the form `--a[b]`. | 723 /// expression, i.e. of the form `--a[b]`. |
1117 class IndexPrefixStructure<R, A> implements SendStructure<R, A> { | 724 class IndexPrefixStructure<R, A> implements SendStructure<R, A> { |
1118 /// The target of the left operand. | 725 /// The target of the left operand. |
1119 final AccessSemantics semantics; | 726 final AccessSemantics semantics; |
1120 | 727 |
1121 /// The `++` or `--` operator used in the operation. | 728 /// The `++` or `--` operator used in the operation. |
1122 final IncDecOperator operator; | 729 final IncDecOperator operator; |
1123 | 730 |
1124 IndexPrefixStructure(this.semantics, this.operator); | 731 IndexPrefixStructure(this.semantics, this.operator); |
1125 | 732 |
1126 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 733 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1127 switch (semantics.kind) { | 734 switch (semantics.kind) { |
1128 case AccessKind.EXPRESSION: | 735 case AccessKind.EXPRESSION: |
1129 return visitor.visitIndexPrefix( | 736 return visitor.visitIndexPrefix( |
1130 node, | 737 node, node.receiver, node.arguments.single, operator, arg); |
1131 node.receiver, | |
1132 node.arguments.single, | |
1133 operator, | |
1134 arg); | |
1135 case AccessKind.UNRESOLVED_SUPER: | 738 case AccessKind.UNRESOLVED_SUPER: |
1136 return visitor.visitUnresolvedSuperIndexPrefix( | 739 return visitor.visitUnresolvedSuperIndexPrefix( |
1137 node, | 740 node, semantics.element, node.arguments.single, operator, arg); |
1138 semantics.element, | |
1139 node.arguments.single, | |
1140 operator, | |
1141 arg); | |
1142 case AccessKind.INVALID: | 741 case AccessKind.INVALID: |
1143 return visitor.errorInvalidIndexPrefix( | 742 return visitor.errorInvalidIndexPrefix( |
1144 node, | 743 node, semantics.element, node.arguments.single, operator, arg); |
1145 semantics.element, | |
1146 node.arguments.single, | |
1147 operator, | |
1148 arg); | |
1149 case AccessKind.COMPOUND: | 744 case AccessKind.COMPOUND: |
1150 CompoundAccessSemantics compoundSemantics = semantics; | 745 CompoundAccessSemantics compoundSemantics = semantics; |
1151 switch (compoundSemantics.compoundAccessKind) { | 746 switch (compoundSemantics.compoundAccessKind) { |
1152 case CompoundAccessKind.SUPER_GETTER_SETTER: | 747 case CompoundAccessKind.SUPER_GETTER_SETTER: |
1153 return visitor.visitSuperIndexPrefix( | 748 return visitor.visitSuperIndexPrefix(node, compoundSemantics.getter, |
1154 node, | 749 compoundSemantics.setter, node.arguments.single, operator, arg); |
1155 compoundSemantics.getter, | |
1156 compoundSemantics.setter, | |
1157 node.arguments.single, | |
1158 operator, | |
1159 arg); | |
1160 case CompoundAccessKind.UNRESOLVED_SUPER_GETTER: | 750 case CompoundAccessKind.UNRESOLVED_SUPER_GETTER: |
1161 return visitor.visitUnresolvedSuperGetterIndexPrefix( | 751 return visitor.visitUnresolvedSuperGetterIndexPrefix( |
1162 node, | 752 node, |
1163 compoundSemantics.getter, | 753 compoundSemantics.getter, |
1164 compoundSemantics.setter, | 754 compoundSemantics.setter, |
1165 node.arguments.single, | 755 node.arguments.single, |
1166 operator, | 756 operator, |
1167 arg); | 757 arg); |
1168 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: | 758 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: |
1169 return visitor.visitUnresolvedSuperSetterIndexPrefix( | 759 return visitor.visitUnresolvedSuperSetterIndexPrefix( |
(...skipping 25 matching lines...) Expand all Loading... |
1195 | 785 |
1196 /// The `++` or `--` operator used in the operation. | 786 /// The `++` or `--` operator used in the operation. |
1197 final IncDecOperator operator; | 787 final IncDecOperator operator; |
1198 | 788 |
1199 IndexPostfixStructure(this.semantics, this.operator); | 789 IndexPostfixStructure(this.semantics, this.operator); |
1200 | 790 |
1201 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 791 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1202 switch (semantics.kind) { | 792 switch (semantics.kind) { |
1203 case AccessKind.EXPRESSION: | 793 case AccessKind.EXPRESSION: |
1204 return visitor.visitIndexPostfix( | 794 return visitor.visitIndexPostfix( |
1205 node, | 795 node, node.receiver, node.arguments.single, operator, arg); |
1206 node.receiver, | |
1207 node.arguments.single, | |
1208 operator, | |
1209 arg); | |
1210 case AccessKind.UNRESOLVED_SUPER: | 796 case AccessKind.UNRESOLVED_SUPER: |
1211 return visitor.visitUnresolvedSuperIndexPostfix( | 797 return visitor.visitUnresolvedSuperIndexPostfix( |
1212 node, | 798 node, semantics.element, node.arguments.single, operator, arg); |
1213 semantics.element, | |
1214 node.arguments.single, | |
1215 operator, | |
1216 arg); | |
1217 case AccessKind.INVALID: | 799 case AccessKind.INVALID: |
1218 return visitor.errorInvalidIndexPostfix( | 800 return visitor.errorInvalidIndexPostfix( |
1219 node, | 801 node, semantics.element, node.arguments.single, operator, arg); |
1220 semantics.element, | |
1221 node.arguments.single, | |
1222 operator, | |
1223 arg); | |
1224 case AccessKind.COMPOUND: | 802 case AccessKind.COMPOUND: |
1225 CompoundAccessSemantics compoundSemantics = semantics; | 803 CompoundAccessSemantics compoundSemantics = semantics; |
1226 switch (compoundSemantics.compoundAccessKind) { | 804 switch (compoundSemantics.compoundAccessKind) { |
1227 case CompoundAccessKind.SUPER_GETTER_SETTER: | 805 case CompoundAccessKind.SUPER_GETTER_SETTER: |
1228 return visitor.visitSuperIndexPostfix( | 806 return visitor.visitSuperIndexPostfix( |
1229 node, | 807 node, |
1230 compoundSemantics.getter, | 808 compoundSemantics.getter, |
1231 compoundSemantics.setter, | 809 compoundSemantics.setter, |
1232 node.arguments.single, | 810 node.arguments.single, |
1233 operator, | 811 operator, |
(...skipping 30 matching lines...) Expand all Loading... |
1264 | 842 |
1265 /// The structure for a [Send] that is a compound assignment. For instance | 843 /// The structure for a [Send] that is a compound assignment. For instance |
1266 /// `a += b`. | 844 /// `a += b`. |
1267 class CompoundStructure<R, A> implements SendStructure<R, A> { | 845 class CompoundStructure<R, A> implements SendStructure<R, A> { |
1268 /// The target of the compound assignment, i.e. the left-hand side. | 846 /// The target of the compound assignment, i.e. the left-hand side. |
1269 final AccessSemantics semantics; | 847 final AccessSemantics semantics; |
1270 | 848 |
1271 /// The assignment operator used in the compound assignment. | 849 /// The assignment operator used in the compound assignment. |
1272 final AssignmentOperator operator; | 850 final AssignmentOperator operator; |
1273 | 851 |
1274 CompoundStructure(this.semantics, | 852 CompoundStructure(this.semantics, this.operator); |
1275 this.operator); | |
1276 | 853 |
1277 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 854 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1278 switch (semantics.kind) { | 855 switch (semantics.kind) { |
1279 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: | 856 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
1280 return visitor.visitIfNotNullDynamicPropertyCompound( | 857 return visitor.visitIfNotNullDynamicPropertyCompound( |
1281 node, | 858 node, |
1282 node.receiver, | 859 node.receiver, |
1283 semantics.name, | 860 semantics.name, |
1284 operator, | 861 operator, |
1285 node.arguments.single, | 862 node.arguments.single, |
1286 arg); | 863 arg); |
1287 case AccessKind.DYNAMIC_PROPERTY: | 864 case AccessKind.DYNAMIC_PROPERTY: |
1288 return visitor.visitDynamicPropertyCompound( | 865 return visitor.visitDynamicPropertyCompound(node, node.receiver, |
1289 node, | 866 semantics.name, operator, node.arguments.single, arg); |
1290 node.receiver, | |
1291 semantics.name, | |
1292 operator, | |
1293 node.arguments.single, | |
1294 arg); | |
1295 case AccessKind.LOCAL_FUNCTION: | 867 case AccessKind.LOCAL_FUNCTION: |
1296 return visitor.visitLocalFunctionCompound( | 868 return visitor.visitLocalFunctionCompound( |
1297 node, | 869 node, semantics.element, operator, node.arguments.single, arg); |
1298 semantics.element, | |
1299 operator, | |
1300 node.arguments.single, | |
1301 arg); | |
1302 case AccessKind.LOCAL_VARIABLE: | 870 case AccessKind.LOCAL_VARIABLE: |
1303 return visitor.visitLocalVariableCompound( | 871 return visitor.visitLocalVariableCompound( |
1304 node, | 872 node, semantics.element, operator, node.arguments.single, arg); |
1305 semantics.element, | |
1306 operator, | |
1307 node.arguments.single, | |
1308 arg); | |
1309 case AccessKind.FINAL_LOCAL_VARIABLE: | 873 case AccessKind.FINAL_LOCAL_VARIABLE: |
1310 return visitor.visitFinalLocalVariableCompound( | 874 return visitor.visitFinalLocalVariableCompound( |
1311 node, | 875 node, semantics.element, operator, node.arguments.single, arg); |
1312 semantics.element, | |
1313 operator, | |
1314 node.arguments.single, | |
1315 arg); | |
1316 case AccessKind.PARAMETER: | 876 case AccessKind.PARAMETER: |
1317 return visitor.visitParameterCompound( | 877 return visitor.visitParameterCompound( |
1318 node, | 878 node, semantics.element, operator, node.arguments.single, arg); |
1319 semantics.element, | |
1320 operator, | |
1321 node.arguments.single, | |
1322 arg); | |
1323 case AccessKind.FINAL_PARAMETER: | 879 case AccessKind.FINAL_PARAMETER: |
1324 return visitor.visitFinalParameterCompound( | 880 return visitor.visitFinalParameterCompound( |
1325 node, | 881 node, semantics.element, operator, node.arguments.single, arg); |
1326 semantics.element, | |
1327 operator, | |
1328 node.arguments.single, | |
1329 arg); | |
1330 case AccessKind.STATIC_FIELD: | 882 case AccessKind.STATIC_FIELD: |
1331 return visitor.visitStaticFieldCompound( | 883 return visitor.visitStaticFieldCompound( |
1332 node, | 884 node, semantics.element, operator, node.arguments.single, arg); |
1333 semantics.element, | |
1334 operator, | |
1335 node.arguments.single, | |
1336 arg); | |
1337 case AccessKind.FINAL_STATIC_FIELD: | 885 case AccessKind.FINAL_STATIC_FIELD: |
1338 return visitor.visitFinalStaticFieldCompound( | 886 return visitor.visitFinalStaticFieldCompound( |
1339 node, | 887 node, semantics.element, operator, node.arguments.single, arg); |
1340 semantics.element, | |
1341 operator, | |
1342 node.arguments.single, | |
1343 arg); | |
1344 case AccessKind.STATIC_METHOD: | 888 case AccessKind.STATIC_METHOD: |
1345 return visitor.visitStaticMethodCompound( | 889 return visitor.visitStaticMethodCompound( |
1346 node, | 890 node, semantics.element, operator, node.arguments.single, arg); |
1347 semantics.element, | |
1348 operator, | |
1349 node.arguments.single, | |
1350 arg); | |
1351 case AccessKind.STATIC_GETTER: | 891 case AccessKind.STATIC_GETTER: |
1352 // This is not a valid case. | 892 // This is not a valid case. |
1353 break; | 893 break; |
1354 case AccessKind.STATIC_SETTER: | 894 case AccessKind.STATIC_SETTER: |
1355 // This is not a valid case. | 895 // This is not a valid case. |
1356 break; | 896 break; |
1357 case AccessKind.TOPLEVEL_FIELD: | 897 case AccessKind.TOPLEVEL_FIELD: |
1358 return visitor.visitTopLevelFieldCompound( | 898 return visitor.visitTopLevelFieldCompound( |
1359 node, | 899 node, semantics.element, operator, node.arguments.single, arg); |
1360 semantics.element, | |
1361 operator, | |
1362 node.arguments.single, | |
1363 arg); | |
1364 case AccessKind.FINAL_TOPLEVEL_FIELD: | 900 case AccessKind.FINAL_TOPLEVEL_FIELD: |
1365 return visitor.visitFinalTopLevelFieldCompound( | 901 return visitor.visitFinalTopLevelFieldCompound( |
1366 node, | 902 node, semantics.element, operator, node.arguments.single, arg); |
1367 semantics.element, | |
1368 operator, | |
1369 node.arguments.single, | |
1370 arg); | |
1371 case AccessKind.TOPLEVEL_METHOD: | 903 case AccessKind.TOPLEVEL_METHOD: |
1372 return visitor.visitTopLevelMethodCompound( | 904 return visitor.visitTopLevelMethodCompound( |
1373 node, | 905 node, semantics.element, operator, node.arguments.single, arg); |
1374 semantics.element, | |
1375 operator, | |
1376 node.arguments.single, | |
1377 arg); | |
1378 case AccessKind.TOPLEVEL_GETTER: | 906 case AccessKind.TOPLEVEL_GETTER: |
1379 // This is not a valid case. | 907 // This is not a valid case. |
1380 break; | 908 break; |
1381 case AccessKind.TOPLEVEL_SETTER: | 909 case AccessKind.TOPLEVEL_SETTER: |
1382 // This is not a valid case. | 910 // This is not a valid case. |
1383 break; | 911 break; |
1384 case AccessKind.CLASS_TYPE_LITERAL: | 912 case AccessKind.CLASS_TYPE_LITERAL: |
1385 return visitor.visitClassTypeLiteralCompound( | 913 return visitor.visitClassTypeLiteralCompound( |
1386 node, | 914 node, semantics.constant, operator, node.arguments.single, arg); |
1387 semantics.constant, | |
1388 operator, | |
1389 node.arguments.single, | |
1390 arg); | |
1391 case AccessKind.TYPEDEF_TYPE_LITERAL: | 915 case AccessKind.TYPEDEF_TYPE_LITERAL: |
1392 return visitor.visitTypedefTypeLiteralCompound( | 916 return visitor.visitTypedefTypeLiteralCompound( |
1393 node, | 917 node, semantics.constant, operator, node.arguments.single, arg); |
1394 semantics.constant, | |
1395 operator, | |
1396 node.arguments.single, | |
1397 arg); | |
1398 case AccessKind.DYNAMIC_TYPE_LITERAL: | 918 case AccessKind.DYNAMIC_TYPE_LITERAL: |
1399 return visitor.visitDynamicTypeLiteralCompound( | 919 return visitor.visitDynamicTypeLiteralCompound( |
1400 node, | 920 node, semantics.constant, operator, node.arguments.single, arg); |
1401 semantics.constant, | |
1402 operator, | |
1403 node.arguments.single, | |
1404 arg); | |
1405 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 921 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
1406 return visitor.visitTypeVariableTypeLiteralCompound( | 922 return visitor.visitTypeVariableTypeLiteralCompound( |
1407 node, | 923 node, semantics.element, operator, node.arguments.single, arg); |
1408 semantics.element, | |
1409 operator, | |
1410 node.arguments.single, | |
1411 arg); | |
1412 case AccessKind.EXPRESSION: | 924 case AccessKind.EXPRESSION: |
1413 // This is not a valid case. | 925 // This is not a valid case. |
1414 break; | 926 break; |
1415 case AccessKind.THIS: | 927 case AccessKind.THIS: |
1416 // This is not a valid case. | 928 // This is not a valid case. |
1417 break; | 929 break; |
1418 case AccessKind.THIS_PROPERTY: | 930 case AccessKind.THIS_PROPERTY: |
1419 return visitor.visitThisPropertyCompound( | 931 return visitor.visitThisPropertyCompound( |
1420 node, | 932 node, semantics.name, operator, node.arguments.single, arg); |
1421 semantics.name, | |
1422 operator, | |
1423 node.arguments.single, | |
1424 arg); | |
1425 case AccessKind.SUPER_FIELD: | 933 case AccessKind.SUPER_FIELD: |
1426 return visitor.visitSuperFieldCompound( | 934 return visitor.visitSuperFieldCompound( |
1427 node, | 935 node, semantics.element, operator, node.arguments.single, arg); |
1428 semantics.element, | |
1429 operator, | |
1430 node.arguments.single, | |
1431 arg); | |
1432 case AccessKind.SUPER_FINAL_FIELD: | 936 case AccessKind.SUPER_FINAL_FIELD: |
1433 return visitor.visitFinalSuperFieldCompound( | 937 return visitor.visitFinalSuperFieldCompound( |
1434 node, | 938 node, semantics.element, operator, node.arguments.single, arg); |
1435 semantics.element, | |
1436 operator, | |
1437 node.arguments.single, | |
1438 arg); | |
1439 case AccessKind.SUPER_METHOD: | 939 case AccessKind.SUPER_METHOD: |
1440 return visitor.visitSuperMethodCompound( | 940 return visitor.visitSuperMethodCompound( |
1441 node, | 941 node, semantics.element, operator, node.arguments.single, arg); |
1442 semantics.element, | |
1443 operator, | |
1444 node.arguments.single, | |
1445 arg); | |
1446 case AccessKind.SUPER_GETTER: | 942 case AccessKind.SUPER_GETTER: |
1447 // This is not a valid case. | 943 // This is not a valid case. |
1448 break; | 944 break; |
1449 case AccessKind.SUPER_SETTER: | 945 case AccessKind.SUPER_SETTER: |
1450 // This is not a valid case. | 946 // This is not a valid case. |
1451 break; | 947 break; |
1452 case AccessKind.CONSTANT: | 948 case AccessKind.CONSTANT: |
1453 // TODO(johnniwinther): Should this be a valid case? | 949 // TODO(johnniwinther): Should this be a valid case? |
1454 break; | 950 break; |
1455 case AccessKind.UNRESOLVED_SUPER: | 951 case AccessKind.UNRESOLVED_SUPER: |
1456 return visitor.visitUnresolvedSuperCompound( | 952 return visitor.visitUnresolvedSuperCompound( |
1457 node, | 953 node, semantics.element, operator, node.arguments.single, arg); |
1458 semantics.element, | |
1459 operator, | |
1460 node.arguments.single, | |
1461 arg); | |
1462 case AccessKind.UNRESOLVED: | 954 case AccessKind.UNRESOLVED: |
1463 return visitor.visitUnresolvedCompound( | 955 return visitor.visitUnresolvedCompound( |
1464 node, | 956 node, semantics.element, operator, node.arguments.single, arg); |
1465 semantics.element, | |
1466 operator, | |
1467 node.arguments.single, | |
1468 arg); | |
1469 case AccessKind.INVALID: | 957 case AccessKind.INVALID: |
1470 return visitor.errorInvalidCompound( | 958 return visitor.errorInvalidCompound( |
1471 node, | 959 node, semantics.element, operator, node.arguments.single, arg); |
1472 semantics.element, | |
1473 operator, | |
1474 node.arguments.single, | |
1475 arg); | |
1476 case AccessKind.COMPOUND: | 960 case AccessKind.COMPOUND: |
1477 CompoundAccessSemantics compoundSemantics = semantics; | 961 CompoundAccessSemantics compoundSemantics = semantics; |
1478 switch (compoundSemantics.compoundAccessKind) { | 962 switch (compoundSemantics.compoundAccessKind) { |
1479 case CompoundAccessKind.STATIC_GETTER_SETTER: | 963 case CompoundAccessKind.STATIC_GETTER_SETTER: |
1480 return visitor.visitStaticGetterSetterCompound( | 964 return visitor.visitStaticGetterSetterCompound( |
1481 node, | 965 node, |
1482 compoundSemantics.getter, | 966 compoundSemantics.getter, |
1483 compoundSemantics.setter, | 967 compoundSemantics.setter, |
1484 operator, | 968 operator, |
1485 node.arguments.single, | 969 node.arguments.single, |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1592 return visitor.visitUnresolvedSuperSetterCompound( | 1076 return visitor.visitUnresolvedSuperSetterCompound( |
1593 node, | 1077 node, |
1594 compoundSemantics.getter, | 1078 compoundSemantics.getter, |
1595 compoundSemantics.setter, | 1079 compoundSemantics.setter, |
1596 operator, | 1080 operator, |
1597 node.arguments.single, | 1081 node.arguments.single, |
1598 arg); | 1082 arg); |
1599 } | 1083 } |
1600 break; | 1084 break; |
1601 } | 1085 } |
1602 throw new SpannableAssertionFailure(node, | 1086 throw new SpannableAssertionFailure( |
1603 "Invalid compound assigment: ${semantics}"); | 1087 node, "Invalid compound assigment: ${semantics}"); |
1604 } | 1088 } |
1605 | 1089 |
1606 String toString() => 'compound($operator,$semantics)'; | 1090 String toString() => 'compound($operator,$semantics)'; |
1607 } | 1091 } |
1608 | 1092 |
1609 /// The structure for a [Send] that is an if-null assignment. For instance | 1093 /// The structure for a [Send] that is an if-null assignment. For instance |
1610 /// `a ??= b`. | 1094 /// `a ??= b`. |
1611 class SetIfNullStructure<R, A> implements SendStructure<R, A> { | 1095 class SetIfNullStructure<R, A> implements SendStructure<R, A> { |
1612 /// The target of the if-null assignment, i.e. the left-hand side. | 1096 /// The target of the if-null assignment, i.e. the left-hand side. |
1613 final AccessSemantics semantics; | 1097 final AccessSemantics semantics; |
1614 | 1098 |
1615 SetIfNullStructure(this.semantics); | 1099 SetIfNullStructure(this.semantics); |
1616 | 1100 |
1617 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 1101 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1618 switch (semantics.kind) { | 1102 switch (semantics.kind) { |
1619 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: | 1103 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
1620 return visitor.visitIfNotNullDynamicPropertySetIfNull( | 1104 return visitor.visitIfNotNullDynamicPropertySetIfNull( |
1621 node, | 1105 node, node.receiver, semantics.name, node.arguments.single, arg); |
1622 node.receiver, | |
1623 semantics.name, | |
1624 node.arguments.single, | |
1625 arg); | |
1626 case AccessKind.DYNAMIC_PROPERTY: | 1106 case AccessKind.DYNAMIC_PROPERTY: |
1627 return visitor.visitDynamicPropertySetIfNull( | 1107 return visitor.visitDynamicPropertySetIfNull( |
1628 node, | 1108 node, node.receiver, semantics.name, node.arguments.single, arg); |
1629 node.receiver, | |
1630 semantics.name, | |
1631 node.arguments.single, | |
1632 arg); | |
1633 case AccessKind.LOCAL_FUNCTION: | 1109 case AccessKind.LOCAL_FUNCTION: |
1634 return visitor.visitLocalFunctionSetIfNull( | 1110 return visitor.visitLocalFunctionSetIfNull( |
1635 node, | 1111 node, semantics.element, node.arguments.single, arg); |
1636 semantics.element, | |
1637 node.arguments.single, | |
1638 arg); | |
1639 case AccessKind.LOCAL_VARIABLE: | 1112 case AccessKind.LOCAL_VARIABLE: |
1640 return visitor.visitLocalVariableSetIfNull( | 1113 return visitor.visitLocalVariableSetIfNull( |
1641 node, | 1114 node, semantics.element, node.arguments.single, arg); |
1642 semantics.element, | |
1643 node.arguments.single, | |
1644 arg); | |
1645 case AccessKind.FINAL_LOCAL_VARIABLE: | 1115 case AccessKind.FINAL_LOCAL_VARIABLE: |
1646 return visitor.visitFinalLocalVariableSetIfNull( | 1116 return visitor.visitFinalLocalVariableSetIfNull( |
1647 node, | 1117 node, semantics.element, node.arguments.single, arg); |
1648 semantics.element, | |
1649 node.arguments.single, | |
1650 arg); | |
1651 case AccessKind.PARAMETER: | 1118 case AccessKind.PARAMETER: |
1652 return visitor.visitParameterSetIfNull( | 1119 return visitor.visitParameterSetIfNull( |
1653 node, | 1120 node, semantics.element, node.arguments.single, arg); |
1654 semantics.element, | |
1655 node.arguments.single, | |
1656 arg); | |
1657 case AccessKind.FINAL_PARAMETER: | 1121 case AccessKind.FINAL_PARAMETER: |
1658 return visitor.visitFinalParameterSetIfNull( | 1122 return visitor.visitFinalParameterSetIfNull( |
1659 node, | 1123 node, semantics.element, node.arguments.single, arg); |
1660 semantics.element, | |
1661 node.arguments.single, | |
1662 arg); | |
1663 case AccessKind.STATIC_FIELD: | 1124 case AccessKind.STATIC_FIELD: |
1664 return visitor.visitStaticFieldSetIfNull( | 1125 return visitor.visitStaticFieldSetIfNull( |
1665 node, | 1126 node, semantics.element, node.arguments.single, arg); |
1666 semantics.element, | |
1667 node.arguments.single, | |
1668 arg); | |
1669 case AccessKind.FINAL_STATIC_FIELD: | 1127 case AccessKind.FINAL_STATIC_FIELD: |
1670 return visitor.visitFinalStaticFieldSetIfNull( | 1128 return visitor.visitFinalStaticFieldSetIfNull( |
1671 node, | 1129 node, semantics.element, node.arguments.single, arg); |
1672 semantics.element, | |
1673 node.arguments.single, | |
1674 arg); | |
1675 case AccessKind.STATIC_METHOD: | 1130 case AccessKind.STATIC_METHOD: |
1676 return visitor.visitStaticMethodSetIfNull( | 1131 return visitor.visitStaticMethodSetIfNull( |
1677 node, | 1132 node, semantics.element, node.arguments.single, arg); |
1678 semantics.element, | |
1679 node.arguments.single, | |
1680 arg); | |
1681 case AccessKind.STATIC_GETTER: | 1133 case AccessKind.STATIC_GETTER: |
1682 // This is not a valid case. | 1134 // This is not a valid case. |
1683 break; | 1135 break; |
1684 case AccessKind.STATIC_SETTER: | 1136 case AccessKind.STATIC_SETTER: |
1685 // This is not a valid case. | 1137 // This is not a valid case. |
1686 break; | 1138 break; |
1687 case AccessKind.TOPLEVEL_FIELD: | 1139 case AccessKind.TOPLEVEL_FIELD: |
1688 return visitor.visitTopLevelFieldSetIfNull( | 1140 return visitor.visitTopLevelFieldSetIfNull( |
1689 node, | 1141 node, semantics.element, node.arguments.single, arg); |
1690 semantics.element, | |
1691 node.arguments.single, | |
1692 arg); | |
1693 case AccessKind.FINAL_TOPLEVEL_FIELD: | 1142 case AccessKind.FINAL_TOPLEVEL_FIELD: |
1694 return visitor.visitFinalTopLevelFieldSetIfNull( | 1143 return visitor.visitFinalTopLevelFieldSetIfNull( |
1695 node, | 1144 node, semantics.element, node.arguments.single, arg); |
1696 semantics.element, | |
1697 node.arguments.single, | |
1698 arg); | |
1699 case AccessKind.TOPLEVEL_METHOD: | 1145 case AccessKind.TOPLEVEL_METHOD: |
1700 return visitor.visitTopLevelMethodSetIfNull( | 1146 return visitor.visitTopLevelMethodSetIfNull( |
1701 node, | 1147 node, semantics.element, node.arguments.single, arg); |
1702 semantics.element, | |
1703 node.arguments.single, | |
1704 arg); | |
1705 case AccessKind.TOPLEVEL_GETTER: | 1148 case AccessKind.TOPLEVEL_GETTER: |
1706 // This is not a valid case. | 1149 // This is not a valid case. |
1707 break; | 1150 break; |
1708 case AccessKind.TOPLEVEL_SETTER: | 1151 case AccessKind.TOPLEVEL_SETTER: |
1709 // This is not a valid case. | 1152 // This is not a valid case. |
1710 break; | 1153 break; |
1711 case AccessKind.CLASS_TYPE_LITERAL: | 1154 case AccessKind.CLASS_TYPE_LITERAL: |
1712 return visitor.visitClassTypeLiteralSetIfNull( | 1155 return visitor.visitClassTypeLiteralSetIfNull( |
1713 node, | 1156 node, semantics.constant, node.arguments.single, arg); |
1714 semantics.constant, | |
1715 node.arguments.single, | |
1716 arg); | |
1717 case AccessKind.TYPEDEF_TYPE_LITERAL: | 1157 case AccessKind.TYPEDEF_TYPE_LITERAL: |
1718 return visitor.visitTypedefTypeLiteralSetIfNull( | 1158 return visitor.visitTypedefTypeLiteralSetIfNull( |
1719 node, | 1159 node, semantics.constant, node.arguments.single, arg); |
1720 semantics.constant, | |
1721 node.arguments.single, | |
1722 arg); | |
1723 case AccessKind.DYNAMIC_TYPE_LITERAL: | 1160 case AccessKind.DYNAMIC_TYPE_LITERAL: |
1724 return visitor.visitDynamicTypeLiteralSetIfNull( | 1161 return visitor.visitDynamicTypeLiteralSetIfNull( |
1725 node, | 1162 node, semantics.constant, node.arguments.single, arg); |
1726 semantics.constant, | |
1727 node.arguments.single, | |
1728 arg); | |
1729 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 1163 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
1730 return visitor.visitTypeVariableTypeLiteralSetIfNull( | 1164 return visitor.visitTypeVariableTypeLiteralSetIfNull( |
1731 node, | 1165 node, semantics.element, node.arguments.single, arg); |
1732 semantics.element, | |
1733 node.arguments.single, | |
1734 arg); | |
1735 case AccessKind.EXPRESSION: | 1166 case AccessKind.EXPRESSION: |
1736 // This is not a valid case. | 1167 // This is not a valid case. |
1737 break; | 1168 break; |
1738 case AccessKind.THIS: | 1169 case AccessKind.THIS: |
1739 // This is not a valid case. | 1170 // This is not a valid case. |
1740 break; | 1171 break; |
1741 case AccessKind.THIS_PROPERTY: | 1172 case AccessKind.THIS_PROPERTY: |
1742 return visitor.visitThisPropertySetIfNull( | 1173 return visitor.visitThisPropertySetIfNull( |
1743 node, | 1174 node, semantics.name, node.arguments.single, arg); |
1744 semantics.name, | |
1745 node.arguments.single, | |
1746 arg); | |
1747 case AccessKind.SUPER_FIELD: | 1175 case AccessKind.SUPER_FIELD: |
1748 return visitor.visitSuperFieldSetIfNull( | 1176 return visitor.visitSuperFieldSetIfNull( |
1749 node, | 1177 node, semantics.element, node.arguments.single, arg); |
1750 semantics.element, | |
1751 node.arguments.single, | |
1752 arg); | |
1753 case AccessKind.SUPER_FINAL_FIELD: | 1178 case AccessKind.SUPER_FINAL_FIELD: |
1754 return visitor.visitFinalSuperFieldSetIfNull( | 1179 return visitor.visitFinalSuperFieldSetIfNull( |
1755 node, | 1180 node, semantics.element, node.arguments.single, arg); |
1756 semantics.element, | |
1757 node.arguments.single, | |
1758 arg); | |
1759 case AccessKind.SUPER_METHOD: | 1181 case AccessKind.SUPER_METHOD: |
1760 return visitor.visitSuperMethodSetIfNull( | 1182 return visitor.visitSuperMethodSetIfNull( |
1761 node, | 1183 node, semantics.element, node.arguments.single, arg); |
1762 semantics.element, | |
1763 node.arguments.single, | |
1764 arg); | |
1765 case AccessKind.SUPER_GETTER: | 1184 case AccessKind.SUPER_GETTER: |
1766 // This is not a valid case. | 1185 // This is not a valid case. |
1767 break; | 1186 break; |
1768 case AccessKind.SUPER_SETTER: | 1187 case AccessKind.SUPER_SETTER: |
1769 // This is not a valid case. | 1188 // This is not a valid case. |
1770 break; | 1189 break; |
1771 case AccessKind.CONSTANT: | 1190 case AccessKind.CONSTANT: |
1772 // TODO(johnniwinther): Should this be a valid case? | 1191 // TODO(johnniwinther): Should this be a valid case? |
1773 break; | 1192 break; |
1774 case AccessKind.UNRESOLVED_SUPER: | 1193 case AccessKind.UNRESOLVED_SUPER: |
1775 return visitor.visitUnresolvedSuperSetIfNull( | 1194 return visitor.visitUnresolvedSuperSetIfNull( |
1776 node, | 1195 node, semantics.element, node.arguments.single, arg); |
1777 semantics.element, | |
1778 node.arguments.single, | |
1779 arg); | |
1780 case AccessKind.UNRESOLVED: | 1196 case AccessKind.UNRESOLVED: |
1781 return visitor.visitUnresolvedSetIfNull( | 1197 return visitor.visitUnresolvedSetIfNull( |
1782 node, | 1198 node, semantics.element, node.arguments.single, arg); |
1783 semantics.element, | |
1784 node.arguments.single, | |
1785 arg); | |
1786 case AccessKind.INVALID: | 1199 case AccessKind.INVALID: |
1787 return visitor.errorInvalidSetIfNull( | 1200 return visitor.errorInvalidSetIfNull( |
1788 node, | 1201 node, semantics.element, node.arguments.single, arg); |
1789 semantics.element, | |
1790 node.arguments.single, | |
1791 arg); | |
1792 case AccessKind.COMPOUND: | 1202 case AccessKind.COMPOUND: |
1793 CompoundAccessSemantics compoundSemantics = semantics; | 1203 CompoundAccessSemantics compoundSemantics = semantics; |
1794 switch (compoundSemantics.compoundAccessKind) { | 1204 switch (compoundSemantics.compoundAccessKind) { |
1795 case CompoundAccessKind.STATIC_GETTER_SETTER: | 1205 case CompoundAccessKind.STATIC_GETTER_SETTER: |
1796 return visitor.visitStaticGetterSetterSetIfNull( | 1206 return visitor.visitStaticGetterSetterSetIfNull( |
1797 node, | 1207 node, |
1798 compoundSemantics.getter, | 1208 compoundSemantics.getter, |
1799 compoundSemantics.setter, | 1209 compoundSemantics.setter, |
1800 node.arguments.single, | 1210 node.arguments.single, |
1801 arg); | 1211 arg); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1893 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: | 1303 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: |
1894 return visitor.visitUnresolvedSuperSetterSetIfNull( | 1304 return visitor.visitUnresolvedSuperSetterSetIfNull( |
1895 node, | 1305 node, |
1896 compoundSemantics.getter, | 1306 compoundSemantics.getter, |
1897 compoundSemantics.setter, | 1307 compoundSemantics.setter, |
1898 node.arguments.single, | 1308 node.arguments.single, |
1899 arg); | 1309 arg); |
1900 } | 1310 } |
1901 break; | 1311 break; |
1902 } | 1312 } |
1903 throw new SpannableAssertionFailure(node, | 1313 throw new SpannableAssertionFailure( |
1904 "Invalid if-null assigment: ${semantics}"); | 1314 node, "Invalid if-null assigment: ${semantics}"); |
1905 } | 1315 } |
1906 | 1316 |
1907 String toString() => 'ifNull($semantics)'; | 1317 String toString() => 'ifNull($semantics)'; |
1908 } | 1318 } |
1909 | 1319 |
1910 /// The structure for a [Send] that is a compound assignment on the index | 1320 /// The structure for a [Send] that is a compound assignment on the index |
1911 /// operator. For instance `a[b] += c`. | 1321 /// operator. For instance `a[b] += c`. |
1912 class CompoundIndexSetStructure<R, A> implements SendStructure<R, A> { | 1322 class CompoundIndexSetStructure<R, A> implements SendStructure<R, A> { |
1913 /// The target of the index operations. | 1323 /// The target of the index operations. |
1914 final AccessSemantics semantics; | 1324 final AccessSemantics semantics; |
1915 | 1325 |
1916 /// The assignment operator used in the compound assignment. | 1326 /// The assignment operator used in the compound assignment. |
1917 final AssignmentOperator operator; | 1327 final AssignmentOperator operator; |
1918 | 1328 |
1919 CompoundIndexSetStructure(this.semantics, this.operator); | 1329 CompoundIndexSetStructure(this.semantics, this.operator); |
1920 | 1330 |
1921 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 1331 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
1922 switch (semantics.kind) { | 1332 switch (semantics.kind) { |
1923 case AccessKind.EXPRESSION: | 1333 case AccessKind.EXPRESSION: |
1924 return visitor.visitCompoundIndexSet( | 1334 return visitor.visitCompoundIndexSet(node, node.receiver, |
1925 node, | 1335 node.arguments.first, operator, node.arguments.tail.head, arg); |
1926 node.receiver, | |
1927 node.arguments.first, | |
1928 operator, | |
1929 node.arguments.tail.head, | |
1930 arg); | |
1931 case AccessKind.UNRESOLVED_SUPER: | 1336 case AccessKind.UNRESOLVED_SUPER: |
1932 return visitor.visitUnresolvedSuperCompoundIndexSet( | 1337 return visitor.visitUnresolvedSuperCompoundIndexSet( |
1933 node, | 1338 node, |
1934 semantics.element, | 1339 semantics.element, |
1935 node.arguments.first, | 1340 node.arguments.first, |
1936 operator, | 1341 operator, |
1937 node.arguments.tail.head, | 1342 node.arguments.tail.head, |
1938 arg); | 1343 arg); |
1939 case AccessKind.INVALID: | 1344 case AccessKind.INVALID: |
1940 return visitor.errorInvalidCompoundIndexSet( | 1345 return visitor.errorInvalidCompoundIndexSet(node, semantics.element, |
1941 node, | 1346 node.arguments.first, operator, node.arguments.tail.head, arg); |
1942 semantics.element, | |
1943 node.arguments.first, | |
1944 operator, | |
1945 node.arguments.tail.head, | |
1946 arg); | |
1947 case AccessKind.COMPOUND: | 1347 case AccessKind.COMPOUND: |
1948 CompoundAccessSemantics compoundSemantics = semantics; | 1348 CompoundAccessSemantics compoundSemantics = semantics; |
1949 switch (compoundSemantics.compoundAccessKind) { | 1349 switch (compoundSemantics.compoundAccessKind) { |
1950 case CompoundAccessKind.SUPER_GETTER_SETTER: | 1350 case CompoundAccessKind.SUPER_GETTER_SETTER: |
1951 return visitor.visitSuperCompoundIndexSet( | 1351 return visitor.visitSuperCompoundIndexSet( |
1952 node, | 1352 node, |
1953 compoundSemantics.getter, | 1353 compoundSemantics.getter, |
1954 compoundSemantics.setter, | 1354 compoundSemantics.setter, |
1955 node.arguments.first, | 1355 node.arguments.first, |
1956 operator, | 1356 operator, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1994 /// operator. For instance `a[b] ??= c`. | 1394 /// operator. For instance `a[b] ??= c`. |
1995 class IndexSetIfNullStructure<R, A> implements SendStructure<R, A> { | 1395 class IndexSetIfNullStructure<R, A> implements SendStructure<R, A> { |
1996 /// The target of the index operations. | 1396 /// The target of the index operations. |
1997 final AccessSemantics semantics; | 1397 final AccessSemantics semantics; |
1998 | 1398 |
1999 IndexSetIfNullStructure(this.semantics); | 1399 IndexSetIfNullStructure(this.semantics); |
2000 | 1400 |
2001 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 1401 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
2002 switch (semantics.kind) { | 1402 switch (semantics.kind) { |
2003 case AccessKind.EXPRESSION: | 1403 case AccessKind.EXPRESSION: |
2004 return visitor.visitIndexSetIfNull( | 1404 return visitor.visitIndexSetIfNull(node, node.receiver, |
2005 node, | 1405 node.arguments.first, node.arguments.tail.head, arg); |
2006 node.receiver, | |
2007 node.arguments.first, | |
2008 node.arguments.tail.head, | |
2009 arg); | |
2010 case AccessKind.UNRESOLVED_SUPER: | 1406 case AccessKind.UNRESOLVED_SUPER: |
2011 return visitor.visitUnresolvedSuperIndexSetIfNull( | 1407 return visitor.visitUnresolvedSuperIndexSetIfNull( |
2012 node, | 1408 node, |
2013 semantics.element, | 1409 semantics.element, |
2014 node.arguments.first, | 1410 node.arguments.first, |
2015 node.arguments.tail.head, | 1411 node.arguments.tail.head, |
2016 arg); | 1412 arg); |
2017 case AccessKind.INVALID: | 1413 case AccessKind.INVALID: |
2018 return visitor.errorInvalidIndexSetIfNull( | 1414 return visitor.errorInvalidIndexSetIfNull(node, semantics.element, |
2019 node, | 1415 node.arguments.first, node.arguments.tail.head, arg); |
2020 semantics.element, | |
2021 node.arguments.first, | |
2022 node.arguments.tail.head, | |
2023 arg); | |
2024 case AccessKind.COMPOUND: | 1416 case AccessKind.COMPOUND: |
2025 CompoundAccessSemantics compoundSemantics = semantics; | 1417 CompoundAccessSemantics compoundSemantics = semantics; |
2026 switch (compoundSemantics.compoundAccessKind) { | 1418 switch (compoundSemantics.compoundAccessKind) { |
2027 case CompoundAccessKind.SUPER_GETTER_SETTER: | 1419 case CompoundAccessKind.SUPER_GETTER_SETTER: |
2028 return visitor.visitSuperIndexSetIfNull( | 1420 return visitor.visitSuperIndexSetIfNull( |
2029 node, | 1421 node, |
2030 compoundSemantics.getter, | 1422 compoundSemantics.getter, |
2031 compoundSemantics.setter, | 1423 compoundSemantics.setter, |
2032 node.arguments.first, | 1424 node.arguments.first, |
2033 node.arguments.tail.head, | 1425 node.arguments.tail.head, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2066 | 1458 |
2067 /// The structure for a [Send] that is a prefix operations. For instance | 1459 /// The structure for a [Send] that is a prefix operations. For instance |
2068 /// `++a`. | 1460 /// `++a`. |
2069 class PrefixStructure<R, A> implements SendStructure<R, A> { | 1461 class PrefixStructure<R, A> implements SendStructure<R, A> { |
2070 /// The target of the prefix operation. | 1462 /// The target of the prefix operation. |
2071 final AccessSemantics semantics; | 1463 final AccessSemantics semantics; |
2072 | 1464 |
2073 /// The `++` or `--` operator used in the operation. | 1465 /// The `++` or `--` operator used in the operation. |
2074 final IncDecOperator operator; | 1466 final IncDecOperator operator; |
2075 | 1467 |
2076 PrefixStructure(this.semantics, | 1468 PrefixStructure(this.semantics, this.operator); |
2077 this.operator); | |
2078 | 1469 |
2079 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 1470 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
2080 switch (semantics.kind) { | 1471 switch (semantics.kind) { |
2081 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: | 1472 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
2082 return visitor.visitIfNotNullDynamicPropertyPrefix( | 1473 return visitor.visitIfNotNullDynamicPropertyPrefix( |
2083 node, | 1474 node, node.receiver, semantics.name, operator, arg); |
2084 node.receiver, | |
2085 semantics.name, | |
2086 operator, | |
2087 arg); | |
2088 case AccessKind.DYNAMIC_PROPERTY: | 1475 case AccessKind.DYNAMIC_PROPERTY: |
2089 return visitor.visitDynamicPropertyPrefix( | 1476 return visitor.visitDynamicPropertyPrefix( |
2090 node, | 1477 node, node.receiver, semantics.name, operator, arg); |
2091 node.receiver, | |
2092 semantics.name, | |
2093 operator, | |
2094 arg); | |
2095 case AccessKind.LOCAL_FUNCTION: | 1478 case AccessKind.LOCAL_FUNCTION: |
2096 return visitor.visitLocalFunctionPrefix( | 1479 return visitor.visitLocalFunctionPrefix( |
2097 node, | 1480 node, semantics.element, operator, arg); |
2098 semantics.element, | |
2099 operator, | |
2100 arg); | |
2101 case AccessKind.LOCAL_VARIABLE: | 1481 case AccessKind.LOCAL_VARIABLE: |
2102 return visitor.visitLocalVariablePrefix( | 1482 return visitor.visitLocalVariablePrefix( |
2103 node, | 1483 node, semantics.element, operator, arg); |
2104 semantics.element, | |
2105 operator, | |
2106 arg); | |
2107 case AccessKind.FINAL_LOCAL_VARIABLE: | 1484 case AccessKind.FINAL_LOCAL_VARIABLE: |
2108 return visitor.visitFinalLocalVariablePrefix( | 1485 return visitor.visitFinalLocalVariablePrefix( |
2109 node, | 1486 node, semantics.element, operator, arg); |
2110 semantics.element, | |
2111 operator, | |
2112 arg); | |
2113 case AccessKind.PARAMETER: | 1487 case AccessKind.PARAMETER: |
2114 return visitor.visitParameterPrefix( | 1488 return visitor.visitParameterPrefix( |
2115 node, | 1489 node, semantics.element, operator, arg); |
2116 semantics.element, | |
2117 operator, | |
2118 arg); | |
2119 case AccessKind.FINAL_PARAMETER: | 1490 case AccessKind.FINAL_PARAMETER: |
2120 return visitor.visitFinalParameterPrefix( | 1491 return visitor.visitFinalParameterPrefix( |
2121 node, | 1492 node, semantics.element, operator, arg); |
2122 semantics.element, | |
2123 operator, | |
2124 arg); | |
2125 case AccessKind.STATIC_FIELD: | 1493 case AccessKind.STATIC_FIELD: |
2126 return visitor.visitStaticFieldPrefix( | 1494 return visitor.visitStaticFieldPrefix( |
2127 node, | 1495 node, semantics.element, operator, arg); |
2128 semantics.element, | |
2129 operator, | |
2130 arg); | |
2131 case AccessKind.FINAL_STATIC_FIELD: | 1496 case AccessKind.FINAL_STATIC_FIELD: |
2132 return visitor.visitFinalStaticFieldPrefix( | 1497 return visitor.visitFinalStaticFieldPrefix( |
2133 node, | 1498 node, semantics.element, operator, arg); |
2134 semantics.element, | |
2135 operator, | |
2136 arg); | |
2137 case AccessKind.STATIC_METHOD: | 1499 case AccessKind.STATIC_METHOD: |
2138 return visitor.visitStaticMethodPrefix( | 1500 return visitor.visitStaticMethodPrefix( |
2139 node, | 1501 node, semantics.element, operator, arg); |
2140 semantics.element, | |
2141 operator, | |
2142 arg); | |
2143 case AccessKind.STATIC_GETTER: | 1502 case AccessKind.STATIC_GETTER: |
2144 // This is not a valid case. | 1503 // This is not a valid case. |
2145 break; | 1504 break; |
2146 case AccessKind.STATIC_SETTER: | 1505 case AccessKind.STATIC_SETTER: |
2147 // This is not a valid case. | 1506 // This is not a valid case. |
2148 break; | 1507 break; |
2149 case AccessKind.TOPLEVEL_FIELD: | 1508 case AccessKind.TOPLEVEL_FIELD: |
2150 return visitor.visitTopLevelFieldPrefix( | 1509 return visitor.visitTopLevelFieldPrefix( |
2151 node, | 1510 node, semantics.element, operator, arg); |
2152 semantics.element, | |
2153 operator, | |
2154 arg); | |
2155 case AccessKind.FINAL_TOPLEVEL_FIELD: | 1511 case AccessKind.FINAL_TOPLEVEL_FIELD: |
2156 return visitor.visitFinalTopLevelFieldPrefix( | 1512 return visitor.visitFinalTopLevelFieldPrefix( |
2157 node, | 1513 node, semantics.element, operator, arg); |
2158 semantics.element, | |
2159 operator, | |
2160 arg); | |
2161 case AccessKind.TOPLEVEL_METHOD: | 1514 case AccessKind.TOPLEVEL_METHOD: |
2162 return visitor.visitTopLevelMethodPrefix( | 1515 return visitor.visitTopLevelMethodPrefix( |
2163 node, | 1516 node, semantics.element, operator, arg); |
2164 semantics.element, | |
2165 operator, | |
2166 arg); | |
2167 case AccessKind.TOPLEVEL_GETTER: | 1517 case AccessKind.TOPLEVEL_GETTER: |
2168 // This is not a valid case. | 1518 // This is not a valid case. |
2169 break; | 1519 break; |
2170 case AccessKind.TOPLEVEL_SETTER: | 1520 case AccessKind.TOPLEVEL_SETTER: |
2171 // This is not a valid case. | 1521 // This is not a valid case. |
2172 break; | 1522 break; |
2173 case AccessKind.CLASS_TYPE_LITERAL: | 1523 case AccessKind.CLASS_TYPE_LITERAL: |
2174 return visitor.visitClassTypeLiteralPrefix( | 1524 return visitor.visitClassTypeLiteralPrefix( |
2175 node, | 1525 node, semantics.constant, operator, arg); |
2176 semantics.constant, | |
2177 operator, | |
2178 arg); | |
2179 case AccessKind.TYPEDEF_TYPE_LITERAL: | 1526 case AccessKind.TYPEDEF_TYPE_LITERAL: |
2180 return visitor.visitTypedefTypeLiteralPrefix( | 1527 return visitor.visitTypedefTypeLiteralPrefix( |
2181 node, | 1528 node, semantics.constant, operator, arg); |
2182 semantics.constant, | |
2183 operator, | |
2184 arg); | |
2185 case AccessKind.DYNAMIC_TYPE_LITERAL: | 1529 case AccessKind.DYNAMIC_TYPE_LITERAL: |
2186 return visitor.visitDynamicTypeLiteralPrefix( | 1530 return visitor.visitDynamicTypeLiteralPrefix( |
2187 node, | 1531 node, semantics.constant, operator, arg); |
2188 semantics.constant, | |
2189 operator, | |
2190 arg); | |
2191 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 1532 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
2192 return visitor.visitTypeVariableTypeLiteralPrefix( | 1533 return visitor.visitTypeVariableTypeLiteralPrefix( |
2193 node, | 1534 node, semantics.element, operator, arg); |
2194 semantics.element, | |
2195 operator, | |
2196 arg); | |
2197 case AccessKind.EXPRESSION: | 1535 case AccessKind.EXPRESSION: |
2198 // This is not a valid case. | 1536 // This is not a valid case. |
2199 break; | 1537 break; |
2200 case AccessKind.THIS: | 1538 case AccessKind.THIS: |
2201 // This is not a valid case. | 1539 // This is not a valid case. |
2202 break; | 1540 break; |
2203 case AccessKind.THIS_PROPERTY: | 1541 case AccessKind.THIS_PROPERTY: |
2204 return visitor.visitThisPropertyPrefix( | 1542 return visitor.visitThisPropertyPrefix( |
2205 node, | 1543 node, semantics.name, operator, arg); |
2206 semantics.name, | |
2207 operator, | |
2208 arg); | |
2209 case AccessKind.SUPER_FIELD: | 1544 case AccessKind.SUPER_FIELD: |
2210 return visitor.visitSuperFieldPrefix( | 1545 return visitor.visitSuperFieldPrefix( |
2211 node, | 1546 node, semantics.element, operator, arg); |
2212 semantics.element, | |
2213 operator, | |
2214 arg); | |
2215 case AccessKind.SUPER_FINAL_FIELD: | 1547 case AccessKind.SUPER_FINAL_FIELD: |
2216 return visitor.visitFinalSuperFieldPrefix( | 1548 return visitor.visitFinalSuperFieldPrefix( |
2217 node, | 1549 node, semantics.element, operator, arg); |
2218 semantics.element, | |
2219 operator, | |
2220 arg); | |
2221 case AccessKind.SUPER_METHOD: | 1550 case AccessKind.SUPER_METHOD: |
2222 return visitor.visitSuperMethodPrefix( | 1551 return visitor.visitSuperMethodPrefix( |
2223 node, | 1552 node, semantics.element, operator, arg); |
2224 semantics.element, | |
2225 operator, | |
2226 arg); | |
2227 case AccessKind.SUPER_GETTER: | 1553 case AccessKind.SUPER_GETTER: |
2228 // This is not a valid case. | 1554 // This is not a valid case. |
2229 break; | 1555 break; |
2230 case AccessKind.SUPER_SETTER: | 1556 case AccessKind.SUPER_SETTER: |
2231 // This is not a valid case. | 1557 // This is not a valid case. |
2232 break; | 1558 break; |
2233 case AccessKind.CONSTANT: | 1559 case AccessKind.CONSTANT: |
2234 // TODO(johnniwinther): Should this be a valid case? | 1560 // TODO(johnniwinther): Should this be a valid case? |
2235 break; | 1561 break; |
2236 case AccessKind.UNRESOLVED_SUPER: | 1562 case AccessKind.UNRESOLVED_SUPER: |
2237 return visitor.visitUnresolvedSuperPrefix( | 1563 return visitor.visitUnresolvedSuperPrefix( |
2238 node, | 1564 node, semantics.element, operator, arg); |
2239 semantics.element, | |
2240 operator, | |
2241 arg); | |
2242 case AccessKind.UNRESOLVED: | 1565 case AccessKind.UNRESOLVED: |
2243 return visitor.visitUnresolvedPrefix( | 1566 return visitor.visitUnresolvedPrefix( |
2244 node, | 1567 node, semantics.element, operator, arg); |
2245 semantics.element, | |
2246 operator, | |
2247 arg); | |
2248 case AccessKind.INVALID: | 1568 case AccessKind.INVALID: |
2249 return visitor.errorInvalidPrefix( | 1569 return visitor.errorInvalidPrefix( |
2250 node, | 1570 node, semantics.element, operator, arg); |
2251 semantics.element, | |
2252 operator, | |
2253 arg); | |
2254 case AccessKind.COMPOUND: | 1571 case AccessKind.COMPOUND: |
2255 CompoundAccessSemantics compoundSemantics = semantics; | 1572 CompoundAccessSemantics compoundSemantics = semantics; |
2256 switch (compoundSemantics.compoundAccessKind) { | 1573 switch (compoundSemantics.compoundAccessKind) { |
2257 case CompoundAccessKind.STATIC_GETTER_SETTER: | 1574 case CompoundAccessKind.STATIC_GETTER_SETTER: |
2258 return visitor.visitStaticGetterSetterPrefix( | 1575 return visitor.visitStaticGetterSetterPrefix( |
2259 node, | 1576 node, |
2260 compoundSemantics.getter, | 1577 compoundSemantics.getter, |
2261 compoundSemantics.setter, | 1578 compoundSemantics.setter, |
2262 operator, | 1579 operator, |
2263 arg); | 1580 arg); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2361 arg); | 1678 arg); |
2362 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: | 1679 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: |
2363 return visitor.visitUnresolvedSuperSetterPrefix( | 1680 return visitor.visitUnresolvedSuperSetterPrefix( |
2364 node, | 1681 node, |
2365 compoundSemantics.getter, | 1682 compoundSemantics.getter, |
2366 compoundSemantics.setter, | 1683 compoundSemantics.setter, |
2367 operator, | 1684 operator, |
2368 arg); | 1685 arg); |
2369 } | 1686 } |
2370 } | 1687 } |
2371 throw new SpannableAssertionFailure(node, | 1688 throw new SpannableAssertionFailure( |
2372 "Invalid compound assigment: ${semantics}"); | 1689 node, "Invalid compound assigment: ${semantics}"); |
2373 } | 1690 } |
2374 | 1691 |
2375 String toString() => 'prefix($operator,$semantics)'; | 1692 String toString() => 'prefix($operator,$semantics)'; |
2376 } | 1693 } |
2377 | 1694 |
2378 /// The structure for a [Send] that is a postfix operations. For instance | 1695 /// The structure for a [Send] that is a postfix operations. For instance |
2379 /// `a++`. | 1696 /// `a++`. |
2380 class PostfixStructure<R, A> implements SendStructure<R, A> { | 1697 class PostfixStructure<R, A> implements SendStructure<R, A> { |
2381 /// The target of the postfix operation. | 1698 /// The target of the postfix operation. |
2382 final AccessSemantics semantics; | 1699 final AccessSemantics semantics; |
2383 | 1700 |
2384 /// The `++` or `--` operator used in the operation. | 1701 /// The `++` or `--` operator used in the operation. |
2385 final IncDecOperator operator; | 1702 final IncDecOperator operator; |
2386 | 1703 |
2387 PostfixStructure(this.semantics, | 1704 PostfixStructure(this.semantics, this.operator); |
2388 this.operator); | |
2389 | 1705 |
2390 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 1706 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
2391 switch (semantics.kind) { | 1707 switch (semantics.kind) { |
2392 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: | 1708 case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
2393 return visitor.visitIfNotNullDynamicPropertyPostfix( | 1709 return visitor.visitIfNotNullDynamicPropertyPostfix( |
2394 node, | 1710 node, node.receiver, semantics.name, operator, arg); |
2395 node.receiver, | |
2396 semantics.name, | |
2397 operator, | |
2398 arg); | |
2399 case AccessKind.DYNAMIC_PROPERTY: | 1711 case AccessKind.DYNAMIC_PROPERTY: |
2400 return visitor.visitDynamicPropertyPostfix( | 1712 return visitor.visitDynamicPropertyPostfix( |
2401 node, | 1713 node, node.receiver, semantics.name, operator, arg); |
2402 node.receiver, | |
2403 semantics.name, | |
2404 operator, | |
2405 arg); | |
2406 case AccessKind.LOCAL_FUNCTION: | 1714 case AccessKind.LOCAL_FUNCTION: |
2407 return visitor.visitLocalFunctionPostfix( | 1715 return visitor.visitLocalFunctionPostfix( |
2408 node, | 1716 node, semantics.element, operator, arg); |
2409 semantics.element, | |
2410 operator, | |
2411 arg); | |
2412 case AccessKind.LOCAL_VARIABLE: | 1717 case AccessKind.LOCAL_VARIABLE: |
2413 return visitor.visitLocalVariablePostfix( | 1718 return visitor.visitLocalVariablePostfix( |
2414 node, | 1719 node, semantics.element, operator, arg); |
2415 semantics.element, | |
2416 operator, | |
2417 arg); | |
2418 case AccessKind.FINAL_LOCAL_VARIABLE: | 1720 case AccessKind.FINAL_LOCAL_VARIABLE: |
2419 return visitor.visitFinalLocalVariablePostfix( | 1721 return visitor.visitFinalLocalVariablePostfix( |
2420 node, | 1722 node, semantics.element, operator, arg); |
2421 semantics.element, | |
2422 operator, | |
2423 arg); | |
2424 case AccessKind.PARAMETER: | 1723 case AccessKind.PARAMETER: |
2425 return visitor.visitParameterPostfix( | 1724 return visitor.visitParameterPostfix( |
2426 node, | 1725 node, semantics.element, operator, arg); |
2427 semantics.element, | |
2428 operator, | |
2429 arg); | |
2430 case AccessKind.FINAL_PARAMETER: | 1726 case AccessKind.FINAL_PARAMETER: |
2431 return visitor.visitFinalParameterPostfix( | 1727 return visitor.visitFinalParameterPostfix( |
2432 node, | 1728 node, semantics.element, operator, arg); |
2433 semantics.element, | |
2434 operator, | |
2435 arg); | |
2436 case AccessKind.STATIC_FIELD: | 1729 case AccessKind.STATIC_FIELD: |
2437 return visitor.visitStaticFieldPostfix( | 1730 return visitor.visitStaticFieldPostfix( |
2438 node, | 1731 node, semantics.element, operator, arg); |
2439 semantics.element, | |
2440 operator, | |
2441 arg); | |
2442 case AccessKind.FINAL_STATIC_FIELD: | 1732 case AccessKind.FINAL_STATIC_FIELD: |
2443 return visitor.visitFinalStaticFieldPostfix( | 1733 return visitor.visitFinalStaticFieldPostfix( |
2444 node, | 1734 node, semantics.element, operator, arg); |
2445 semantics.element, | |
2446 operator, | |
2447 arg); | |
2448 case AccessKind.STATIC_METHOD: | 1735 case AccessKind.STATIC_METHOD: |
2449 return visitor.visitStaticMethodPostfix( | 1736 return visitor.visitStaticMethodPostfix( |
2450 node, | 1737 node, semantics.element, operator, arg); |
2451 semantics.element, | |
2452 operator, | |
2453 arg); | |
2454 case AccessKind.STATIC_GETTER: | 1738 case AccessKind.STATIC_GETTER: |
2455 // This is not a valid case. | 1739 // This is not a valid case. |
2456 break; | 1740 break; |
2457 case AccessKind.STATIC_SETTER: | 1741 case AccessKind.STATIC_SETTER: |
2458 // This is not a valid case. | 1742 // This is not a valid case. |
2459 break; | 1743 break; |
2460 case AccessKind.TOPLEVEL_FIELD: | 1744 case AccessKind.TOPLEVEL_FIELD: |
2461 return visitor.visitTopLevelFieldPostfix( | 1745 return visitor.visitTopLevelFieldPostfix( |
2462 node, | 1746 node, semantics.element, operator, arg); |
2463 semantics.element, | |
2464 operator, | |
2465 arg); | |
2466 case AccessKind.FINAL_TOPLEVEL_FIELD: | 1747 case AccessKind.FINAL_TOPLEVEL_FIELD: |
2467 return visitor.visitFinalTopLevelFieldPostfix( | 1748 return visitor.visitFinalTopLevelFieldPostfix( |
2468 node, | 1749 node, semantics.element, operator, arg); |
2469 semantics.element, | |
2470 operator, | |
2471 arg); | |
2472 case AccessKind.TOPLEVEL_METHOD: | 1750 case AccessKind.TOPLEVEL_METHOD: |
2473 return visitor.visitTopLevelMethodPostfix( | 1751 return visitor.visitTopLevelMethodPostfix( |
2474 node, | 1752 node, semantics.element, operator, arg); |
2475 semantics.element, | |
2476 operator, | |
2477 arg); | |
2478 case AccessKind.TOPLEVEL_GETTER: | 1753 case AccessKind.TOPLEVEL_GETTER: |
2479 // This is not a valid case. | 1754 // This is not a valid case. |
2480 break; | 1755 break; |
2481 case AccessKind.TOPLEVEL_SETTER: | 1756 case AccessKind.TOPLEVEL_SETTER: |
2482 // This is not a valid case. | 1757 // This is not a valid case. |
2483 break; | 1758 break; |
2484 case AccessKind.CLASS_TYPE_LITERAL: | 1759 case AccessKind.CLASS_TYPE_LITERAL: |
2485 return visitor.visitClassTypeLiteralPostfix( | 1760 return visitor.visitClassTypeLiteralPostfix( |
2486 node, | 1761 node, semantics.constant, operator, arg); |
2487 semantics.constant, | |
2488 operator, | |
2489 arg); | |
2490 case AccessKind.TYPEDEF_TYPE_LITERAL: | 1762 case AccessKind.TYPEDEF_TYPE_LITERAL: |
2491 return visitor.visitTypedefTypeLiteralPostfix( | 1763 return visitor.visitTypedefTypeLiteralPostfix( |
2492 node, | 1764 node, semantics.constant, operator, arg); |
2493 semantics.constant, | |
2494 operator, | |
2495 arg); | |
2496 case AccessKind.DYNAMIC_TYPE_LITERAL: | 1765 case AccessKind.DYNAMIC_TYPE_LITERAL: |
2497 return visitor.visitDynamicTypeLiteralPostfix( | 1766 return visitor.visitDynamicTypeLiteralPostfix( |
2498 node, | 1767 node, semantics.constant, operator, arg); |
2499 semantics.constant, | |
2500 operator, | |
2501 arg); | |
2502 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 1768 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
2503 return visitor.visitTypeVariableTypeLiteralPostfix( | 1769 return visitor.visitTypeVariableTypeLiteralPostfix( |
2504 node, | 1770 node, semantics.element, operator, arg); |
2505 semantics.element, | |
2506 operator, | |
2507 arg); | |
2508 case AccessKind.EXPRESSION: | 1771 case AccessKind.EXPRESSION: |
2509 // This is not a valid case. | 1772 // This is not a valid case. |
2510 break; | 1773 break; |
2511 case AccessKind.THIS: | 1774 case AccessKind.THIS: |
2512 // This is not a valid case. | 1775 // This is not a valid case. |
2513 break; | 1776 break; |
2514 case AccessKind.THIS_PROPERTY: | 1777 case AccessKind.THIS_PROPERTY: |
2515 return visitor.visitThisPropertyPostfix( | 1778 return visitor.visitThisPropertyPostfix( |
2516 node, | 1779 node, semantics.name, operator, arg); |
2517 semantics.name, | |
2518 operator, | |
2519 arg); | |
2520 case AccessKind.SUPER_FIELD: | 1780 case AccessKind.SUPER_FIELD: |
2521 return visitor.visitSuperFieldPostfix( | 1781 return visitor.visitSuperFieldPostfix( |
2522 node, | 1782 node, semantics.element, operator, arg); |
2523 semantics.element, | |
2524 operator, | |
2525 arg); | |
2526 case AccessKind.SUPER_FINAL_FIELD: | 1783 case AccessKind.SUPER_FINAL_FIELD: |
2527 return visitor.visitFinalSuperFieldPostfix( | 1784 return visitor.visitFinalSuperFieldPostfix( |
2528 node, | 1785 node, semantics.element, operator, arg); |
2529 semantics.element, | |
2530 operator, | |
2531 arg); | |
2532 case AccessKind.SUPER_METHOD: | 1786 case AccessKind.SUPER_METHOD: |
2533 return visitor.visitSuperMethodPostfix( | 1787 return visitor.visitSuperMethodPostfix( |
2534 node, | 1788 node, semantics.element, operator, arg); |
2535 semantics.element, | |
2536 operator, | |
2537 arg); | |
2538 case AccessKind.SUPER_GETTER: | 1789 case AccessKind.SUPER_GETTER: |
2539 // This is not a valid case. | 1790 // This is not a valid case. |
2540 break; | 1791 break; |
2541 case AccessKind.SUPER_SETTER: | 1792 case AccessKind.SUPER_SETTER: |
2542 // This is not a valid case. | 1793 // This is not a valid case. |
2543 break; | 1794 break; |
2544 case AccessKind.CONSTANT: | 1795 case AccessKind.CONSTANT: |
2545 // TODO(johnniwinther): Should this be a valid case? | 1796 // TODO(johnniwinther): Should this be a valid case? |
2546 break; | 1797 break; |
2547 case AccessKind.UNRESOLVED_SUPER: | 1798 case AccessKind.UNRESOLVED_SUPER: |
2548 return visitor.visitUnresolvedSuperPostfix( | 1799 return visitor.visitUnresolvedSuperPostfix( |
2549 node, | 1800 node, semantics.element, operator, arg); |
2550 semantics.element, | |
2551 operator, | |
2552 arg); | |
2553 case AccessKind.UNRESOLVED: | 1801 case AccessKind.UNRESOLVED: |
2554 return visitor.visitUnresolvedPostfix( | 1802 return visitor.visitUnresolvedPostfix( |
2555 node, | 1803 node, semantics.element, operator, arg); |
2556 semantics.element, | |
2557 operator, | |
2558 arg); | |
2559 case AccessKind.INVALID: | 1804 case AccessKind.INVALID: |
2560 return visitor.errorInvalidPostfix( | 1805 return visitor.errorInvalidPostfix( |
2561 node, | 1806 node, semantics.element, operator, arg); |
2562 semantics.element, | |
2563 operator, | |
2564 arg); | |
2565 case AccessKind.COMPOUND: | 1807 case AccessKind.COMPOUND: |
2566 CompoundAccessSemantics compoundSemantics = semantics; | 1808 CompoundAccessSemantics compoundSemantics = semantics; |
2567 switch (compoundSemantics.compoundAccessKind) { | 1809 switch (compoundSemantics.compoundAccessKind) { |
2568 case CompoundAccessKind.STATIC_GETTER_SETTER: | 1810 case CompoundAccessKind.STATIC_GETTER_SETTER: |
2569 return visitor.visitStaticGetterSetterPostfix( | 1811 return visitor.visitStaticGetterSetterPostfix( |
2570 node, | 1812 node, |
2571 compoundSemantics.getter, | 1813 compoundSemantics.getter, |
2572 compoundSemantics.setter, | 1814 compoundSemantics.setter, |
2573 operator, | 1815 operator, |
2574 arg); | 1816 arg); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2665 arg); | 1907 arg); |
2666 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: | 1908 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: |
2667 return visitor.visitUnresolvedSuperSetterPostfix( | 1909 return visitor.visitUnresolvedSuperSetterPostfix( |
2668 node, | 1910 node, |
2669 compoundSemantics.getter, | 1911 compoundSemantics.getter, |
2670 compoundSemantics.setter, | 1912 compoundSemantics.setter, |
2671 operator, | 1913 operator, |
2672 arg); | 1914 arg); |
2673 } | 1915 } |
2674 } | 1916 } |
2675 throw new SpannableAssertionFailure(node, | 1917 throw new SpannableAssertionFailure( |
2676 "Invalid compound assigment: ${semantics}"); | 1918 node, "Invalid compound assigment: ${semantics}"); |
2677 } | 1919 } |
2678 | 1920 |
2679 String toString() => 'postfix($operator,$semantics)'; | 1921 String toString() => 'postfix($operator,$semantics)'; |
2680 } | 1922 } |
2681 | 1923 |
2682 | |
2683 /// The structure for a [Send] whose prefix is a prefix for a deferred library. | 1924 /// The structure for a [Send] whose prefix is a prefix for a deferred library. |
2684 /// For instance `deferred.a` where `deferred` is a deferred prefix. | 1925 /// For instance `deferred.a` where `deferred` is a deferred prefix. |
2685 class DeferredPrefixStructure<R, A> implements SendStructure<R, A> { | 1926 class DeferredPrefixStructure<R, A> implements SendStructure<R, A> { |
2686 /// The deferred prefix element. | 1927 /// The deferred prefix element. |
2687 final PrefixElement prefix; | 1928 final PrefixElement prefix; |
2688 | 1929 |
2689 /// The send structure for the whole [Send] node. For instance a | 1930 /// The send structure for the whole [Send] node. For instance a |
2690 /// [GetStructure] for `deferred.a` where `a` is a top level member of the | 1931 /// [GetStructure] for `deferred.a` where `a` is a top level member of the |
2691 /// deferred library. | 1932 /// deferred library. |
2692 final SendStructure sendStructure; | 1933 final SendStructure sendStructure; |
2693 | 1934 |
2694 DeferredPrefixStructure(this.prefix, this.sendStructure) { | 1935 DeferredPrefixStructure(this.prefix, this.sendStructure) { |
2695 assert(sendStructure != null); | 1936 assert(sendStructure != null); |
2696 } | 1937 } |
2697 | 1938 |
2698 @override | 1939 @override |
2699 R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg) { | 1940 R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg) { |
2700 visitor.previsitDeferredAccess(send, prefix, arg); | 1941 visitor.previsitDeferredAccess(send, prefix, arg); |
2701 return sendStructure.dispatch(visitor, send, arg); | 1942 return sendStructure.dispatch(visitor, send, arg); |
2702 } | 1943 } |
2703 } | 1944 } |
2704 | 1945 |
2705 | |
2706 /// The structure for a [NewExpression] of a new invocation. | 1946 /// The structure for a [NewExpression] of a new invocation. |
2707 abstract class NewStructure<R, A> implements SemanticSendStructure<R, A> { | 1947 abstract class NewStructure<R, A> implements SemanticSendStructure<R, A> { |
2708 /// Calls the matching visit method on [visitor] with [node] and [arg]. | 1948 /// Calls the matching visit method on [visitor] with [node] and [arg]. |
2709 R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg); | 1949 R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg); |
2710 } | 1950 } |
2711 | 1951 |
2712 /// The structure for a [NewExpression] of a new invocation. For instance | 1952 /// The structure for a [NewExpression] of a new invocation. For instance |
2713 /// `new C()`. | 1953 /// `new C()`. |
2714 class NewInvokeStructure<R, A> extends NewStructure<R, A> { | 1954 class NewInvokeStructure<R, A> extends NewStructure<R, A> { |
2715 final ConstructorAccessSemantics semantics; | 1955 final ConstructorAccessSemantics semantics; |
2716 final Selector selector; | 1956 final Selector selector; |
2717 | 1957 |
2718 NewInvokeStructure(this.semantics, this.selector); | 1958 NewInvokeStructure(this.semantics, this.selector); |
2719 | 1959 |
2720 CallStructure get callStructure => selector.callStructure; | 1960 CallStructure get callStructure => selector.callStructure; |
2721 | 1961 |
2722 R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg) { | 1962 R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg) { |
2723 switch (semantics.kind) { | 1963 switch (semantics.kind) { |
2724 case ConstructorAccessKind.GENERATIVE: | 1964 case ConstructorAccessKind.GENERATIVE: |
2725 ConstructorElement constructor = semantics.element; | 1965 ConstructorElement constructor = semantics.element; |
2726 if (constructor.isRedirectingGenerative) { | 1966 if (constructor.isRedirectingGenerative) { |
2727 return visitor.visitRedirectingGenerativeConstructorInvoke( | 1967 return visitor.visitRedirectingGenerativeConstructorInvoke( |
2728 node, constructor, semantics.type, | 1968 node, |
2729 node.send.argumentsNode, callStructure, arg); | 1969 constructor, |
| 1970 semantics.type, |
| 1971 node.send.argumentsNode, |
| 1972 callStructure, |
| 1973 arg); |
2730 } | 1974 } |
2731 return visitor.visitGenerativeConstructorInvoke( | 1975 return visitor.visitGenerativeConstructorInvoke(node, constructor, |
2732 node, constructor, semantics.type, | 1976 semantics.type, node.send.argumentsNode, callStructure, arg); |
2733 node.send.argumentsNode, callStructure, arg); | |
2734 case ConstructorAccessKind.FACTORY: | 1977 case ConstructorAccessKind.FACTORY: |
2735 ConstructorElement constructor = semantics.element; | 1978 ConstructorElement constructor = semantics.element; |
2736 if (constructor.isRedirectingFactory) { | 1979 if (constructor.isRedirectingFactory) { |
2737 if (constructor.isEffectiveTargetMalformed) { | 1980 if (constructor.isEffectiveTargetMalformed) { |
2738 return visitor.visitUnresolvedRedirectingFactoryConstructorInvoke( | 1981 return visitor.visitUnresolvedRedirectingFactoryConstructorInvoke( |
2739 node, semantics.element, semantics.type, | 1982 node, |
2740 node.send.argumentsNode, callStructure, arg); | 1983 semantics.element, |
| 1984 semantics.type, |
| 1985 node.send.argumentsNode, |
| 1986 callStructure, |
| 1987 arg); |
2741 } | 1988 } |
2742 ConstructorElement effectiveTarget = constructor.effectiveTarget; | 1989 ConstructorElement effectiveTarget = constructor.effectiveTarget; |
2743 InterfaceType effectiveTargetType = | 1990 InterfaceType effectiveTargetType = |
2744 constructor.computeEffectiveTargetType(semantics.type); | 1991 constructor.computeEffectiveTargetType(semantics.type); |
2745 if (callStructure.signatureApplies( | 1992 if (callStructure |
2746 effectiveTarget.functionSignature)) { | 1993 .signatureApplies(effectiveTarget.functionSignature)) { |
2747 return visitor.visitRedirectingFactoryConstructorInvoke( | 1994 return visitor.visitRedirectingFactoryConstructorInvoke( |
2748 node, semantics.element, semantics.type, | 1995 node, |
2749 effectiveTarget, effectiveTargetType, | 1996 semantics.element, |
2750 node.send.argumentsNode, callStructure, arg); | 1997 semantics.type, |
| 1998 effectiveTarget, |
| 1999 effectiveTargetType, |
| 2000 node.send.argumentsNode, |
| 2001 callStructure, |
| 2002 arg); |
2751 } else { | 2003 } else { |
2752 return visitor.visitUnresolvedRedirectingFactoryConstructorInvoke( | 2004 return visitor.visitUnresolvedRedirectingFactoryConstructorInvoke( |
2753 node, semantics.element, semantics.type, | 2005 node, |
2754 node.send.argumentsNode, callStructure, arg); | 2006 semantics.element, |
| 2007 semantics.type, |
| 2008 node.send.argumentsNode, |
| 2009 callStructure, |
| 2010 arg); |
2755 } | 2011 } |
2756 } | 2012 } |
2757 if (callStructure.signatureApplies(constructor.functionSignature)) { | 2013 if (callStructure.signatureApplies(constructor.functionSignature)) { |
2758 return visitor.visitFactoryConstructorInvoke( | 2014 return visitor.visitFactoryConstructorInvoke(node, constructor, |
2759 node, constructor, semantics.type, | 2015 semantics.type, node.send.argumentsNode, callStructure, arg); |
2760 node.send.argumentsNode, callStructure, arg); | |
2761 } | 2016 } |
2762 return visitor.visitConstructorIncompatibleInvoke( | 2017 return visitor.visitConstructorIncompatibleInvoke(node, constructor, |
2763 node, constructor, semantics.type, | 2018 semantics.type, node.send.argumentsNode, callStructure, arg); |
2764 node.send.argumentsNode, callStructure, arg); | |
2765 case ConstructorAccessKind.ABSTRACT: | 2019 case ConstructorAccessKind.ABSTRACT: |
2766 return visitor.visitAbstractClassConstructorInvoke( | 2020 return visitor.visitAbstractClassConstructorInvoke( |
2767 node, semantics.element, semantics.type, | 2021 node, |
2768 node.send.argumentsNode, callStructure, arg); | 2022 semantics.element, |
| 2023 semantics.type, |
| 2024 node.send.argumentsNode, |
| 2025 callStructure, |
| 2026 arg); |
2769 case ConstructorAccessKind.UNRESOLVED_CONSTRUCTOR: | 2027 case ConstructorAccessKind.UNRESOLVED_CONSTRUCTOR: |
2770 return visitor.visitUnresolvedConstructorInvoke( | 2028 return visitor.visitUnresolvedConstructorInvoke(node, semantics.element, |
2771 node, semantics.element, semantics.type, | 2029 semantics.type, node.send.argumentsNode, selector, arg); |
2772 node.send.argumentsNode, selector, arg); | |
2773 case ConstructorAccessKind.UNRESOLVED_TYPE: | 2030 case ConstructorAccessKind.UNRESOLVED_TYPE: |
2774 return visitor.visitUnresolvedClassConstructorInvoke( | 2031 return visitor.visitUnresolvedClassConstructorInvoke( |
2775 node, semantics.element, semantics.type, | 2032 node, |
2776 node.send.argumentsNode, selector, arg); | 2033 semantics.element, |
| 2034 semantics.type, |
| 2035 node.send.argumentsNode, |
| 2036 selector, |
| 2037 arg); |
2777 case ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR: | 2038 case ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR: |
2778 return visitor.errorNonConstantConstructorInvoke( | 2039 return visitor.errorNonConstantConstructorInvoke( |
2779 node, semantics.element, semantics.type, | 2040 node, |
2780 node.send.argumentsNode, callStructure, arg); | 2041 semantics.element, |
| 2042 semantics.type, |
| 2043 node.send.argumentsNode, |
| 2044 callStructure, |
| 2045 arg); |
2781 case ConstructorAccessKind.INCOMPATIBLE: | 2046 case ConstructorAccessKind.INCOMPATIBLE: |
2782 return visitor.visitConstructorIncompatibleInvoke( | 2047 return visitor.visitConstructorIncompatibleInvoke( |
2783 node, semantics.element, semantics.type, | 2048 node, |
2784 node.send.argumentsNode, callStructure, arg); | 2049 semantics.element, |
| 2050 semantics.type, |
| 2051 node.send.argumentsNode, |
| 2052 callStructure, |
| 2053 arg); |
2785 } | 2054 } |
2786 throw new SpannableAssertionFailure(node, | 2055 throw new SpannableAssertionFailure( |
2787 "Unhandled constructor invocation kind: ${semantics.kind}"); | 2056 node, "Unhandled constructor invocation kind: ${semantics.kind}"); |
2788 } | 2057 } |
2789 | 2058 |
2790 String toString() => 'new($semantics,$selector)'; | 2059 String toString() => 'new($semantics,$selector)'; |
2791 } | 2060 } |
2792 | 2061 |
2793 enum ConstantInvokeKind { | 2062 enum ConstantInvokeKind { |
2794 CONSTRUCTED, | 2063 CONSTRUCTED, |
2795 BOOL_FROM_ENVIRONMENT, | 2064 BOOL_FROM_ENVIRONMENT, |
2796 INT_FROM_ENVIRONMENT, | 2065 INT_FROM_ENVIRONMENT, |
2797 STRING_FROM_ENVIRONMENT, | 2066 STRING_FROM_ENVIRONMENT, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2834 R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg) { | 2103 R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg) { |
2835 Element element = elements[node.send]; | 2104 Element element = elements[node.send]; |
2836 Selector selector = elements.getSelector(node.send); | 2105 Selector selector = elements.getSelector(node.send); |
2837 DartType type = elements.getType(node); | 2106 DartType type = elements.getType(node); |
2838 ConstantExpression constant = elements.getConstant(node); | 2107 ConstantExpression constant = elements.getConstant(node); |
2839 if (element.isMalformed || | 2108 if (element.isMalformed || |
2840 constant == null || | 2109 constant == null || |
2841 constant.kind == ConstantExpressionKind.ERRONEOUS) { | 2110 constant.kind == ConstantExpressionKind.ERRONEOUS) { |
2842 // This is a non-constant constant constructor invocation, like | 2111 // This is a non-constant constant constructor invocation, like |
2843 // `const Const(method())`. | 2112 // `const Const(method())`. |
2844 return visitor.errorNonConstantConstructorInvoke( | 2113 return visitor.errorNonConstantConstructorInvoke(node, element, type, |
2845 node, element, type, | |
2846 node.send.argumentsNode, selector.callStructure, arg); | 2114 node.send.argumentsNode, selector.callStructure, arg); |
2847 } else { | 2115 } else { |
2848 ConstantInvokeKind kind; | 2116 ConstantInvokeKind kind; |
2849 switch (constant.kind) { | 2117 switch (constant.kind) { |
2850 case ConstantExpressionKind.CONSTRUCTED: | 2118 case ConstantExpressionKind.CONSTRUCTED: |
2851 return visitor.visitConstConstructorInvoke(node, constant, arg); | 2119 return visitor.visitConstConstructorInvoke(node, constant, arg); |
2852 case ConstantExpressionKind.BOOL_FROM_ENVIRONMENT: | 2120 case ConstantExpressionKind.BOOL_FROM_ENVIRONMENT: |
2853 return visitor.visitBoolFromEnvironmentConstructorInvoke( | 2121 return visitor.visitBoolFromEnvironmentConstructorInvoke( |
2854 node, constant, arg); | 2122 node, constant, arg); |
2855 case ConstantExpressionKind.INT_FROM_ENVIRONMENT: | 2123 case ConstantExpressionKind.INT_FROM_ENVIRONMENT: |
(...skipping 19 matching lines...) Expand all Loading... |
2875 ParameterStructure(this.definitions, this.node, this.parameter); | 2143 ParameterStructure(this.definitions, this.node, this.parameter); |
2876 | 2144 |
2877 /// Calls the matching visit method on [visitor] with [definitions] and [arg]. | 2145 /// Calls the matching visit method on [visitor] with [definitions] and [arg]. |
2878 R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg); | 2146 R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg); |
2879 } | 2147 } |
2880 | 2148 |
2881 /// The structure of a required parameter declaration. | 2149 /// The structure of a required parameter declaration. |
2882 class RequiredParameterStructure<R, A> extends ParameterStructure<R, A> { | 2150 class RequiredParameterStructure<R, A> extends ParameterStructure<R, A> { |
2883 final int index; | 2151 final int index; |
2884 | 2152 |
2885 RequiredParameterStructure( | 2153 RequiredParameterStructure(VariableDefinitions definitions, Node node, |
2886 VariableDefinitions definitions, | 2154 ParameterElement parameter, this.index) |
2887 Node node, | |
2888 ParameterElement parameter, | |
2889 this.index) | |
2890 : super(definitions, node, parameter); | 2155 : super(definitions, node, parameter); |
2891 | 2156 |
2892 @override | 2157 @override |
2893 R dispatch(SemanticDeclarationVisitor<R, A> visitor, | 2158 R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) { |
2894 A arg) { | |
2895 if (parameter.isInitializingFormal) { | 2159 if (parameter.isInitializingFormal) { |
2896 return visitor.visitInitializingFormalDeclaration( | 2160 return visitor.visitInitializingFormalDeclaration( |
2897 definitions, node, parameter, index, arg); | 2161 definitions, node, parameter, index, arg); |
2898 } else { | 2162 } else { |
2899 return visitor.visitParameterDeclaration( | 2163 return visitor.visitParameterDeclaration( |
2900 definitions, node, parameter, index, arg); | 2164 definitions, node, parameter, index, arg); |
2901 } | 2165 } |
2902 } | 2166 } |
2903 } | 2167 } |
2904 | 2168 |
2905 /// The structure of a optional positional parameter declaration. | 2169 /// The structure of a optional positional parameter declaration. |
2906 class OptionalParameterStructure<R, A> extends ParameterStructure<R, A> { | 2170 class OptionalParameterStructure<R, A> extends ParameterStructure<R, A> { |
2907 final ConstantExpression defaultValue; | 2171 final ConstantExpression defaultValue; |
2908 final int index; | 2172 final int index; |
2909 | 2173 |
2910 OptionalParameterStructure( | 2174 OptionalParameterStructure(VariableDefinitions definitions, Node node, |
2911 VariableDefinitions definitions, | 2175 ParameterElement parameter, this.defaultValue, this.index) |
2912 Node node, | 2176 : super(definitions, node, parameter); |
2913 ParameterElement parameter, | |
2914 this.defaultValue, | |
2915 this.index) | |
2916 : super(definitions, node, parameter); | |
2917 | 2177 |
2918 @override | 2178 @override |
2919 R dispatch(SemanticDeclarationVisitor<R, A> visitor, | 2179 R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) { |
2920 A arg) { | |
2921 if (parameter.isInitializingFormal) { | 2180 if (parameter.isInitializingFormal) { |
2922 return visitor.visitOptionalInitializingFormalDeclaration( | 2181 return visitor.visitOptionalInitializingFormalDeclaration( |
2923 definitions, node, parameter, defaultValue, index, arg); | 2182 definitions, node, parameter, defaultValue, index, arg); |
2924 } else { | 2183 } else { |
2925 return visitor.visitOptionalParameterDeclaration( | 2184 return visitor.visitOptionalParameterDeclaration( |
2926 definitions, node, parameter, defaultValue, index, arg); | 2185 definitions, node, parameter, defaultValue, index, arg); |
2927 } | 2186 } |
2928 } | 2187 } |
2929 } | 2188 } |
2930 | 2189 |
2931 /// The structure of a optional named parameter declaration. | 2190 /// The structure of a optional named parameter declaration. |
2932 class NamedParameterStructure<R, A> extends ParameterStructure<R, A> { | 2191 class NamedParameterStructure<R, A> extends ParameterStructure<R, A> { |
2933 final ConstantExpression defaultValue; | 2192 final ConstantExpression defaultValue; |
2934 | 2193 |
2935 NamedParameterStructure( | 2194 NamedParameterStructure(VariableDefinitions definitions, Node node, |
2936 VariableDefinitions definitions, | 2195 ParameterElement parameter, this.defaultValue) |
2937 Node node, | |
2938 ParameterElement parameter, | |
2939 this.defaultValue) | |
2940 : super(definitions, node, parameter); | 2196 : super(definitions, node, parameter); |
2941 | 2197 |
2942 @override | 2198 @override |
2943 R dispatch(SemanticDeclarationVisitor<R, A> visitor, | 2199 R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) { |
2944 A arg) { | |
2945 if (parameter.isInitializingFormal) { | 2200 if (parameter.isInitializingFormal) { |
2946 return visitor.visitNamedInitializingFormalDeclaration( | 2201 return visitor.visitNamedInitializingFormalDeclaration( |
2947 definitions, node, parameter, defaultValue, arg); | 2202 definitions, node, parameter, defaultValue, arg); |
2948 } else { | 2203 } else { |
2949 return visitor.visitNamedParameterDeclaration( | 2204 return visitor.visitNamedParameterDeclaration( |
2950 definitions, node, parameter, defaultValue, arg); | 2205 definitions, node, parameter, defaultValue, arg); |
2951 } | 2206 } |
2952 } | 2207 } |
2953 } | 2208 } |
2954 | 2209 |
2955 | |
2956 enum VariableKind { | 2210 enum VariableKind { |
2957 TOP_LEVEL_FIELD, | 2211 TOP_LEVEL_FIELD, |
2958 STATIC_FIELD, | 2212 STATIC_FIELD, |
2959 INSTANCE_FIELD, | 2213 INSTANCE_FIELD, |
2960 LOCAL_VARIABLE, | 2214 LOCAL_VARIABLE, |
2961 } | 2215 } |
2962 | 2216 |
2963 abstract class VariableStructure<R, A> { | 2217 abstract class VariableStructure<R, A> { |
2964 final VariableKind kind; | 2218 final VariableKind kind; |
2965 final Node node; | 2219 final Node node; |
2966 final VariableElement variable; | 2220 final VariableElement variable; |
2967 | 2221 |
2968 VariableStructure(this.kind, this.node, this.variable); | 2222 VariableStructure(this.kind, this.node, this.variable); |
2969 | 2223 |
2970 R dispatch(SemanticDeclarationVisitor<R, A> visitor, | 2224 R dispatch(SemanticDeclarationVisitor<R, A> visitor, |
2971 VariableDefinitions definitions, | 2225 VariableDefinitions definitions, A arg); |
2972 A arg); | |
2973 } | 2226 } |
2974 | 2227 |
2975 class NonConstantVariableStructure<R, A> | 2228 class NonConstantVariableStructure<R, A> extends VariableStructure<R, A> { |
2976 extends VariableStructure<R, A> { | |
2977 NonConstantVariableStructure( | 2229 NonConstantVariableStructure( |
2978 VariableKind kind, Node node, VariableElement variable) | 2230 VariableKind kind, Node node, VariableElement variable) |
2979 : super(kind, node, variable); | 2231 : super(kind, node, variable); |
2980 | 2232 |
2981 R dispatch(SemanticDeclarationVisitor<R, A> visitor, | 2233 R dispatch(SemanticDeclarationVisitor<R, A> visitor, |
2982 VariableDefinitions definitions, | 2234 VariableDefinitions definitions, A arg) { |
2983 A arg) { | |
2984 switch (kind) { | 2235 switch (kind) { |
2985 case VariableKind.TOP_LEVEL_FIELD: | 2236 case VariableKind.TOP_LEVEL_FIELD: |
2986 return visitor.visitTopLevelFieldDeclaration( | 2237 return visitor.visitTopLevelFieldDeclaration( |
2987 definitions, node, variable, variable.initializer, arg); | 2238 definitions, node, variable, variable.initializer, arg); |
2988 case VariableKind.STATIC_FIELD: | 2239 case VariableKind.STATIC_FIELD: |
2989 return visitor.visitStaticFieldDeclaration( | 2240 return visitor.visitStaticFieldDeclaration( |
2990 definitions, node, variable, variable.initializer, arg); | 2241 definitions, node, variable, variable.initializer, arg); |
2991 case VariableKind.INSTANCE_FIELD: | 2242 case VariableKind.INSTANCE_FIELD: |
2992 return visitor.visitInstanceFieldDeclaration( | 2243 return visitor.visitInstanceFieldDeclaration( |
2993 definitions, node, variable, variable.initializer, arg); | 2244 definitions, node, variable, variable.initializer, arg); |
2994 case VariableKind.LOCAL_VARIABLE: | 2245 case VariableKind.LOCAL_VARIABLE: |
2995 return visitor.visitLocalVariableDeclaration( | 2246 return visitor.visitLocalVariableDeclaration( |
2996 definitions, node, variable, variable.initializer, arg); | 2247 definitions, node, variable, variable.initializer, arg); |
2997 } | 2248 } |
2998 } | 2249 } |
2999 } | 2250 } |
3000 | 2251 |
3001 class ConstantVariableStructure<R, A> | 2252 class ConstantVariableStructure<R, A> extends VariableStructure<R, A> { |
3002 extends VariableStructure<R, A> { | |
3003 final ConstantExpression constant; | 2253 final ConstantExpression constant; |
3004 | 2254 |
3005 ConstantVariableStructure( | 2255 ConstantVariableStructure( |
3006 VariableKind kind, Node node, VariableElement variable, this.constant) | 2256 VariableKind kind, Node node, VariableElement variable, this.constant) |
3007 : super(kind, node, variable); | 2257 : super(kind, node, variable); |
3008 | 2258 |
3009 R dispatch(SemanticDeclarationVisitor<R, A> visitor, | 2259 R dispatch(SemanticDeclarationVisitor<R, A> visitor, |
3010 VariableDefinitions definitions, | 2260 VariableDefinitions definitions, A arg) { |
3011 A arg) { | |
3012 switch (kind) { | 2261 switch (kind) { |
3013 case VariableKind.TOP_LEVEL_FIELD: | 2262 case VariableKind.TOP_LEVEL_FIELD: |
3014 return visitor.visitTopLevelConstantDeclaration( | 2263 return visitor.visitTopLevelConstantDeclaration( |
3015 definitions, node, variable, constant, arg); | 2264 definitions, node, variable, constant, arg); |
3016 case VariableKind.STATIC_FIELD: | 2265 case VariableKind.STATIC_FIELD: |
3017 return visitor.visitStaticConstantDeclaration( | 2266 return visitor.visitStaticConstantDeclaration( |
3018 definitions, node, variable, constant, arg); | 2267 definitions, node, variable, constant, arg); |
3019 case VariableKind.LOCAL_VARIABLE: | 2268 case VariableKind.LOCAL_VARIABLE: |
3020 return visitor.visitLocalConstantDeclaration( | 2269 return visitor.visitLocalConstantDeclaration( |
3021 definitions, node, variable, constant, arg); | 2270 definitions, node, variable, constant, arg); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3092 ThisConstructorInvokeStructure( | 2341 ThisConstructorInvokeStructure( |
3093 this.node, this.constructor, this.callStructure); | 2342 this.node, this.constructor, this.callStructure); |
3094 | 2343 |
3095 R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) { | 2344 R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) { |
3096 return visitor.visitThisConstructorInvoke( | 2345 return visitor.visitThisConstructorInvoke( |
3097 node, constructor, node.argumentsNode, callStructure, arg); | 2346 node, constructor, node.argumentsNode, callStructure, arg); |
3098 } | 2347 } |
3099 | 2348 |
3100 bool get isConstructorInvoke => true; | 2349 bool get isConstructorInvoke => true; |
3101 } | 2350 } |
OLD | NEW |