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

Side by Side Diff: pkg/compiler/lib/src/resolution/semantic_visitor.dart

Issue 1151163004: Implementation of null-aware operators. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 7 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
OLDNEW
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.semantics_visitor; 5 library dart2js.semantics_visitor;
6 6
7 import '../constants/expressions.dart'; 7 import '../constants/expressions.dart';
8 import '../dart2jslib.dart' show invariant, MessageKind; 8 import '../dart2jslib.dart' show invariant, MessageKind;
9 import '../dart_types.dart'; 9 import '../dart_types.dart';
10 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 /// 297 ///
298 /// For instance 298 /// For instance
299 /// m(receiver) => receiver.foo; 299 /// m(receiver) => receiver.foo;
300 /// 300 ///
301 R visitDynamicPropertyGet( 301 R visitDynamicPropertyGet(
302 Send node, 302 Send node,
303 Node receiver, 303 Node receiver,
304 Selector selector, 304 Selector selector,
305 A arg); 305 A arg);
306 306
307 /// Conditional (if not null) getter call on [receiver] of the property
308 /// defined by [selector].
309 ///
310 /// For instance
311 /// m(receiver) => receiver?.foo;
312 ///
313 R visitIfNotNullDynamicPropertyGet(
314 Send node,
315 Node receiver,
316 Selector selector,
317 A arg);
318
307 /// Setter call on [receiver] with argument [rhs] of the property defined by 319 /// Setter call on [receiver] with argument [rhs] of the property defined by
308 /// [selector]. 320 /// [selector].
309 /// 321 ///
310 /// For instance 322 /// For instance
311 /// m(receiver) { 323 /// m(receiver) {
312 /// receiver.foo = rhs; 324 /// receiver.foo = rhs;
313 /// } 325 /// }
314 /// 326 ///
315 R visitDynamicPropertySet( 327 R visitDynamicPropertySet(
316 SendSet node, 328 SendSet node,
317 Node receiver, 329 Node receiver,
318 Selector selector, 330 Selector selector,
319 Node rhs, 331 Node rhs,
320 A arg); 332 A arg);
321 333
334 /// Conditional (if not null) setter call on [receiver] with argument [rhs] of
335 /// the property defined by [selector].
336 ///
337 /// For instance
338 /// m(receiver) {
339 /// receiver?.foo = rhs;
340 /// }
341 ///
342 R visitIfNotNullDynamicPropertySet(
343 SendSet node,
344 Node receiver,
345 Selector selector,
346 Node rhs,
347 A arg);
348
322 /// Invocation of the property defined by [selector] on [receiver] with 349 /// Invocation of the property defined by [selector] on [receiver] with
323 /// [arguments]. 350 /// [arguments].
324 /// 351 ///
325 /// For instance 352 /// For instance
326 /// m(receiver) { 353 /// m(receiver) {
327 /// receiver.foo(null, 42); 354 /// receiver.foo(null, 42);
328 /// } 355 /// }
329 /// 356 ///
330 R visitDynamicPropertyInvoke( 357 R visitDynamicPropertyInvoke(
331 Send node, 358 Send node,
332 Node receiver, 359 Node receiver,
333 NodeList arguments, 360 NodeList arguments,
334 Selector selector, 361 Selector selector,
335 A arg); 362 A arg);
336 363
364 /// Conditinal invocation of the property defined by [selector] on [receiver]
365 /// with [arguments], if [receiver] is not null.
366 ///
367 /// For instance
368 /// m(receiver) {
369 /// receiver?.foo(null, 42);
370 /// }
371 ///
372 R visitIfNotNullDynamicPropertyInvoke(
373 Send node,
374 Node receiver,
375 NodeList arguments,
376 Selector selector,
377 A arg);
378
337 /// Getter call on `this` of the property defined by [selector]. 379 /// Getter call on `this` of the property defined by [selector].
338 /// 380 ///
339 /// For instance 381 /// For instance
340 /// class C { 382 /// class C {
341 /// m() => this.foo; 383 /// m() => this.foo;
342 /// } 384 /// }
343 /// 385 ///
344 /// or 386 /// or
345 /// 387 ///
346 /// class C { 388 /// class C {
(...skipping 1273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1620 /// m() => super[1] = 42; 1662 /// m() => super[1] = 42;
1621 /// } 1663 /// }
1622 /// 1664 ///
1623 R visitUnresolvedSuperIndexSet( 1665 R visitUnresolvedSuperIndexSet(
1624 Send node, 1666 Send node,
1625 Element element, 1667 Element element,
1626 Node index, 1668 Node index,
1627 Node rhs, 1669 Node rhs,
1628 A arg); 1670 A arg);
1629 1671
1672 /// If-null, ??, expression with operands [left] and [right].
1673 ///
1674 /// For instance
1675 /// m() => left ?? right;
1676 ///
1677 R visitIfNull(
1678 Send node,
1679 Node left,
1680 Node right,
1681 A arg);
1682
1630 /// Logical and, &&, expression with operands [left] and [right]. 1683 /// Logical and, &&, expression with operands [left] and [right].
1631 /// 1684 ///
1632 /// For instance 1685 /// For instance
1633 /// m() => left && right; 1686 /// m() => left && right;
1634 /// 1687 ///
1635 R visitLogicalAnd( 1688 R visitLogicalAnd(
1636 Send node, 1689 Send node,
1637 Node left, 1690 Node left,
1638 Node right, 1691 Node right,
1639 A arg); 1692 A arg);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1695 R visitDynamicPropertyCompound( 1748 R visitDynamicPropertyCompound(
1696 Send node, 1749 Send node,
1697 Node receiver, 1750 Node receiver,
1698 AssignmentOperator operator, 1751 AssignmentOperator operator,
1699 Node rhs, 1752 Node rhs,
1700 Selector getterSelector, 1753 Selector getterSelector,
1701 Selector setterSelector, 1754 Selector setterSelector,
1702 A arg); 1755 A arg);
1703 1756
1704 /// Compound assignment expression of [rhs] with [operator] of the property on 1757 /// Compound assignment expression of [rhs] with [operator] of the property on
1758 /// a possibly null [receiver] whose getter and setter are defined by
1759 /// [getterSelector] and [setterSelector], respectively.
1760 ///
1761 /// For instance:
1762 /// m(receiver, rhs) => receiver?.foo += rhs;
1763 ///
1764 R visitIfNotNullDynamicPropertyCompound(
1765 Send node,
1766 Node receiver,
1767 AssignmentOperator operator,
1768 Node rhs,
1769 Selector getterSelector,
1770 Selector setterSelector,
1771 A arg);
1772
1773 /// Compound assignment expression of [rhs] with [operator] of the property on
1705 /// `this` whose getter and setter are defined by [getterSelector] and 1774 /// `this` whose getter and setter are defined by [getterSelector] and
1706 /// [setterSelector], respectively. 1775 /// [setterSelector], respectively.
1707 /// 1776 ///
1708 /// For instance: 1777 /// For instance:
1709 /// class C { 1778 /// class C {
1710 /// m(rhs) => this.foo += rhs; 1779 /// m(rhs) => this.foo += rhs;
1711 /// } 1780 /// }
1712 /// or 1781 /// or
1713 /// class C { 1782 /// class C {
1714 /// m(rhs) => foo += rhs; 1783 /// m(rhs) => foo += rhs;
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after
2378 /// m(receiver) => ++receiver.foo; 2447 /// m(receiver) => ++receiver.foo;
2379 /// 2448 ///
2380 R visitDynamicPropertyPrefix( 2449 R visitDynamicPropertyPrefix(
2381 Send node, 2450 Send node,
2382 Node receiver, 2451 Node receiver,
2383 IncDecOperator operator, 2452 IncDecOperator operator,
2384 Selector getterSelector, 2453 Selector getterSelector,
2385 Selector setterSelector, 2454 Selector setterSelector,
2386 A arg); 2455 A arg);
2387 2456
2457 /// Prefix expression with [operator] of the property on a possibly null
2458 /// [receiver] whose getter and setter are defined by [getterSelector] and
2459 /// [setterSelector], respectively.
2460 ///
2461 /// For instance:
2462 /// m(receiver) => ++receiver?.foo;
2463 ///
2464 R visitIfNotNullDynamicPropertyPrefix(
2465 Send node,
2466 Node receiver,
2467 IncDecOperator operator,
2468 Selector getterSelector,
2469 Selector setterSelector,
2470 A arg);
2471
2388 /// Prefix expression with [operator] on a [parameter]. 2472 /// Prefix expression with [operator] on a [parameter].
2389 /// 2473 ///
2390 /// For instance: 2474 /// For instance:
2391 /// m(parameter) => ++parameter; 2475 /// m(parameter) => ++parameter;
2392 /// 2476 ///
2393 R visitParameterPrefix( 2477 R visitParameterPrefix(
2394 Send node, 2478 Send node,
2395 ParameterElement parameter, 2479 ParameterElement parameter,
2396 IncDecOperator operator, 2480 IncDecOperator operator,
2397 A arg); 2481 A arg);
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
2819 /// m(receiver) => receiver.foo++; 2903 /// m(receiver) => receiver.foo++;
2820 /// 2904 ///
2821 R visitDynamicPropertyPostfix( 2905 R visitDynamicPropertyPostfix(
2822 Send node, 2906 Send node,
2823 Node receiver, 2907 Node receiver,
2824 IncDecOperator operator, 2908 IncDecOperator operator,
2825 Selector getterSelector, 2909 Selector getterSelector,
2826 Selector setterSelector, 2910 Selector setterSelector,
2827 A arg); 2911 A arg);
2828 2912
2913 /// Postfix expression with [operator] of the property on a possibly null
2914 /// [receiver] whose getter and setter are defined by [getterSelector] and
2915 /// [setterSelector], respectively.
2916 ///
2917 /// For instance:
2918 /// m(receiver) => receiver?.foo++;
2919 ///
2920 R visitIfNotNullDynamicPropertyPostfix(
2921 Send node,
2922 Node receiver,
2923 IncDecOperator operator,
2924 Selector getterSelector,
2925 Selector setterSelector,
2926 A arg);
2927
2829 /// Postfix expression with [operator] on a [parameter]. 2928 /// Postfix expression with [operator] on a [parameter].
2830 /// 2929 ///
2831 /// For instance: 2930 /// For instance:
2832 /// m(parameter) => parameter++; 2931 /// m(parameter) => parameter++;
2833 /// 2932 ///
2834 R visitParameterPostfix( 2933 R visitParameterPostfix(
2835 Send node, 2934 Send node,
2836 ParameterElement parameter, 2935 ParameterElement parameter,
2837 IncDecOperator operator, 2936 IncDecOperator operator,
2838 A arg); 2937 A arg);
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
3281 /// 3380 ///
3282 /// For instance 3381 /// For instance
3283 /// class C {} 3382 /// class C {}
3284 /// m1() => unresolved; 3383 /// m1() => unresolved;
3285 /// m2() => prefix.unresolved; 3384 /// m2() => prefix.unresolved;
3286 /// m3() => Unresolved.foo; 3385 /// m3() => Unresolved.foo;
3287 /// m4() => unresolved.foo; 3386 /// m4() => unresolved.foo;
3288 /// m5() => unresolved.Foo.bar; 3387 /// m5() => unresolved.Foo.bar;
3289 /// m6() => C.unresolved; 3388 /// m6() => C.unresolved;
3290 /// m7() => prefix.C.unresolved; 3389 /// m7() => prefix.C.unresolved;
3390 /// m8() => prefix?.unresolved;
3391 /// m9() => Unresolved?.foo;
3392 /// m10() => unresolved?.foo;
3393 /// m11() => unresolved?.Foo?.bar;
3291 /// 3394 ///
3292 // TODO(johnniwinther): Split the cases in which a prefix is resolved. 3395 // TODO(johnniwinther): Split the cases in which a prefix is resolved.
3293 R visitUnresolvedGet( 3396 R visitUnresolvedGet(
3294 Send node, 3397 Send node,
3295 Element element, 3398 Element element,
3296 A arg); 3399 A arg);
3297 3400
3298 /// Read of the unresolved super [element]. 3401 /// Read of the unresolved super [element].
3299 /// 3402 ///
3300 /// For instance 3403 /// For instance
(...skipping 11 matching lines...) Expand all
3312 /// 3415 ///
3313 /// For instance 3416 /// For instance
3314 /// class C {} 3417 /// class C {}
3315 /// m1() => unresolved = 42; 3418 /// m1() => unresolved = 42;
3316 /// m2() => prefix.unresolved = 42; 3419 /// m2() => prefix.unresolved = 42;
3317 /// m3() => Unresolved.foo = 42; 3420 /// m3() => Unresolved.foo = 42;
3318 /// m4() => unresolved.foo = 42; 3421 /// m4() => unresolved.foo = 42;
3319 /// m5() => unresolved.Foo.bar = 42; 3422 /// m5() => unresolved.Foo.bar = 42;
3320 /// m6() => C.unresolved = 42; 3423 /// m6() => C.unresolved = 42;
3321 /// m7() => prefix.C.unresolved = 42; 3424 /// m7() => prefix.C.unresolved = 42;
3425 /// m8() => prefix?.unresolved = 42;
3426 /// m9() => Unresolved?.foo = 42;
3427 /// m10() => unresolved?.foo = 42;
3428 /// m11() => unresolved?.Foo?.bar = 42;
3322 /// 3429 ///
3323 // TODO(johnniwinther): Split the cases in which a prefix is resolved. 3430 // TODO(johnniwinther): Split the cases in which a prefix is resolved.
3324 R visitUnresolvedSet( 3431 R visitUnresolvedSet(
3325 Send node, 3432 Send node,
3326 Element element, 3433 Element element,
3327 Node rhs, 3434 Node rhs,
3328 A arg); 3435 A arg);
3329 3436
3330 /// Invocation of the unresolved [element] with [arguments]. 3437 /// Invocation of the unresolved [element] with [arguments].
3331 /// 3438 ///
3332 /// For instance 3439 /// For instance
3333 /// class C {} 3440 /// class C {}
3334 /// m1() => unresolved(null, 42); 3441 /// m1() => unresolved(null, 42);
3335 /// m2() => prefix.unresolved(null, 42); 3442 /// m2() => prefix.unresolved(null, 42);
3336 /// m3() => Unresolved.foo(null, 42); 3443 /// m3() => Unresolved.foo(null, 42);
3337 /// m4() => unresolved.foo(null, 42); 3444 /// m4() => unresolved.foo(null, 42);
3338 /// m5() => unresolved.Foo.bar(null, 42); 3445 /// m5() => unresolved.Foo.bar(null, 42);
3339 /// m6() => C.unresolved(null, 42); 3446 /// m6() => C.unresolved(null, 42);
3340 /// m7() => prefix.C.unresolved(null, 42); 3447 /// m7() => prefix.C.unresolved(null, 42);
3448 /// m8() => prefix?.unresolved(null, 42);
3449 /// m9() => Unresolved?.foo(null, 42);
3450 /// m10() => unresolved?.foo(null, 42);
3451 /// m11() => unresolved?.Foo?.bar(null, 42);
3341 /// 3452 ///
3342 // TODO(johnniwinther): Split the cases in which a prefix is resolved. 3453 // TODO(johnniwinther): Split the cases in which a prefix is resolved.
3343 R visitUnresolvedInvoke( 3454 R visitUnresolvedInvoke(
3344 Send node, 3455 Send node,
3345 Element element, 3456 Element element,
3346 NodeList arguments, 3457 NodeList arguments,
3347 Selector selector, 3458 Selector selector,
3348 A arg); 3459 A arg);
3349 3460
3350 /// Invocation of the unresolved super [element] with [arguments]. 3461 /// Invocation of the unresolved super [element] with [arguments].
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
3446 /// 3557 ///
3447 /// For instance 3558 /// For instance
3448 /// class C {} 3559 /// class C {}
3449 /// m1() => unresolved += 42; 3560 /// m1() => unresolved += 42;
3450 /// m2() => prefix.unresolved += 42; 3561 /// m2() => prefix.unresolved += 42;
3451 /// m3() => Unresolved.foo += 42; 3562 /// m3() => Unresolved.foo += 42;
3452 /// m4() => unresolved.foo += 42; 3563 /// m4() => unresolved.foo += 42;
3453 /// m5() => unresolved.Foo.bar += 42; 3564 /// m5() => unresolved.Foo.bar += 42;
3454 /// m6() => C.unresolved += 42; 3565 /// m6() => C.unresolved += 42;
3455 /// m7() => prefix.C.unresolved += 42; 3566 /// m7() => prefix.C.unresolved += 42;
3567 /// m8() => prefix?.unresolved += 42;
3568 /// m9() => Unresolved?.foo += 42;
3569 /// m10() => unresolved?.foo += 42;
3570 /// m11() => unresolved?.Foo?.bar += 42;
3456 /// 3571 ///
3457 // TODO(johnniwinther): Split the cases in which a prefix is resolved. 3572 // TODO(johnniwinther): Split the cases in which a prefix is resolved.
3458 R visitUnresolvedCompound( 3573 R visitUnresolvedCompound(
3459 Send node, 3574 Send node,
3460 Element element, 3575 Element element,
3461 AssignmentOperator operator, 3576 AssignmentOperator operator,
3462 Node rhs, 3577 Node rhs,
3463 A arg); 3578 A arg);
3464 3579
3465 /// Prefix operation of [operator] reading from the non-existing static getter 3580 /// Prefix operation of [operator] reading from the non-existing static getter
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
3556 /// 3671 ///
3557 /// For instance 3672 /// For instance
3558 /// class C {} 3673 /// class C {}
3559 /// m1() => ++unresolved; 3674 /// m1() => ++unresolved;
3560 /// m2() => ++prefix.unresolved; 3675 /// m2() => ++prefix.unresolved;
3561 /// m3() => ++Unresolved.foo; 3676 /// m3() => ++Unresolved.foo;
3562 /// m4() => ++unresolved.foo; 3677 /// m4() => ++unresolved.foo;
3563 /// m5() => ++unresolved.Foo.bar; 3678 /// m5() => ++unresolved.Foo.bar;
3564 /// m6() => ++C.unresolved; 3679 /// m6() => ++C.unresolved;
3565 /// m7() => ++prefix.C.unresolved; 3680 /// m7() => ++prefix.C.unresolved;
3681 /// m8() => ++prefix?.unresolved;
3682 /// m9() => ++Unresolved?.foo;
3683 /// m10() => ++unresolved?.foo;
3684 /// m11() => ++unresolved?.Foo?.bar;
3566 /// 3685 ///
3567 // TODO(johnniwinther): Split the cases in which a prefix is resolved. 3686 // TODO(johnniwinther): Split the cases in which a prefix is resolved.
3568 R visitUnresolvedPrefix( 3687 R visitUnresolvedPrefix(
3569 Send node, 3688 Send node,
3570 Element element, 3689 Element element,
3571 IncDecOperator operator, 3690 IncDecOperator operator,
3572 A arg); 3691 A arg);
3573 3692
3574 /// Postfix operation of [operator] reading from the non-existing static 3693 /// Postfix operation of [operator] reading from the non-existing static
3575 /// getter and writing to the static [setter]. 3694 /// getter and writing to the static [setter].
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
3665 /// 3784 ///
3666 /// For instance 3785 /// For instance
3667 /// class C {} 3786 /// class C {}
3668 /// m1() => unresolved++; 3787 /// m1() => unresolved++;
3669 /// m2() => prefix.unresolved++; 3788 /// m2() => prefix.unresolved++;
3670 /// m3() => Unresolved.foo++; 3789 /// m3() => Unresolved.foo++;
3671 /// m4() => unresolved.foo++; 3790 /// m4() => unresolved.foo++;
3672 /// m5() => unresolved.Foo.bar++; 3791 /// m5() => unresolved.Foo.bar++;
3673 /// m6() => C.unresolved++; 3792 /// m6() => C.unresolved++;
3674 /// m7() => prefix.C.unresolved++; 3793 /// m7() => prefix.C.unresolved++;
3794 /// m8() => prefix?.unresolved++;
3795 /// m9() => Unresolved?.foo++;
3796 /// m10() => unresolved?.foo++;
3797 /// m11() => unresolved?.Foo?.bar++;
3675 /// 3798 ///
3676 // TODO(johnniwinther): Split the cases in which a prefix is resolved. 3799 // TODO(johnniwinther): Split the cases in which a prefix is resolved.
3677 R visitUnresolvedPostfix( 3800 R visitUnresolvedPostfix(
3678 Send node, 3801 Send node,
3679 Element element, 3802 Element element,
3680 IncDecOperator operator, 3803 IncDecOperator operator,
3681 A arg); 3804 A arg);
3682 3805
3683 /// Invocation of an undefined unary [operator] on [expression]. 3806 /// Invocation of an undefined unary [operator] on [expression].
3684 R errorUndefinedUnaryExpression( 3807 R errorUndefinedUnaryExpression(
(...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after
4421 /// C() : this._(42); 4544 /// C() : this._(42);
4422 /// } 4545 /// }
4423 /// 4546 ///
4424 R errorUnresolvedThisConstructorInvoke( 4547 R errorUnresolvedThisConstructorInvoke(
4425 Send node, 4548 Send node,
4426 Element element, 4549 Element element,
4427 NodeList arguments, 4550 NodeList arguments,
4428 Selector selector, 4551 Selector selector,
4429 A arg); 4552 A arg);
4430 } 4553 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/operators.dart ('k') | pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698