| 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.send_structure; | 5 library dart2js.send_structure; |
| 6 | 6 |
| 7 import 'access_semantics.dart'; | 7 import 'access_semantics.dart'; |
| 8 import 'operators.dart'; | 8 import 'operators.dart'; |
| 9 import 'semantic_visitor.dart'; | 9 import 'semantic_visitor.dart'; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 callStructure, | 212 callStructure, |
| 213 arg); | 213 arg); |
| 214 case AccessKind.STATIC_GETTER: | 214 case AccessKind.STATIC_GETTER: |
| 215 return visitor.visitStaticGetterInvoke( | 215 return visitor.visitStaticGetterInvoke( |
| 216 node, | 216 node, |
| 217 semantics.element, | 217 semantics.element, |
| 218 node.argumentsNode, | 218 node.argumentsNode, |
| 219 callStructure, | 219 callStructure, |
| 220 arg); | 220 arg); |
| 221 case AccessKind.STATIC_SETTER: | 221 case AccessKind.STATIC_SETTER: |
| 222 return visitor.errorStaticSetterInvoke( | 222 return visitor.visitStaticSetterInvoke( |
| 223 node, | 223 node, |
| 224 semantics.element, | 224 semantics.element, |
| 225 node.argumentsNode, | 225 node.argumentsNode, |
| 226 callStructure, | 226 callStructure, |
| 227 arg); | 227 arg); |
| 228 case AccessKind.TOPLEVEL_FIELD: | 228 case AccessKind.TOPLEVEL_FIELD: |
| 229 case AccessKind.FINAL_TOPLEVEL_FIELD: | 229 case AccessKind.FINAL_TOPLEVEL_FIELD: |
| 230 return visitor.visitTopLevelFieldInvoke( | 230 return visitor.visitTopLevelFieldInvoke( |
| 231 node, | 231 node, |
| 232 semantics.element, | 232 semantics.element, |
| 233 node.argumentsNode, | 233 node.argumentsNode, |
| 234 callStructure, | 234 callStructure, |
| 235 arg); | 235 arg); |
| 236 case AccessKind.TOPLEVEL_METHOD: | 236 case AccessKind.TOPLEVEL_METHOD: |
| 237 return visitor.visitTopLevelFunctionInvoke( | 237 return visitor.visitTopLevelFunctionInvoke( |
| 238 node, | 238 node, |
| 239 semantics.element, | 239 semantics.element, |
| 240 node.argumentsNode, | 240 node.argumentsNode, |
| 241 callStructure, | 241 callStructure, |
| 242 arg); | 242 arg); |
| 243 case AccessKind.TOPLEVEL_GETTER: | 243 case AccessKind.TOPLEVEL_GETTER: |
| 244 return visitor.visitTopLevelGetterInvoke( | 244 return visitor.visitTopLevelGetterInvoke( |
| 245 node, | 245 node, |
| 246 semantics.element, | 246 semantics.element, |
| 247 node.argumentsNode, | 247 node.argumentsNode, |
| 248 callStructure, | 248 callStructure, |
| 249 arg); | 249 arg); |
| 250 case AccessKind.TOPLEVEL_SETTER: | 250 case AccessKind.TOPLEVEL_SETTER: |
| 251 return visitor.errorTopLevelSetterInvoke( | 251 return visitor.visitTopLevelSetterInvoke( |
| 252 node, | 252 node, |
| 253 semantics.element, | 253 semantics.element, |
| 254 node.argumentsNode, | 254 node.argumentsNode, |
| 255 callStructure, | 255 callStructure, |
| 256 arg); | 256 arg); |
| 257 case AccessKind.CLASS_TYPE_LITERAL: | 257 case AccessKind.CLASS_TYPE_LITERAL: |
| 258 return visitor.visitClassTypeLiteralInvoke( | 258 return visitor.visitClassTypeLiteralInvoke( |
| 259 node, | 259 node, |
| 260 semantics.constant, | 260 semantics.constant, |
| 261 node.argumentsNode, | 261 node.argumentsNode, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 callStructure, | 317 callStructure, |
| 318 arg); | 318 arg); |
| 319 case AccessKind.SUPER_GETTER: | 319 case AccessKind.SUPER_GETTER: |
| 320 return visitor.visitSuperGetterInvoke( | 320 return visitor.visitSuperGetterInvoke( |
| 321 node, | 321 node, |
| 322 semantics.element, | 322 semantics.element, |
| 323 node.argumentsNode, | 323 node.argumentsNode, |
| 324 callStructure, | 324 callStructure, |
| 325 arg); | 325 arg); |
| 326 case AccessKind.SUPER_SETTER: | 326 case AccessKind.SUPER_SETTER: |
| 327 return visitor.errorSuperSetterInvoke( | 327 return visitor.visitSuperSetterInvoke( |
| 328 node, | 328 node, |
| 329 semantics.element, | 329 semantics.element, |
| 330 node.argumentsNode, | 330 node.argumentsNode, |
| 331 callStructure, | 331 callStructure, |
| 332 arg); | 332 arg); |
| 333 case AccessKind.CONSTANT: | 333 case AccessKind.CONSTANT: |
| 334 return visitor.visitConstantInvoke( | 334 return visitor.visitConstantInvoke( |
| 335 node, | 335 node, |
| 336 semantics.constant, | 336 semantics.constant, |
| 337 node.argumentsNode, | 337 node.argumentsNode, |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 return visitor.visitStaticFunctionGet( | 456 return visitor.visitStaticFunctionGet( |
| 457 node, | 457 node, |
| 458 semantics.element, | 458 semantics.element, |
| 459 arg); | 459 arg); |
| 460 case AccessKind.STATIC_GETTER: | 460 case AccessKind.STATIC_GETTER: |
| 461 return visitor.visitStaticGetterGet( | 461 return visitor.visitStaticGetterGet( |
| 462 node, | 462 node, |
| 463 semantics.element, | 463 semantics.element, |
| 464 arg); | 464 arg); |
| 465 case AccessKind.STATIC_SETTER: | 465 case AccessKind.STATIC_SETTER: |
| 466 return visitor.errorStaticSetterGet( | 466 return visitor.visitStaticSetterGet( |
| 467 node, | 467 node, |
| 468 semantics.element, | 468 semantics.element, |
| 469 arg); | 469 arg); |
| 470 case AccessKind.TOPLEVEL_FIELD: | 470 case AccessKind.TOPLEVEL_FIELD: |
| 471 case AccessKind.FINAL_TOPLEVEL_FIELD: | 471 case AccessKind.FINAL_TOPLEVEL_FIELD: |
| 472 return visitor.visitTopLevelFieldGet( | 472 return visitor.visitTopLevelFieldGet( |
| 473 node, | 473 node, |
| 474 semantics.element, | 474 semantics.element, |
| 475 arg); | 475 arg); |
| 476 case AccessKind.TOPLEVEL_METHOD: | 476 case AccessKind.TOPLEVEL_METHOD: |
| 477 return visitor.visitTopLevelFunctionGet( | 477 return visitor.visitTopLevelFunctionGet( |
| 478 node, | 478 node, |
| 479 semantics.element, | 479 semantics.element, |
| 480 arg); | 480 arg); |
| 481 case AccessKind.TOPLEVEL_GETTER: | 481 case AccessKind.TOPLEVEL_GETTER: |
| 482 return visitor.visitTopLevelGetterGet( | 482 return visitor.visitTopLevelGetterGet( |
| 483 node, | 483 node, |
| 484 semantics.element, | 484 semantics.element, |
| 485 arg); | 485 arg); |
| 486 case AccessKind.TOPLEVEL_SETTER: | 486 case AccessKind.TOPLEVEL_SETTER: |
| 487 return visitor.errorTopLevelSetterGet( | 487 return visitor.visitTopLevelSetterGet( |
| 488 node, | 488 node, |
| 489 semantics.element, | 489 semantics.element, |
| 490 arg); | 490 arg); |
| 491 case AccessKind.CLASS_TYPE_LITERAL: | 491 case AccessKind.CLASS_TYPE_LITERAL: |
| 492 return visitor.visitClassTypeLiteralGet( | 492 return visitor.visitClassTypeLiteralGet( |
| 493 node, | 493 node, |
| 494 semantics.constant, | 494 semantics.constant, |
| 495 arg); | 495 arg); |
| 496 case AccessKind.TYPEDEF_TYPE_LITERAL: | 496 case AccessKind.TYPEDEF_TYPE_LITERAL: |
| 497 return visitor.visitTypedefTypeLiteralGet( | 497 return visitor.visitTypedefTypeLiteralGet( |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 return visitor.visitSuperMethodGet( | 529 return visitor.visitSuperMethodGet( |
| 530 node, | 530 node, |
| 531 semantics.element, | 531 semantics.element, |
| 532 arg); | 532 arg); |
| 533 case AccessKind.SUPER_GETTER: | 533 case AccessKind.SUPER_GETTER: |
| 534 return visitor.visitSuperGetterGet( | 534 return visitor.visitSuperGetterGet( |
| 535 node, | 535 node, |
| 536 semantics.element, | 536 semantics.element, |
| 537 arg); | 537 arg); |
| 538 case AccessKind.SUPER_SETTER: | 538 case AccessKind.SUPER_SETTER: |
| 539 return visitor.errorSuperSetterGet( | 539 return visitor.visitSuperSetterGet( |
| 540 node, | 540 node, |
| 541 semantics.element, | 541 semantics.element, |
| 542 arg); | 542 arg); |
| 543 case AccessKind.CONSTANT: | 543 case AccessKind.CONSTANT: |
| 544 return visitor.visitConstantGet( | 544 return visitor.visitConstantGet( |
| 545 node, | 545 node, |
| 546 semantics.constant, | 546 semantics.constant, |
| 547 arg); | 547 arg); |
| 548 case AccessKind.UNRESOLVED: | 548 case AccessKind.UNRESOLVED: |
| 549 return visitor.visitUnresolvedGet( | 549 return visitor.visitUnresolvedGet( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 578 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { | 578 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
| 579 switch (semantics.kind) { | 579 switch (semantics.kind) { |
| 580 case AccessKind.DYNAMIC_PROPERTY: | 580 case AccessKind.DYNAMIC_PROPERTY: |
| 581 return visitor.visitDynamicPropertySet( | 581 return visitor.visitDynamicPropertySet( |
| 582 node, | 582 node, |
| 583 node.receiver, | 583 node.receiver, |
| 584 selector, | 584 selector, |
| 585 node.arguments.single, | 585 node.arguments.single, |
| 586 arg); | 586 arg); |
| 587 case AccessKind.LOCAL_FUNCTION: | 587 case AccessKind.LOCAL_FUNCTION: |
| 588 return visitor.errorLocalFunctionSet( | 588 return visitor.visitLocalFunctionSet( |
| 589 node, | 589 node, |
| 590 semantics.element, | 590 semantics.element, |
| 591 node.arguments.single, | 591 node.arguments.single, |
| 592 arg); | 592 arg); |
| 593 case AccessKind.LOCAL_VARIABLE: | 593 case AccessKind.LOCAL_VARIABLE: |
| 594 return visitor.visitLocalVariableSet( | 594 return visitor.visitLocalVariableSet( |
| 595 node, | 595 node, |
| 596 semantics.element, | 596 semantics.element, |
| 597 node.arguments.single, | 597 node.arguments.single, |
| 598 arg); | 598 arg); |
| 599 case AccessKind.FINAL_LOCAL_VARIABLE: | 599 case AccessKind.FINAL_LOCAL_VARIABLE: |
| 600 return visitor.errorFinalLocalVariableSet( | 600 return visitor.visitFinalLocalVariableSet( |
| 601 node, | 601 node, |
| 602 semantics.element, | 602 semantics.element, |
| 603 node.arguments.single, | 603 node.arguments.single, |
| 604 arg); | 604 arg); |
| 605 case AccessKind.PARAMETER: | 605 case AccessKind.PARAMETER: |
| 606 return visitor.visitParameterSet( | 606 return visitor.visitParameterSet( |
| 607 node, | 607 node, |
| 608 semantics.element, | 608 semantics.element, |
| 609 node.arguments.single, | 609 node.arguments.single, |
| 610 arg); | 610 arg); |
| 611 case AccessKind.FINAL_PARAMETER: | 611 case AccessKind.FINAL_PARAMETER: |
| 612 return visitor.errorFinalParameterSet( | 612 return visitor.visitFinalParameterSet( |
| 613 node, | 613 node, |
| 614 semantics.element, | 614 semantics.element, |
| 615 node.arguments.single, | 615 node.arguments.single, |
| 616 arg); | 616 arg); |
| 617 case AccessKind.STATIC_FIELD: | 617 case AccessKind.STATIC_FIELD: |
| 618 return visitor.visitStaticFieldSet( | 618 return visitor.visitStaticFieldSet( |
| 619 node, | 619 node, |
| 620 semantics.element, | 620 semantics.element, |
| 621 node.arguments.single, | 621 node.arguments.single, |
| 622 arg); | 622 arg); |
| 623 case AccessKind.FINAL_STATIC_FIELD: | 623 case AccessKind.FINAL_STATIC_FIELD: |
| 624 return visitor.errorFinalStaticFieldSet( | 624 return visitor.visitFinalStaticFieldSet( |
| 625 node, | 625 node, |
| 626 semantics.element, | 626 semantics.element, |
| 627 node.arguments.single, | 627 node.arguments.single, |
| 628 arg); | 628 arg); |
| 629 case AccessKind.STATIC_METHOD: | 629 case AccessKind.STATIC_METHOD: |
| 630 return visitor.errorStaticFunctionSet( | 630 return visitor.visitStaticFunctionSet( |
| 631 node, | 631 node, |
| 632 semantics.element, | 632 semantics.element, |
| 633 node.arguments.single, | 633 node.arguments.single, |
| 634 arg); | 634 arg); |
| 635 case AccessKind.STATIC_GETTER: | 635 case AccessKind.STATIC_GETTER: |
| 636 return visitor.errorStaticGetterSet( | 636 return visitor.visitStaticGetterSet( |
| 637 node, | 637 node, |
| 638 semantics.element, | 638 semantics.element, |
| 639 node.arguments.single, | 639 node.arguments.single, |
| 640 arg); | 640 arg); |
| 641 case AccessKind.STATIC_SETTER: | 641 case AccessKind.STATIC_SETTER: |
| 642 return visitor.visitStaticSetterSet( | 642 return visitor.visitStaticSetterSet( |
| 643 node, | 643 node, |
| 644 semantics.element, | 644 semantics.element, |
| 645 node.arguments.single, | 645 node.arguments.single, |
| 646 arg); | 646 arg); |
| 647 case AccessKind.TOPLEVEL_FIELD: | 647 case AccessKind.TOPLEVEL_FIELD: |
| 648 return visitor.visitTopLevelFieldSet( | 648 return visitor.visitTopLevelFieldSet( |
| 649 node, | 649 node, |
| 650 semantics.element, | 650 semantics.element, |
| 651 node.arguments.single, | 651 node.arguments.single, |
| 652 arg); | 652 arg); |
| 653 case AccessKind.FINAL_TOPLEVEL_FIELD: | 653 case AccessKind.FINAL_TOPLEVEL_FIELD: |
| 654 return visitor.errorFinalTopLevelFieldSet( | 654 return visitor.visitFinalTopLevelFieldSet( |
| 655 node, | 655 node, |
| 656 semantics.element, | 656 semantics.element, |
| 657 node.arguments.single, | 657 node.arguments.single, |
| 658 arg); | 658 arg); |
| 659 case AccessKind.TOPLEVEL_METHOD: | 659 case AccessKind.TOPLEVEL_METHOD: |
| 660 return visitor.errorTopLevelFunctionSet( | 660 return visitor.visitTopLevelFunctionSet( |
| 661 node, | 661 node, |
| 662 semantics.element, | 662 semantics.element, |
| 663 node.arguments.single, | 663 node.arguments.single, |
| 664 arg); | 664 arg); |
| 665 case AccessKind.TOPLEVEL_GETTER: | 665 case AccessKind.TOPLEVEL_GETTER: |
| 666 return visitor.errorTopLevelGetterSet( | 666 return visitor.visitTopLevelGetterSet( |
| 667 node, | 667 node, |
| 668 semantics.element, | 668 semantics.element, |
| 669 node.arguments.single, | 669 node.arguments.single, |
| 670 arg); | 670 arg); |
| 671 case AccessKind.TOPLEVEL_SETTER: | 671 case AccessKind.TOPLEVEL_SETTER: |
| 672 return visitor.visitTopLevelSetterSet( | 672 return visitor.visitTopLevelSetterSet( |
| 673 node, | 673 node, |
| 674 semantics.element, | 674 semantics.element, |
| 675 node.arguments.single, | 675 node.arguments.single, |
| 676 arg); | 676 arg); |
| 677 case AccessKind.CLASS_TYPE_LITERAL: | 677 case AccessKind.CLASS_TYPE_LITERAL: |
| 678 return visitor.errorClassTypeLiteralSet( | 678 return visitor.visitClassTypeLiteralSet( |
| 679 node, | 679 node, |
| 680 semantics.constant, | 680 semantics.constant, |
| 681 node.arguments.single, | 681 node.arguments.single, |
| 682 arg); | 682 arg); |
| 683 case AccessKind.TYPEDEF_TYPE_LITERAL: | 683 case AccessKind.TYPEDEF_TYPE_LITERAL: |
| 684 return visitor.errorTypedefTypeLiteralSet( | 684 return visitor.visitTypedefTypeLiteralSet( |
| 685 node, | 685 node, |
| 686 semantics.constant, | 686 semantics.constant, |
| 687 node.arguments.single, | 687 node.arguments.single, |
| 688 arg); | 688 arg); |
| 689 case AccessKind.DYNAMIC_TYPE_LITERAL: | 689 case AccessKind.DYNAMIC_TYPE_LITERAL: |
| 690 return visitor.errorDynamicTypeLiteralSet( | 690 return visitor.visitDynamicTypeLiteralSet( |
| 691 node, | 691 node, |
| 692 semantics.constant, | 692 semantics.constant, |
| 693 node.arguments.single, | 693 node.arguments.single, |
| 694 arg); | 694 arg); |
| 695 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: | 695 case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
| 696 return visitor.errorTypeVariableTypeLiteralSet( | 696 return visitor.visitTypeVariableTypeLiteralSet( |
| 697 node, | 697 node, |
| 698 semantics.element, | 698 semantics.element, |
| 699 node.arguments.single, | 699 node.arguments.single, |
| 700 arg); | 700 arg); |
| 701 case AccessKind.EXPRESSION: | 701 case AccessKind.EXPRESSION: |
| 702 // This is not a valid case. | 702 // This is not a valid case. |
| 703 break; | 703 break; |
| 704 case AccessKind.THIS: | 704 case AccessKind.THIS: |
| 705 // This is not a valid case. | 705 // This is not a valid case. |
| 706 break; | 706 break; |
| 707 case AccessKind.THIS_PROPERTY: | 707 case AccessKind.THIS_PROPERTY: |
| 708 return visitor.visitThisPropertySet( | 708 return visitor.visitThisPropertySet( |
| 709 node, | 709 node, |
| 710 selector, | 710 selector, |
| 711 node.arguments.single, | 711 node.arguments.single, |
| 712 arg); | 712 arg); |
| 713 case AccessKind.SUPER_FIELD: | 713 case AccessKind.SUPER_FIELD: |
| 714 return visitor.visitSuperFieldSet( | 714 return visitor.visitSuperFieldSet( |
| 715 node, | 715 node, |
| 716 semantics.element, | 716 semantics.element, |
| 717 node.arguments.single, | 717 node.arguments.single, |
| 718 arg); | 718 arg); |
| 719 case AccessKind.SUPER_FINAL_FIELD: | 719 case AccessKind.SUPER_FINAL_FIELD: |
| 720 return visitor.errorFinalSuperFieldSet( | 720 return visitor.visitFinalSuperFieldSet( |
| 721 node, | 721 node, |
| 722 semantics.element, | 722 semantics.element, |
| 723 node.arguments.single, | 723 node.arguments.single, |
| 724 arg); | 724 arg); |
| 725 case AccessKind.SUPER_METHOD: | 725 case AccessKind.SUPER_METHOD: |
| 726 return visitor.errorSuperMethodSet( | 726 return visitor.visitSuperMethodSet( |
| 727 node, | 727 node, |
| 728 semantics.element, | 728 semantics.element, |
| 729 node.arguments.single, | 729 node.arguments.single, |
| 730 arg); | 730 arg); |
| 731 case AccessKind.SUPER_GETTER: | 731 case AccessKind.SUPER_GETTER: |
| 732 return visitor.errorSuperGetterSet( | 732 return visitor.visitSuperGetterSet( |
| 733 node, | 733 node, |
| 734 semantics.element, | 734 semantics.element, |
| 735 node.arguments.single, | 735 node.arguments.single, |
| 736 arg); | 736 arg); |
| 737 case AccessKind.SUPER_SETTER: | 737 case AccessKind.SUPER_SETTER: |
| 738 return visitor.visitSuperSetterSet( | 738 return visitor.visitSuperSetterSet( |
| 739 node, | 739 node, |
| 740 semantics.element, | 740 semantics.element, |
| 741 node.arguments.single, | 741 node.arguments.single, |
| 742 arg); | 742 arg); |
| 743 case AccessKind.CONSTANT: | 743 case AccessKind.CONSTANT: |
| 744 // TODO(johnniwinther): Should this be a valid case? | 744 // TODO(johnniwinther): Should this be a valid case? |
| 745 break; | 745 break; |
| 746 case AccessKind.UNRESOLVED_SUPER: | 746 case AccessKind.UNRESOLVED_SUPER: |
| 747 // TODO(johnniwinther): Handle this separately. | 747 // TODO(johnniwinther): Handle this separately. |
| 748 case AccessKind.UNRESOLVED: | 748 case AccessKind.UNRESOLVED: |
| 749 return visitor.errorUnresolvedSet( | 749 return visitor.visitUnresolvedSet( |
| 750 node, | 750 node, |
| 751 semantics.element, | 751 semantics.element, |
| 752 node.arguments.single, | 752 node.arguments.single, |
| 753 arg); | 753 arg); |
| 754 case AccessKind.COMPOUND: | 754 case AccessKind.COMPOUND: |
| 755 // This is not a valid case. | 755 // This is not a valid case. |
| 756 break; | 756 break; |
| 757 } | 757 } |
| 758 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); | 758 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); |
| 759 } | 759 } |
| (...skipping 1770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2530 final ConstructorElement constructor; | 2530 final ConstructorElement constructor; |
| 2531 final Selector selector; | 2531 final Selector selector; |
| 2532 | 2532 |
| 2533 ThisConstructorInvokeStructure(this.constructor, this.selector); | 2533 ThisConstructorInvokeStructure(this.constructor, this.selector); |
| 2534 | 2534 |
| 2535 R dispatch(SemanticDeclarationVisitor<R, A> visitor, Send node, A arg) { | 2535 R dispatch(SemanticDeclarationVisitor<R, A> visitor, Send node, A arg) { |
| 2536 return visitor.visitThisConstructorInvoke( | 2536 return visitor.visitThisConstructorInvoke( |
| 2537 node, constructor, node.argumentsNode, selector, arg); | 2537 node, constructor, node.argumentsNode, selector, arg); |
| 2538 } | 2538 } |
| 2539 } | 2539 } |
| OLD | NEW |