Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: lib/unresolved.dart

Issue 2117513002: More extensive error handling for 'unresolved' cases. (Closed) Base URL: git@github.com:dart-lang/rasta.git@master
Patch Set: Merge and update test expectations Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/kernel_visitor.dart ('k') | submodules.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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.md file. 3 // BSD-style license that can be found in the LICENSE.md file.
4 4
5 library rasta.unresolved; 5 library rasta.unresolved;
6 6
7 import 'package:kernel/ast.dart' as ir; 7 import 'package:kernel/ast.dart' as ir;
8 8
9 import 'accessors.dart';
10
9 import "package:compiler/src/resolution/operators.dart" show 11 import "package:compiler/src/resolution/operators.dart" show
10 AssignmentOperator, 12 AssignmentOperator,
11 BinaryOperator, 13 BinaryOperator,
12 IncDecOperator, 14 IncDecOperator,
13 UnaryOperator; 15 UnaryOperator;
14 16
15 import "package:compiler/src/universe/call_structure.dart" show 17 import "package:compiler/src/universe/call_structure.dart" show
16 CallStructure; 18 CallStructure;
17 19
18 import "package:compiler/src/elements/elements.dart" show 20 import "package:compiler/src/elements/elements.dart" show
19 AstElement, 21 AstElement,
20 ConstructorElement, 22 ConstructorElement,
21 Element, 23 Element,
22 ErroneousElement, 24 ErroneousElement,
23 FunctionElement, 25 FunctionElement,
24 MethodElement; 26 MethodElement;
25 27
26 import "package:compiler/src/dart_types.dart" show 28 import "package:compiler/src/dart_types.dart" show
27 DartType, 29 DartType,
28 InterfaceType; 30 InterfaceType;
29 31
30 import "package:compiler/src/tree/tree.dart" show 32 import "package:compiler/src/tree/tree.dart" show
33 Expression,
31 NewExpression, 34 NewExpression,
32 Node, 35 Node,
33 NodeList, 36 NodeList,
34 Send; 37 Send;
35 38
36 import "package:compiler/src/universe/selector.dart" show 39 import "package:compiler/src/universe/selector.dart" show
37 Selector; 40 Selector;
38 41
39 import "kernel.dart" show 42 import "kernel.dart" show
40 Kernel; 43 Kernel;
41 44
42 ir.Arguments buildStringArgument(String argument) {
43 return new ir.Arguments(<ir.Expression>[new ir.StringLiteral(argument)]);
44 }
45
46 ir.Arguments buildIntArgument(int argument) {
47 return new ir.Arguments(<ir.Expression>[new ir.IntLiteral(argument)]);
48 }
49
50 abstract class RastaUnresolved { 45 abstract class RastaUnresolved {
51 Kernel get kernel; 46 Kernel get kernel;
52 47
53 // Implemented in KernelVisitor 48 // Implemented in KernelVisitor
54 AstElement get currentElement; 49 AstElement get currentElement;
50 bool get isVoidContext;
55 ir.Arguments buildArguments(NodeList arguments); 51 ir.Arguments buildArguments(NodeList arguments);
52 ir.TreeNode visitForValue(Expression node);
56 53
57 // TODO(ahe): Delete this method. 54 // TODO(ahe): Delete this method.
58 ir.InvalidExpression handleUnresolved(Node node); 55 ir.InvalidExpression handleUnresolved(Node node);
59 56
60 /// Throws a [NoSuchMethodError] corresponding to a call to 57 /// Throws a [NoSuchMethodError] corresponding to a call to
61 /// [receiver].[memberName] with the arguments [callArguments]. 58 /// [receiver].[memberName] with the arguments [callArguments].
62 /// 59 ///
63 /// The exception object is built by calling [exceptionBuilder]. This should 60 /// The exception object is built by calling [exceptionBuilder]. This should
64 /// take the same arguments as the default constructor to [NoSuchMethodError], 61 /// take the same arguments as the default constructor to [NoSuchMethodError],
65 /// but the method itself may encode additional details about the call than 62 /// but the method itself may encode additional details about the call than
(...skipping 29 matching lines...) Expand all
95 exceptionBuilder, 92 exceptionBuilder,
96 new ir.Arguments(<ir.Expression>[ 93 new ir.Arguments(<ir.Expression>[
97 receiver, 94 receiver,
98 memberNameArg, 95 memberNameArg,
99 positional, 96 positional,
100 named, 97 named,
101 existingArguments 98 existingArguments
102 ]))); 99 ])));
103 } 100 }
104 101
102 /// Throws a NoSuchMethodError for an unresolved getter named [name].
103 ir.Expression buildThrowUnresolvedGetter(
104 String name,
105 [ir.Procedure exceptionBuilder]) {
106 // TODO(asgerf): We should remove this fallback, but in some cases we do
107 // not get sufficient information to determine exactly what kind of
108 // getter it is.
109 exceptionBuilder ??= kernel.getGenericNoSuchMethodBuilder();
110 return buildThrowNoSuchMethodError(
111 exceptionBuilder,
112 new ir.NullLiteral(),
113 name,
114 new ir.Arguments.empty());
115 }
116
117 ir.Expression buildThrowUnresolvedSetter(
118 String name,
119 ir.Expression argument,
120 [ir.Procedure exceptionBuilder]) {
121 // TODO(asgerf): We should remove this fallback, but in some cases we do
122 // not get sufficient information to determine exactly what kind of
123 // setter it is.
124 exceptionBuilder ??= kernel.getGenericNoSuchMethodBuilder();
125 return buildThrowNoSuchMethodError(
126 exceptionBuilder,
127 new ir.NullLiteral(),
128 name,
129 new ir.Arguments(<ir.Expression>[argument]));
130 }
131
132 ir.Expression buildThrowUnresolvedSuperGetter(String name) {
133 return buildThrowNoSuchMethodError(
134 kernel.getUnresolvedSuperGetterBuilder(),
135 new ir.ThisExpression(),
136 name,
137 new ir.Arguments.empty());
138 }
139
140 ir.Expression buildThrowUnresolvedSuperSetter(
141 String name,
142 ir.Expression argument) {
143 return buildThrowNoSuchMethodError(
144 kernel.getUnresolvedSuperSetterBuilder(),
145 new ir.ThisExpression(),
146 name,
147 new ir.Arguments(<ir.Expression>[argument]));
148 }
149
105 ir.Expression buildThrowSingleArgumentError( 150 ir.Expression buildThrowSingleArgumentError(
106 ir.Procedure exceptionBuilder, String errorMessage) { 151 ir.Procedure exceptionBuilder,
152 String errorMessage) {
107 return new ir.Throw(new ir.StaticInvocation(exceptionBuilder, 153 return new ir.Throw(new ir.StaticInvocation(exceptionBuilder,
108 new ir.Arguments(<ir.Expression>[new ir.StringLiteral(errorMessage)]))); 154 new ir.Arguments(<ir.Expression>[new ir.StringLiteral(errorMessage)])));
109 } 155 }
110 156
111 ir.Expression visitUnresolvedClassConstructorInvoke( 157 ir.Expression visitUnresolvedClassConstructorInvoke(
112 NewExpression node, 158 NewExpression node,
113 ErroneousElement element, 159 ErroneousElement element,
114 DartType type, 160 DartType type,
115 NodeList arguments, 161 NodeList arguments,
116 Selector selector, 162 Selector selector,
(...skipping 16 matching lines...) Expand all
133 ? '${node.send.selector}' 179 ? '${node.send.selector}'
134 : type.name; 180 : type.name;
135 return buildThrowNoSuchMethodError( 181 return buildThrowNoSuchMethodError(
136 kernel.getUnresolvedConstructorBuilder(), 182 kernel.getUnresolvedConstructorBuilder(),
137 receiver, 183 receiver,
138 methodName, 184 methodName,
139 buildArguments(arguments), 185 buildArguments(arguments),
140 constructor); 186 constructor);
141 } 187 }
142 188
143 ir.InvalidExpression visitUnresolvedCompound( 189 ir.Expression visitUnresolvedCompound(
144 Send node, 190 Send node,
145 Element element, 191 Element element,
146 AssignmentOperator operator, 192 AssignmentOperator operator,
147 Node rhs, 193 Node rhs,
148 _) { 194 _) {
149 return handleUnresolved(node); 195 return buildThrowUnresolvedGetter('${node.selector}');
150 } 196 }
151 197
152 ir.InvalidExpression visitUnresolvedGet( 198 ir.Expression visitUnresolvedGet(
153 Send node, 199 Send node,
154 Element element, 200 Element element,
155 _) { 201 _) {
156 return handleUnresolved(node); 202 return buildThrowUnresolvedGetter('${node.selector}');
157 } 203 }
158 204
159 ir.InvalidExpression visitUnresolvedInvoke( 205 ir.Expression visitUnresolvedInvoke(
160 Send node, 206 Send node,
161 Element element, 207 Element element,
162 NodeList arguments, 208 NodeList arguments,
163 Selector selector, 209 Selector selector,
164 _) { 210 _) {
165 return handleUnresolved(node); 211 // TODO(asgerf): Should we use a type literal as receiver for unresolved
166 } 212 // static invocations?
167 213 return buildThrowNoSuchMethodError(
168 ir.InvalidExpression visitUnresolvedPostfix( 214 kernel.getGenericNoSuchMethodBuilder(),
169 Send node, 215 new ir.NullLiteral(),
170 Element element, 216 element.name,
171 IncDecOperator operator, 217 buildArguments(arguments),
172 _) { 218 element);
173 return handleUnresolved(node); 219 }
174 } 220
175 221 ir.Expression visitUnresolvedPostfix(
176 ir.InvalidExpression visitUnresolvedPrefix( 222 Send node,
177 Send node, 223 Element element,
178 Element element, 224 IncDecOperator operator,
179 IncDecOperator operator, 225 _) {
180 _) { 226 return buildThrowUnresolvedGetter('${node.selector}');
181 return handleUnresolved(node); 227 }
182 } 228
183 229 ir.Expression visitUnresolvedPrefix(
184 ir.InvalidExpression visitUnresolvedRedirectingFactoryConstructorInvoke( 230 Send node,
231 Element element,
232 IncDecOperator operator,
233 _) {
234 return buildThrowUnresolvedGetter('${node.selector}');
235 }
236
237 ir.Expression visitUnresolvedRedirectingFactoryConstructorInvoke(
185 NewExpression node, 238 NewExpression node,
186 ConstructorElement constructor, 239 ConstructorElement constructor,
187 InterfaceType type, 240 InterfaceType type,
188 NodeList arguments, 241 NodeList arguments,
189 CallStructure callStructure, 242 CallStructure callStructure,
190 _) { 243 _) {
191 return handleUnresolved(node); 244 // The body of the factory will throw an error.
192 } 245 return new ir.StaticInvocation(kernel.functionToIr(constructor),
193 246 buildArguments(arguments));
194 ir.InvalidExpression visitUnresolvedSet( 247 }
195 Send node, 248
196 Element element, 249 ir.Expression visitUnresolvedSet(
197 Node rhs, 250 Send node,
198 _) { 251 Element element,
199 return handleUnresolved(node); 252 Node rhs,
200 } 253 _) {
201 254 return buildThrowUnresolvedSetter('${node.selector}', visitForValue(rhs));
202 ir.InvalidExpression visitUnresolvedSetIfNull( 255 }
203 Send node, 256
204 Element element, 257 ir.Expression visitUnresolvedSetIfNull(
205 Node rhs, 258 Send node,
206 _) { 259 Element element,
207 return handleUnresolved(node); 260 Node rhs,
208 } 261 _) {
209 262 return buildThrowUnresolvedGetter('${node.selector}');
210 ir.InvalidExpression visitUnresolvedStaticGetterCompound( 263 }
211 Send node, 264
212 Element element, 265 ir.Expression visitUnresolvedStaticGetterCompound(
213 MethodElement setter, 266 Send node,
214 AssignmentOperator operator, 267 Element element,
215 Node rhs, 268 MethodElement setter,
216 _) { 269 AssignmentOperator operator,
217 return handleUnresolved(node); 270 Node rhs,
218 } 271 _) {
219 272 return buildThrowUnresolvedGetter('${node.selector}',
220 ir.InvalidExpression visitUnresolvedStaticGetterPostfix( 273 kernel.getUnresolvedStaticGetterBuilder());
221 Send node, 274 }
222 Element element, 275
223 MethodElement setter, 276 ir.Expression visitUnresolvedStaticGetterPostfix(
224 IncDecOperator operator, 277 Send node,
225 _) { 278 Element element,
226 return handleUnresolved(node); 279 MethodElement setter,
227 } 280 IncDecOperator operator,
228 281 _) {
229 ir.InvalidExpression visitUnresolvedStaticGetterPrefix( 282 return buildThrowUnresolvedGetter('${node.selector}',
230 Send node, 283 kernel.getUnresolvedStaticGetterBuilder());
231 Element element, 284 }
232 MethodElement setter, 285
233 IncDecOperator operator, 286 ir.Expression visitUnresolvedStaticGetterPrefix(
234 _) { 287 Send node,
235 return handleUnresolved(node); 288 Element element,
236 } 289 MethodElement setter,
237 290 IncDecOperator operator,
238 ir.InvalidExpression visitUnresolvedStaticGetterSetIfNull( 291 _) {
239 Send node, 292 return buildThrowUnresolvedGetter('${node.selector}',
240 Element element, 293 kernel.getUnresolvedStaticGetterBuilder());
241 MethodElement setter, 294 }
242 Node rhs, 295
243 _) { 296 ir.Expression visitUnresolvedStaticGetterSetIfNull(
244 return handleUnresolved(node); 297 Send node,
245 } 298 Element element,
246 299 MethodElement setter,
247 ir.InvalidExpression visitUnresolvedStaticSetterCompound( 300 Node rhs,
248 Send node, 301 _) {
249 MethodElement getter, 302 return buildThrowUnresolvedGetter('${node.selector}',
250 Element element, 303 kernel.getUnresolvedStaticGetterBuilder());
251 AssignmentOperator operator, 304 }
252 Node rhs, 305
253 _) { 306 ir.Expression visitUnresolvedStaticSetterCompound(
254 return handleUnresolved(node); 307 Send node,
255 } 308 MethodElement getter,
256 309 Element element,
257 ir.InvalidExpression visitUnresolvedStaticSetterPostfix( 310 AssignmentOperator operator,
258 Send node, 311 Node rhs,
259 MethodElement getter, 312 _) {
260 Element element, 313 return buildThrowUnresolvedSetter('${node.selector}',
261 IncDecOperator operator, 314 visitForValue(rhs),
262 _) { 315 kernel.getUnresolvedStaticSetterBuilder());
263 return handleUnresolved(node); 316 }
264 } 317
265 318 ir.Expression visitUnresolvedStaticSetterPostfix(
266 ir.InvalidExpression visitUnresolvedStaticSetterPrefix( 319 Send node,
267 Send node, 320 MethodElement getter,
268 MethodElement getter, 321 Element element,
269 Element element, 322 IncDecOperator operator,
270 IncDecOperator operator, 323 _) {
271 _) { 324 var accessor = new ClassStaticAccessor(this, getter.name,
272 return handleUnresolved(node); 325 kernel.functionToIr(getter), null);
273 } 326 return accessor.buildPostfixIncrement(
274 327 new ir.Name(operator.selectorName),
275 ir.InvalidExpression visitUnresolvedStaticSetterSetIfNull( 328 voidContext: isVoidContext);
276 Send node, 329 }
277 MethodElement getter, 330
278 Element element, 331 ir.Expression visitUnresolvedStaticSetterPrefix(
279 Node rhs, 332 Send node,
280 _) { 333 MethodElement getter,
281 return handleUnresolved(node); 334 Element element,
282 } 335 IncDecOperator operator,
283 336 _) {
284 ir.InvalidExpression visitUnresolvedSuperBinary( 337 var accessor = new ClassStaticAccessor(this, getter.name,
338 kernel.functionToIr(getter), null);
339 return accessor.buildPrefixIncrement(
340 new ir.Name(operator.selectorName),
341 voidContext: isVoidContext);
342 }
343
344 ir.Expression visitUnresolvedStaticSetterSetIfNull(
345 Send node,
346 MethodElement getter,
347 Element element,
348 Node rhs,
349 _) {
350 var accessor = new ClassStaticAccessor(this, getter.name,
351 kernel.functionToIr(getter), null);
352 return accessor.buildNullAwareAssignment(
353 visitForValue(rhs), voidContext: isVoidContext);
354 }
355
356 ir.Expression visitUnresolvedSuperBinary(
285 Send node, 357 Send node,
286 Element element, 358 Element element,
287 BinaryOperator operator, 359 BinaryOperator operator,
288 Node argument, 360 Node argument,
289 _) { 361 _) {
290 return handleUnresolved(node); 362 return buildThrowNoSuchMethodError(
291 } 363 kernel.getUnresolvedSuperMethodBuilder(),
292 364 new ir.ThisExpression(),
293 ir.InvalidExpression visitUnresolvedSuperCompound( 365 operator.selectorName,
294 Send node, 366 new ir.Arguments(<ir.Expression>[visitForValue(argument)]));
295 Element element, 367 }
296 AssignmentOperator operator, 368
297 Node rhs, 369 ir.Expression visitUnresolvedSuperCompound(
298 _) { 370 Send node,
299 return handleUnresolved(node); 371 Element element,
300 } 372 AssignmentOperator operator,
301 373 Node rhs,
302 ir.InvalidExpression visitUnresolvedSuperCompoundIndexSet( 374 _) {
375 return buildThrowUnresolvedSuperGetter('${node.selector}');
376 }
377
378 ir.Expression visitUnresolvedSuperCompoundIndexSet(
303 Send node, 379 Send node,
304 Element element, 380 Element element,
305 Node index, 381 Node index,
306 AssignmentOperator operator, 382 AssignmentOperator operator,
307 Node rhs, 383 Node rhs,
308 _) { 384 _) {
309 return handleUnresolved(node); 385 var accessor = new SuperIndexAccessor(this, visitForValue(index),
310 } 386 kernel.functionToIr(element), null);
311 387 return accessor.buildCompoundAssignment(new ir.Name(operator.selectorName),
312 ir.InvalidExpression visitUnresolvedSuperGet( 388 visitForValue(rhs));
313 Send node, 389 }
314 Element element, 390
315 _) { 391 ir.Expression visitUnresolvedSuperGet(
316 return handleUnresolved(node); 392 Send node,
317 } 393 Element element,
318 394 _) {
319 ir.InvalidExpression visitUnresolvedSuperGetterCompound( 395 return buildThrowUnresolvedSuperGetter('${node.selector}');
320 Send node, 396 }
321 Element element, 397
322 MethodElement setter, 398 ir.Expression visitUnresolvedSuperGetterCompound(
323 AssignmentOperator operator, 399 Send node,
324 Node rhs, 400 Element element,
325 _) { 401 MethodElement setter,
326 return handleUnresolved(node); 402 AssignmentOperator operator,
327 } 403 Node rhs,
328 404 _) {
329 ir.InvalidExpression visitUnresolvedSuperGetterCompoundIndexSet( 405 return buildThrowUnresolvedSuperGetter('${node.selector}');
330 Send node, 406 }
331 Element element, 407
332 MethodElement setter, 408 ir.Expression visitUnresolvedSuperGetterCompoundIndexSet(
409 Send node,
410 Element element,
411 MethodElement setter,
333 Node index, 412 Node index,
334 AssignmentOperator operator, 413 AssignmentOperator operator,
335 Node rhs, 414 Node rhs,
336 _) { 415 _) {
337 return handleUnresolved(node); 416 return buildThrowUnresolvedSuperGetter('${node.selector}');
338 } 417 }
339 418
340 ir.InvalidExpression visitUnresolvedSuperGetterIndexPostfix( 419 ir.Expression visitUnresolvedSuperGetterIndexPostfix(
341 Send node, 420 Send node,
342 Element element, 421 Element element,
343 MethodElement setter, 422 MethodElement setter,
344 Node index, 423 Node index,
345 IncDecOperator operator, 424 IncDecOperator operator,
346 _) { 425 _) {
347 return handleUnresolved(node); 426 return buildThrowUnresolvedSuperGetter('${node.selector}');
348 } 427 }
349 428
350 ir.InvalidExpression visitUnresolvedSuperGetterIndexPrefix( 429 ir.Expression visitUnresolvedSuperGetterIndexPrefix(
351 Send node, 430 Send node,
352 Element element, 431 Element element,
353 MethodElement setter, 432 MethodElement setter,
354 Node index, 433 Node index,
355 IncDecOperator operator, 434 IncDecOperator operator,
356 _) { 435 _) {
357 return handleUnresolved(node); 436 return buildThrowUnresolvedSuperGetter('${node.selector}');
358 } 437 }
359 438
360 ir.InvalidExpression visitUnresolvedSuperGetterPostfix( 439 ir.Expression visitUnresolvedSuperGetterPostfix(
361 Send node, 440 Send node,
362 Element element, 441 Element element,
363 MethodElement setter, 442 MethodElement setter,
364 IncDecOperator operator, 443 IncDecOperator operator,
365 _) { 444 _) {
366 return handleUnresolved(node); 445 return buildThrowUnresolvedSuperGetter('${node.selector}');
367 } 446 }
368 447
369 ir.InvalidExpression visitUnresolvedSuperGetterPrefix( 448 ir.Expression visitUnresolvedSuperGetterPrefix(
370 Send node, 449 Send node,
371 Element element, 450 Element element,
372 MethodElement setter, 451 MethodElement setter,
373 IncDecOperator operator, 452 IncDecOperator operator,
374 _) { 453 _) {
375 return handleUnresolved(node); 454 return buildThrowUnresolvedSuperGetter('${node.selector}');
376 } 455 }
377 456
378 ir.InvalidExpression visitUnresolvedSuperGetterSetIfNull( 457 ir.Expression visitUnresolvedSuperGetterSetIfNull(
379 Send node, 458 Send node,
380 Element element, 459 Element element,
381 MethodElement setter, 460 MethodElement setter,
382 Node rhs, 461 Node rhs,
383 _) { 462 _) {
384 return handleUnresolved(node); 463 return buildThrowUnresolvedSuperGetter('${node.selector}');
385 } 464 }
386 465
387 ir.InvalidExpression visitUnresolvedSuperIndex( 466 ir.Expression visitUnresolvedSuperIndex(
388 Send node, 467 Send node,
389 Element element, 468 Element element,
390 Node index, 469 Node index,
391 _) { 470 _) {
392 return handleUnresolved(node); 471 return new SuperIndexAccessor(this, visitForValue(index), null, null)
472 .buildSimpleRead();
393 } 473 }
394 474
395 ir.InvalidExpression visitUnresolvedSuperIndexPostfix( 475 ir.Expression visitUnresolvedSuperIndexPostfix(
396 Send node, 476 Send node,
397 Element element, 477 Element element,
398 Node index, 478 Node index,
399 IncDecOperator operator, 479 IncDecOperator operator,
400 _) { 480 _) {
401 return handleUnresolved(node); 481 return new SuperIndexAccessor(this, visitForValue(index), null, null)
482 .buildSimpleRead();
402 } 483 }
403 484
404 ir.InvalidExpression visitUnresolvedSuperIndexPrefix( 485 ir.Expression visitUnresolvedSuperIndexPrefix(
405 Send node, 486 Send node,
406 Element element, 487 Element element,
407 Node index, 488 Node index,
408 IncDecOperator operator, 489 IncDecOperator operator,
409 _) { 490 _) {
410 return handleUnresolved(node); 491 return new SuperIndexAccessor(this, visitForValue(index), null, null)
492 .buildSimpleRead();
411 } 493 }
412 494
413 ir.InvalidExpression visitUnresolvedSuperIndexSet( 495 ir.Expression visitUnresolvedSuperIndexSet(
414 Send node, 496 Send node,
415 Element element, 497 Element element,
416 Node index, 498 Node index,
417 Node rhs, 499 Node rhs,
418 _) { 500 _) {
419 return handleUnresolved(node); 501 return new SuperIndexAccessor(this, visitForValue(index), null, null)
502 .buildAssignment(visitForValue(rhs));
420 } 503 }
421 504
422 ir.InvalidExpression visitUnresolvedSuperInvoke( 505 ir.Expression visitUnresolvedSuperInvoke(
423 Send node, 506 Send node,
424 Element element, 507 Element element,
425 NodeList arguments, 508 NodeList arguments,
426 Selector selector, 509 Selector selector,
427 _) { 510 _) {
428 return handleUnresolved(node); 511 // TODO(asgerf): Should really invoke 'super.noSuchMethod'.
512 return buildThrowNoSuchMethodError(
513 kernel.getUnresolvedSuperMethodBuilder(),
514 new ir.ThisExpression(),
515 '${node.selector}',
516 buildArguments(arguments));
429 } 517 }
430 518
431 ir.InvalidExpression visitUnresolvedSuperPostfix( 519 ir.Expression visitUnresolvedSuperPostfix(
432 Send node, 520 Send node,
433 Element element, 521 Element element,
434 IncDecOperator operator, 522 IncDecOperator operator,
435 _) { 523 _) {
436 return handleUnresolved(node); 524 return buildThrowUnresolvedSuperGetter('${node.selector}');
437 } 525 }
438 526
439 ir.InvalidExpression visitUnresolvedSuperPrefix( 527 ir.Expression visitUnresolvedSuperPrefix(
440 Send node, 528 Send node,
441 Element element, 529 Element element,
442 IncDecOperator operator, 530 IncDecOperator operator,
443 _) { 531 _) {
444 return handleUnresolved(node); 532 return buildThrowUnresolvedSuperGetter('${node.selector}');
445 } 533 }
446 534
447 ir.InvalidExpression visitUnresolvedSuperSetIfNull( 535 ir.Expression visitUnresolvedSuperSetIfNull(
448 Send node, 536 Send node,
449 Element element, 537 Element element,
450 Node rhs, 538 Node rhs,
451 _) { 539 _) {
452 return handleUnresolved(node); 540 return buildThrowUnresolvedSuperGetter('${node.selector}');
453 } 541 }
454 542
455 ir.InvalidExpression visitUnresolvedSuperSetterCompound( 543 ir.Expression visitUnresolvedSuperSetterCompound(
456 Send node, 544 Send node,
457 MethodElement getter, 545 MethodElement getter,
458 Element element, 546 Element element,
459 AssignmentOperator operator, 547 AssignmentOperator operator,
460 Node rhs, 548 Node rhs,
461 _) { 549 _) {
462 return handleUnresolved(node); 550 var accessor = new SuperPropertyAccessor(this, '${node.selector}',
551 kernel.functionToIr(getter), null);
552 return accessor.buildCompoundAssignment(
553 new ir.Name(operator.selectorName),
554 visitForValue(rhs));
463 } 555 }
464 556
465 ir.InvalidExpression visitUnresolvedSuperSetterCompoundIndexSet( 557 ir.Expression visitUnresolvedSuperSetterCompoundIndexSet(
466 Send node, 558 Send node,
467 MethodElement getter, 559 MethodElement getter,
468 Element element, 560 Element element,
469 Node index, 561 Node index,
470 AssignmentOperator operator, 562 AssignmentOperator operator,
471 Node rhs, 563 Node rhs,
472 _) { 564 _) {
473 return handleUnresolved(node); 565 var accessor = new SuperIndexAccessor(this, visitForValue(index),
474 } 566 kernel.functionToIr(getter), null);
475 567 return accessor.buildCompoundAssignment(
476 ir.InvalidExpression visitUnresolvedSuperSetterIndexPostfix( 568 new ir.Name(operator.selectorName),
569 visitForValue(rhs));
570 }
571
572 ir.Expression visitUnresolvedSuperSetterIndexPostfix(
477 Send node, 573 Send node,
478 MethodElement indexFunction, 574 MethodElement indexFunction,
479 Element element, 575 Element element,
480 Node index, 576 Node index,
481 IncDecOperator operator, 577 IncDecOperator operator,
482 _) { 578 _) {
483 return handleUnresolved(node); 579 var accessor = new SuperIndexAccessor(this, visitForValue(index),
484 } 580 kernel.functionToIr(indexFunction), null);
485 581 return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName));
486 ir.InvalidExpression visitUnresolvedSuperSetterIndexPrefix( 582 }
583
584 ir.Expression visitUnresolvedSuperSetterIndexPrefix(
487 Send node, 585 Send node,
488 MethodElement indexFunction, 586 MethodElement indexFunction,
489 Element element, 587 Element element,
490 Node index, 588 Node index,
491 IncDecOperator operator, 589 IncDecOperator operator,
492 _) { 590 _) {
493 return handleUnresolved(node); 591 var accessor = new SuperIndexAccessor(this, visitForValue(index),
494 } 592 kernel.functionToIr(indexFunction), null);
495 593 return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName));
496 ir.InvalidExpression visitUnresolvedSuperSetterPostfix( 594 }
497 Send node, 595
498 MethodElement getter, 596 ir.Expression visitUnresolvedSuperSetterPostfix(
499 Element element, 597 Send node,
500 IncDecOperator operator, 598 MethodElement getter,
501 _) { 599 Element element,
502 return handleUnresolved(node); 600 IncDecOperator operator,
503 } 601 _) {
504 602 var accessor = new SuperPropertyAccessor(this, '${node.selector}',
505 ir.InvalidExpression visitUnresolvedSuperSetterPrefix( 603 kernel.functionToIr(getter), null);
506 Send node, 604 return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName));
507 MethodElement getter, 605 }
508 Element element, 606
509 IncDecOperator operator, 607 ir.Expression visitUnresolvedSuperSetterPrefix(
510 _) { 608 Send node,
511 return handleUnresolved(node); 609 MethodElement getter,
512 } 610 Element element,
513 611 IncDecOperator operator,
514 ir.InvalidExpression visitUnresolvedSuperSetterSetIfNull( 612 _) {
515 Send node, 613 var accessor = new SuperPropertyAccessor(this, '${node.selector}',
516 MethodElement getter, 614 kernel.functionToIr(getter), null);
517 Element element, 615 return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName));
518 Node rhs, 616 }
519 _) { 617
520 return handleUnresolved(node); 618 ir.Expression visitUnresolvedSuperSetterSetIfNull(
521 } 619 Send node,
522 620 MethodElement getter,
523 ir.InvalidExpression visitUnresolvedSuperUnary( 621 Element element,
622 Node rhs,
623 _) {
624 var accessor = new SuperPropertyAccessor(this, '${node.selector}',
625 kernel.functionToIr(getter), null);
626 return accessor.buildNullAwareAssignment(visitForValue(rhs));
627 }
628
629 ir.Expression visitUnresolvedSuperUnary(
524 Send node, 630 Send node,
525 UnaryOperator operator, 631 UnaryOperator operator,
526 Element element, 632 Element element,
527 _) { 633 _) {
528 return handleUnresolved(node); 634 // TODO(asgerf): Should really call 'super.noSuchMethod'.
529 } 635 return buildThrowNoSuchMethodError(
530 636 kernel.getUnresolvedSuperMethodBuilder(),
531 ir.InvalidExpression visitUnresolvedTopLevelGetterCompound( 637 new ir.ThisExpression(),
638 operator.selectorName,
639 new ir.Arguments.empty());
640 }
641
642 ir.Expression visitUnresolvedTopLevelGetterCompound(
532 Send node, 643 Send node,
533 Element element, 644 Element element,
534 MethodElement setter, 645 MethodElement setter,
535 AssignmentOperator operator, 646 AssignmentOperator operator,
536 Node rhs, 647 Node rhs,
537 _) { 648 _) {
538 return handleUnresolved(node); 649 return buildThrowUnresolvedGetter('${node.selector}',
539 } 650 kernel.getUnresolvedTopLevelGetterBuilder());
540 651 }
541 ir.InvalidExpression visitUnresolvedTopLevelGetterPostfix( 652
542 Send node, 653 ir.Expression visitUnresolvedTopLevelGetterPostfix(
543 Element element, 654 Send node,
544 MethodElement setter, 655 Element element,
545 IncDecOperator operator, 656 MethodElement setter,
546 _) { 657 IncDecOperator operator,
547 return handleUnresolved(node); 658 _) {
548 } 659 return buildThrowUnresolvedGetter('${node.selector}',
549 660 kernel.getUnresolvedTopLevelGetterBuilder());
550 ir.InvalidExpression visitUnresolvedTopLevelGetterPrefix( 661 }
551 Send node, 662
552 Element element, 663 ir.Expression visitUnresolvedTopLevelGetterPrefix(
553 MethodElement setter, 664 Send node,
554 IncDecOperator operator, 665 Element element,
555 _) { 666 MethodElement setter,
556 return handleUnresolved(node); 667 IncDecOperator operator,
557 } 668 _) {
558 669 return buildThrowUnresolvedGetter('${node.selector}',
559 ir.InvalidExpression visitUnresolvedTopLevelGetterSetIfNull( 670 kernel.getUnresolvedTopLevelGetterBuilder());
560 Send node, 671 }
561 Element element, 672
562 MethodElement setter, 673 ir.Expression visitUnresolvedTopLevelGetterSetIfNull(
563 Node rhs, 674 Send node,
564 _) { 675 Element element,
565 return handleUnresolved(node); 676 MethodElement setter,
566 } 677 Node rhs,
567 678 _) {
568 ir.InvalidExpression visitUnresolvedTopLevelSetterCompound( 679 return buildThrowUnresolvedGetter('${node.selector}',
680 kernel.getUnresolvedTopLevelGetterBuilder());
681 }
682
683 ir.Expression visitUnresolvedTopLevelSetterCompound(
569 Send node, 684 Send node,
570 MethodElement getter, 685 MethodElement getter,
571 Element element, 686 Element element,
572 AssignmentOperator operator, 687 AssignmentOperator operator,
573 Node rhs, 688 Node rhs,
574 _) { 689 _) {
575 return handleUnresolved(node); 690 var accessor = new TopLevelStaticAccessor(this, getter.name,
576 } 691 kernel.functionToIr(getter), null);
577 692 return accessor.buildCompoundAssignment(
578 ir.InvalidExpression visitUnresolvedTopLevelSetterPostfix( 693 new ir.Name(operator.selectorName),
579 Send node, 694 visitForValue(rhs),
580 MethodElement getter, 695 voidContext: isVoidContext);
581 Element element, 696 }
582 IncDecOperator operator, 697
583 _) { 698 ir.Expression visitUnresolvedTopLevelSetterPostfix(
584 return handleUnresolved(node); 699 Send node,
585 } 700 MethodElement getter,
586 701 Element element,
587 ir.InvalidExpression visitUnresolvedTopLevelSetterPrefix( 702 IncDecOperator operator,
588 Send node, 703 _) {
589 MethodElement getter, 704 var accessor = new TopLevelStaticAccessor(this, getter.name,
590 Element element, 705 kernel.functionToIr(getter), null);
591 IncDecOperator operator, 706 return accessor.buildPostfixIncrement(
592 _) { 707 new ir.Name(operator.selectorName),
593 return handleUnresolved(node); 708 voidContext: isVoidContext);
594 } 709 }
595 710
596 ir.InvalidExpression visitUnresolvedTopLevelSetterSetIfNull( 711 ir.Expression visitUnresolvedTopLevelSetterPrefix(
597 Send node, 712 Send node,
598 MethodElement getter, 713 MethodElement getter,
599 Element element, 714 Element element,
600 Node rhs, 715 IncDecOperator operator,
601 _) { 716 _) {
602 return handleUnresolved(node); 717 var accessor = new TopLevelStaticAccessor(this, getter.name,
603 } 718 kernel.functionToIr(getter), null);
604 719 return accessor.buildPrefixIncrement(
605 ir.InvalidExpression visitUnresolvedSuperGetterIndexSetIfNull( 720 new ir.Name(operator.selectorName),
606 Send node, 721 voidContext: isVoidContext);
607 Element element, 722 }
608 MethodElement setter, 723
609 Node index, 724 ir.Expression visitUnresolvedTopLevelSetterSetIfNull(
610 Node rhs, 725 Send node,
611 _) { 726 MethodElement getter,
612 return handleUnresolved(node); 727 Element element,
613 } 728 Node rhs,
614 729 _) {
615 ir.InvalidExpression visitUnresolvedSuperSetterIndexSetIfNull( 730 var accessor = new TopLevelStaticAccessor(this, getter.name,
616 Send node, 731 kernel.functionToIr(getter), null);
617 MethodElement getter, 732 return accessor.buildNullAwareAssignment(
618 Element element, 733 visitForValue(rhs),
619 Node index, 734 voidContext: isVoidContext);
620 Node rhs, 735 }
621 _) { 736
622 return handleUnresolved(node); 737 ir.Expression visitUnresolvedSuperGetterIndexSetIfNull(
623 } 738 Send node,
624 739 Element element,
625 ir.InvalidExpression visitUnresolvedSuperIndexSetIfNull( 740 MethodElement setter,
626 Send node, 741 Node index,
627 Element element, 742 Node rhs,
628 Node index, 743 _) {
629 Node rhs, 744 var accessor = new SuperIndexAccessor(this, visitForValue(index),
630 _) { 745 null, kernel.functionToIr(setter));
631 return handleUnresolved(node); 746 return accessor.buildNullAwareAssignment(visitForValue(rhs));
632 } 747 }
633 748
634 ir.InvalidExpression visitUnresolvedSuperSet( 749 ir.Expression visitUnresolvedSuperSetterIndexSetIfNull(
635 Send node, 750 Send node,
636 Element element, 751 MethodElement getter,
637 Node rhs, 752 Element element,
638 _) { 753 Node index,
639 return handleUnresolved(node); 754 Node rhs,
755 _) {
756 var accessor = new SuperIndexAccessor(this, visitForValue(index),
757 kernel.functionToIr(getter), null);
758 return accessor.buildNullAwareAssignment(visitForValue(rhs));
759 }
760
761 ir.Expression visitUnresolvedSuperIndexSetIfNull(
762 Send node,
763 Element element,
764 Node index,
765 Node rhs,
766 _) {
767 var accessor =
768 new SuperIndexAccessor(this, visitForValue(index), null, null);
769 return accessor.buildNullAwareAssignment(visitForValue(rhs));
770 }
771
772 ir.Expression visitUnresolvedSuperSet(
773 Send node,
774 Element element,
775 Node rhs,
776 _) {
777 return buildThrowUnresolvedSuperSetter('${node.selector}',
778 visitForValue(rhs));
640 } 779 }
641 } 780 }
OLDNEW
« no previous file with comments | « lib/kernel_visitor.dart ('k') | submodules.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698