OLD | NEW |
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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import "../dart_types.dart" show DartType, InterfaceType; | 7 import "../dart_types.dart" show DartType, InterfaceType; |
8 import "../elements/elements.dart" | 8 import "../elements/elements.dart" |
9 show | 9 show |
10 AstElement, | 10 AstElement, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 name, | 123 name, |
124 new ir.Arguments(<ir.Expression>[argument])); | 124 new ir.Arguments(<ir.Expression>[argument])); |
125 } | 125 } |
126 | 126 |
127 ir.Expression buildThrowSingleArgumentError( | 127 ir.Expression buildThrowSingleArgumentError( |
128 ir.Procedure exceptionBuilder, String errorMessage) { | 128 ir.Procedure exceptionBuilder, String errorMessage) { |
129 return new ir.Throw(new ir.StaticInvocation(exceptionBuilder, | 129 return new ir.Throw(new ir.StaticInvocation(exceptionBuilder, |
130 new ir.Arguments(<ir.Expression>[new ir.StringLiteral(errorMessage)]))); | 130 new ir.Arguments(<ir.Expression>[new ir.StringLiteral(errorMessage)]))); |
131 } | 131 } |
132 | 132 |
| 133 SuperIndexAccessor buildUnresolvedSuperIndexAccessor( |
| 134 Node index, Element element) { |
| 135 ir.Member member = possiblyErroneousFunctionToIr(element); |
| 136 return new SuperIndexAccessor(this, visitForValue(index), member, member); |
| 137 } |
| 138 |
| 139 SuperPropertyAccessor buildUnresolvedSuperPropertyAccessor( |
| 140 String name, Element getter) { |
| 141 return new SuperPropertyAccessor(this, kernel.irName(name, currentElement), |
| 142 getter == null ? null : possiblyErroneousFunctionToIr(getter), null); |
| 143 } |
| 144 |
133 ir.Expression visitUnresolvedClassConstructorInvoke( | 145 ir.Expression visitUnresolvedClassConstructorInvoke( |
134 NewExpression node, | 146 NewExpression node, |
135 ErroneousElement element, | 147 ErroneousElement element, |
136 DartType type, | 148 DartType type, |
137 NodeList arguments, | 149 NodeList arguments, |
138 Selector selector, | 150 Selector selector, |
139 _) { | 151 _) { |
140 // TODO(asgerf): The VM includes source information as part of the error | 152 // TODO(asgerf): The VM includes source information as part of the error |
141 // message. We could do the same when we add source maps. | 153 // message. We could do the same when we add source maps. |
142 return buildThrowSingleArgumentError( | 154 return buildThrowSingleArgumentError( |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 new ir.Arguments(<ir.Expression>[visitForValue(argument)])); | 285 new ir.Arguments(<ir.Expression>[visitForValue(argument)])); |
274 } | 286 } |
275 | 287 |
276 ir.Expression visitUnresolvedSuperCompound( | 288 ir.Expression visitUnresolvedSuperCompound( |
277 Send node, Element element, AssignmentOperator operator, Node rhs, _) { | 289 Send node, Element element, AssignmentOperator operator, Node rhs, _) { |
278 return buildThrowUnresolvedSuperGetter('${node.selector}'); | 290 return buildThrowUnresolvedSuperGetter('${node.selector}'); |
279 } | 291 } |
280 | 292 |
281 ir.Expression visitUnresolvedSuperCompoundIndexSet(Send node, Element element, | 293 ir.Expression visitUnresolvedSuperCompoundIndexSet(Send node, Element element, |
282 Node index, AssignmentOperator operator, Node rhs, _) { | 294 Node index, AssignmentOperator operator, Node rhs, _) { |
283 var accessor = new SuperIndexAccessor(this, visitForValue(index), | 295 return buildUnresolvedSuperIndexAccessor(index, element) |
284 possiblyErroneousFunctionToIr(element), null); | 296 .buildCompoundAssignment( |
285 return accessor.buildCompoundAssignment( | 297 new ir.Name(operator.selectorName), visitForValue(rhs)); |
286 new ir.Name(operator.selectorName), visitForValue(rhs)); | |
287 } | 298 } |
288 | 299 |
289 ir.Expression visitUnresolvedSuperGet(Send node, Element element, _) { | 300 ir.Expression visitUnresolvedSuperGet(Send node, Element element, _) { |
290 return buildThrowUnresolvedSuperGetter('${node.selector}'); | 301 return buildThrowUnresolvedSuperGetter('${node.selector}'); |
291 } | 302 } |
292 | 303 |
293 ir.Expression visitUnresolvedSuperGetterCompound(Send node, Element element, | 304 ir.Expression visitUnresolvedSuperGetterCompound(Send node, Element element, |
294 MethodElement setter, AssignmentOperator operator, Node rhs, _) { | 305 MethodElement setter, AssignmentOperator operator, Node rhs, _) { |
295 return buildThrowUnresolvedSuperGetter('${node.selector}'); | 306 return buildThrowUnresolvedSuperGetter('${node.selector}'); |
296 } | 307 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 return buildThrowUnresolvedSuperGetter('${node.selector}'); | 347 return buildThrowUnresolvedSuperGetter('${node.selector}'); |
337 } | 348 } |
338 | 349 |
339 ir.Expression visitUnresolvedSuperGetterSetIfNull( | 350 ir.Expression visitUnresolvedSuperGetterSetIfNull( |
340 Send node, Element element, MethodElement setter, Node rhs, _) { | 351 Send node, Element element, MethodElement setter, Node rhs, _) { |
341 return buildThrowUnresolvedSuperGetter('${node.selector}'); | 352 return buildThrowUnresolvedSuperGetter('${node.selector}'); |
342 } | 353 } |
343 | 354 |
344 ir.Expression visitUnresolvedSuperIndex( | 355 ir.Expression visitUnresolvedSuperIndex( |
345 Send node, Element element, Node index, _) { | 356 Send node, Element element, Node index, _) { |
346 return new SuperIndexAccessor(this, visitForValue(index), null, null) | 357 return buildUnresolvedSuperIndexAccessor(index, element).buildSimpleRead(); |
347 .buildSimpleRead(); | |
348 } | 358 } |
349 | 359 |
350 ir.Expression visitUnresolvedSuperIndexPostfix( | 360 ir.Expression visitUnresolvedSuperIndexPostfix( |
351 Send node, Element element, Node index, IncDecOperator operator, _) { | 361 Send node, Element element, Node index, IncDecOperator operator, _) { |
352 return new SuperIndexAccessor(this, visitForValue(index), null, null) | 362 return buildUnresolvedSuperIndexAccessor(index, element).buildSimpleRead(); |
353 .buildSimpleRead(); | |
354 } | 363 } |
355 | 364 |
356 ir.Expression visitUnresolvedSuperIndexPrefix( | 365 ir.Expression visitUnresolvedSuperIndexPrefix( |
357 Send node, Element element, Node index, IncDecOperator operator, _) { | 366 Send node, Element element, Node index, IncDecOperator operator, _) { |
358 return new SuperIndexAccessor(this, visitForValue(index), null, null) | 367 return buildUnresolvedSuperIndexAccessor(index, element).buildSimpleRead(); |
359 .buildSimpleRead(); | |
360 } | 368 } |
361 | 369 |
362 ir.Expression visitUnresolvedSuperIndexSet( | 370 ir.Expression visitUnresolvedSuperIndexSet( |
363 Send node, Element element, Node index, Node rhs, _) { | 371 Send node, Element element, Node index, Node rhs, _) { |
364 return new SuperIndexAccessor(this, visitForValue(index), null, null) | 372 return buildUnresolvedSuperIndexAccessor(index, element) |
365 .buildAssignment(visitForValue(rhs)); | 373 .buildAssignment(visitForValue(rhs)); |
366 } | 374 } |
367 | 375 |
368 ir.Expression visitUnresolvedSuperInvoke( | 376 ir.Expression visitUnresolvedSuperInvoke( |
369 Send node, Element element, NodeList arguments, Selector selector, _) { | 377 Send node, Element element, NodeList arguments, Selector selector, _) { |
370 // TODO(asgerf): Should really invoke 'super.noSuchMethod'. | 378 // TODO(asgerf): Should really invoke 'super.noSuchMethod'. |
371 return buildThrowNoSuchMethodError(kernel.getUnresolvedSuperMethodBuilder(), | 379 return buildThrowNoSuchMethodError(kernel.getUnresolvedSuperMethodBuilder(), |
372 new ir.ThisExpression(), '${node.selector}', buildArguments(arguments)); | 380 new ir.ThisExpression(), '${node.selector}', buildArguments(arguments)); |
373 } | 381 } |
374 | 382 |
(...skipping 12 matching lines...) Expand all Loading... |
387 return buildThrowUnresolvedSuperGetter('${node.selector}'); | 395 return buildThrowUnresolvedSuperGetter('${node.selector}'); |
388 } | 396 } |
389 | 397 |
390 ir.Expression visitUnresolvedSuperSetterCompound( | 398 ir.Expression visitUnresolvedSuperSetterCompound( |
391 Send node, | 399 Send node, |
392 MethodElement getter, | 400 MethodElement getter, |
393 Element element, | 401 Element element, |
394 AssignmentOperator operator, | 402 AssignmentOperator operator, |
395 Node rhs, | 403 Node rhs, |
396 _) { | 404 _) { |
397 var accessor = new SuperPropertyAccessor( | 405 return buildUnresolvedSuperPropertyAccessor('${node.selector}', getter) |
398 this, '${node.selector}', possiblyErroneousFunctionToIr(getter), null); | 406 .buildCompoundAssignment( |
399 return accessor.buildCompoundAssignment( | 407 new ir.Name(operator.selectorName), visitForValue(rhs)); |
400 new ir.Name(operator.selectorName), visitForValue(rhs)); | |
401 } | 408 } |
402 | 409 |
403 ir.Expression visitUnresolvedSuperSetterCompoundIndexSet( | 410 ir.Expression visitUnresolvedSuperSetterCompoundIndexSet( |
404 Send node, | 411 Send node, |
405 MethodElement getter, | 412 MethodElement getter, |
406 Element element, | 413 Element element, |
407 Node index, | 414 Node index, |
408 AssignmentOperator operator, | 415 AssignmentOperator operator, |
409 Node rhs, | 416 Node rhs, |
410 _) { | 417 _) { |
411 var accessor = new SuperIndexAccessor(this, visitForValue(index), | 418 return buildUnresolvedSuperIndexAccessor(index, element) |
412 possiblyErroneousFunctionToIr(getter), null); | 419 .buildCompoundAssignment( |
413 return accessor.buildCompoundAssignment( | 420 new ir.Name(operator.selectorName), visitForValue(rhs)); |
414 new ir.Name(operator.selectorName), visitForValue(rhs)); | |
415 } | 421 } |
416 | 422 |
417 ir.Expression visitUnresolvedSuperSetterIndexPostfix( | 423 ir.Expression visitUnresolvedSuperSetterIndexPostfix( |
418 Send node, | 424 Send node, |
419 MethodElement indexFunction, | 425 MethodElement indexFunction, |
420 Element element, | 426 Element element, |
421 Node index, | 427 Node index, |
422 IncDecOperator operator, | 428 IncDecOperator operator, |
423 _) { | 429 _) { |
424 var accessor = new SuperIndexAccessor(this, visitForValue(index), | 430 return buildUnresolvedSuperIndexAccessor(index, element) |
425 possiblyErroneousFunctionToIr(indexFunction), null); | 431 .buildPostfixIncrement(new ir.Name(operator.selectorName)); |
426 return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName)); | |
427 } | 432 } |
428 | 433 |
429 ir.Expression visitUnresolvedSuperSetterIndexPrefix( | 434 ir.Expression visitUnresolvedSuperSetterIndexPrefix( |
430 Send node, | 435 Send node, |
431 MethodElement indexFunction, | 436 MethodElement indexFunction, |
432 Element element, | 437 Element element, |
433 Node index, | 438 Node index, |
434 IncDecOperator operator, | 439 IncDecOperator operator, |
435 _) { | 440 _) { |
436 var accessor = new SuperIndexAccessor(this, visitForValue(index), | 441 return buildUnresolvedSuperIndexAccessor(index, element) |
437 possiblyErroneousFunctionToIr(indexFunction), null); | 442 .buildPrefixIncrement(new ir.Name(operator.selectorName)); |
438 return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName)); | |
439 } | 443 } |
440 | 444 |
441 ir.Expression visitUnresolvedSuperSetterPostfix(Send node, | 445 ir.Expression visitUnresolvedSuperSetterPostfix(Send node, |
442 MethodElement getter, Element element, IncDecOperator operator, _) { | 446 MethodElement getter, Element element, IncDecOperator operator, _) { |
443 var accessor = new SuperPropertyAccessor( | 447 return buildUnresolvedSuperPropertyAccessor('${node.selector}', getter) |
444 this, '${node.selector}', possiblyErroneousFunctionToIr(getter), null); | 448 .buildPostfixIncrement(new ir.Name(operator.selectorName)); |
445 return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName)); | |
446 } | 449 } |
447 | 450 |
448 ir.Expression visitUnresolvedSuperSetterPrefix(Send node, | 451 ir.Expression visitUnresolvedSuperSetterPrefix(Send node, |
449 MethodElement getter, Element element, IncDecOperator operator, _) { | 452 MethodElement getter, Element element, IncDecOperator operator, _) { |
450 var accessor = new SuperPropertyAccessor( | 453 return buildUnresolvedSuperPropertyAccessor('${node.selector}', getter) |
451 this, '${node.selector}', possiblyErroneousFunctionToIr(getter), null); | 454 .buildPrefixIncrement(new ir.Name(operator.selectorName)); |
452 return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName)); | |
453 } | 455 } |
454 | 456 |
455 ir.Expression visitUnresolvedSuperSetterSetIfNull( | 457 ir.Expression visitUnresolvedSuperSetterSetIfNull( |
456 Send node, MethodElement getter, Element element, Node rhs, _) { | 458 Send node, MethodElement getter, Element element, Node rhs, _) { |
457 var accessor = new SuperPropertyAccessor( | 459 return buildUnresolvedSuperPropertyAccessor('${node.selector}', getter) |
458 this, '${node.selector}', possiblyErroneousFunctionToIr(getter), null); | 460 .buildNullAwareAssignment(visitForValue(rhs)); |
459 return accessor.buildNullAwareAssignment(visitForValue(rhs)); | |
460 } | 461 } |
461 | 462 |
462 ir.Expression visitUnresolvedSuperUnary( | 463 ir.Expression visitUnresolvedSuperUnary( |
463 Send node, UnaryOperator operator, Element element, _) { | 464 Send node, UnaryOperator operator, Element element, _) { |
464 // TODO(asgerf): Should really call 'super.noSuchMethod'. | 465 // TODO(asgerf): Should really call 'super.noSuchMethod'. |
465 return buildThrowNoSuchMethodError( | 466 return buildThrowNoSuchMethodError( |
466 kernel.getUnresolvedSuperMethodBuilder(), | 467 kernel.getUnresolvedSuperMethodBuilder(), |
467 new ir.ThisExpression(), | 468 new ir.ThisExpression(), |
468 operator.selectorName, | 469 operator.selectorName, |
469 new ir.Arguments.empty()); | 470 new ir.Arguments.empty()); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 ir.Expression visitUnresolvedTopLevelSetterSetIfNull( | 532 ir.Expression visitUnresolvedTopLevelSetterSetIfNull( |
532 Send node, MethodElement getter, Element element, Node rhs, _) { | 533 Send node, MethodElement getter, Element element, Node rhs, _) { |
533 var accessor = new TopLevelStaticAccessor( | 534 var accessor = new TopLevelStaticAccessor( |
534 this, getter.name, possiblyErroneousFunctionToIr(getter), null); | 535 this, getter.name, possiblyErroneousFunctionToIr(getter), null); |
535 return accessor.buildNullAwareAssignment(visitForValue(rhs), | 536 return accessor.buildNullAwareAssignment(visitForValue(rhs), |
536 voidContext: isVoidContext); | 537 voidContext: isVoidContext); |
537 } | 538 } |
538 | 539 |
539 ir.Expression visitUnresolvedSuperGetterIndexSetIfNull(Send node, | 540 ir.Expression visitUnresolvedSuperGetterIndexSetIfNull(Send node, |
540 Element element, MethodElement setter, Node index, Node rhs, _) { | 541 Element element, MethodElement setter, Node index, Node rhs, _) { |
541 var accessor = new SuperIndexAccessor(this, visitForValue(index), null, | 542 return buildUnresolvedSuperIndexAccessor(index, element) |
542 possiblyErroneousFunctionToIr(setter)); | 543 .buildNullAwareAssignment(visitForValue(rhs)); |
543 return accessor.buildNullAwareAssignment(visitForValue(rhs)); | |
544 } | 544 } |
545 | 545 |
546 ir.Expression visitUnresolvedSuperSetterIndexSetIfNull(Send node, | 546 ir.Expression visitUnresolvedSuperSetterIndexSetIfNull(Send node, |
547 MethodElement getter, Element element, Node index, Node rhs, _) { | 547 MethodElement getter, Element element, Node index, Node rhs, _) { |
548 var accessor = new SuperIndexAccessor(this, visitForValue(index), | 548 return buildUnresolvedSuperIndexAccessor(index, element) |
549 possiblyErroneousFunctionToIr(getter), null); | 549 .buildNullAwareAssignment(visitForValue(rhs)); |
550 return accessor.buildNullAwareAssignment(visitForValue(rhs)); | |
551 } | 550 } |
552 | 551 |
553 ir.Expression visitUnresolvedSuperIndexSetIfNull( | 552 ir.Expression visitUnresolvedSuperIndexSetIfNull( |
554 Send node, Element element, Node index, Node rhs, _) { | 553 Send node, Element element, Node index, Node rhs, _) { |
555 var accessor = | 554 return buildUnresolvedSuperIndexAccessor(index, element) |
556 new SuperIndexAccessor(this, visitForValue(index), null, null); | 555 .buildNullAwareAssignment(visitForValue(rhs)); |
557 return accessor.buildNullAwareAssignment(visitForValue(rhs)); | |
558 } | 556 } |
559 | 557 |
560 ir.Expression visitUnresolvedSuperSet( | 558 ir.Expression visitUnresolvedSuperSet( |
561 Send node, Element element, Node rhs, _) { | 559 Send node, Element element, Node rhs, _) { |
562 return buildThrowUnresolvedSuperSetter( | 560 return buildThrowUnresolvedSuperSetter( |
563 '${node.selector}', visitForValue(rhs)); | 561 '${node.selector}', visitForValue(rhs)); |
564 } | 562 } |
565 } | 563 } |
OLD | NEW |