| 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 test.src.serialization.elements_test; | 5 library test.src.serialization.elements_test; |
| 6 | 6 |
| 7 import 'dart:convert'; | 7 import 'dart:convert'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 reason: 'Mismatch in $desc.$modifier: got $got, want $want'); | 541 reason: 'Mismatch in $desc.$modifier: got $got, want $want'); |
| 542 } | 542 } |
| 543 // Validate members. | 543 // Validate members. |
| 544 if (oImpl is Member) { | 544 if (oImpl is Member) { |
| 545 expect(rImpl, new isInstanceOf<Member>(), reason: desc); | 545 expect(rImpl, new isInstanceOf<Member>(), reason: desc); |
| 546 } else { | 546 } else { |
| 547 expect(rImpl, isNot(new isInstanceOf<Member>()), reason: desc); | 547 expect(rImpl, isNot(new isInstanceOf<Member>()), reason: desc); |
| 548 } | 548 } |
| 549 } | 549 } |
| 550 | 550 |
| 551 void compareExecutableElements(ExecutableElement resynthesized, | 551 void compareExecutableElements( |
| 552 ExecutableElement original, String desc) { | 552 ExecutableElement resynthesized, ExecutableElement original, String desc, |
| 553 {bool compareReturnTypes: true}) { |
| 553 compareElements(resynthesized, original, desc); | 554 compareElements(resynthesized, original, desc); |
| 554 expect(resynthesized.parameters.length, original.parameters.length); | 555 compareParameterElementLists( |
| 555 for (int i = 0; i < resynthesized.parameters.length; i++) { | 556 resynthesized.parameters, original.parameters, desc); |
| 556 compareParameterElements( | 557 // TODO(scheglov) remove the condition once initializers have return types. |
| 557 resynthesized.parameters[i], | 558 if (compareReturnTypes) { |
| 558 original.parameters[i], | 559 compareTypes( |
| 559 '$desc parameter ${original.parameters[i].name}'); | 560 resynthesized.returnType, original.returnType, '$desc return type'); |
| 560 } | 561 } |
| 561 compareTypes( | |
| 562 resynthesized.returnType, original.returnType, '$desc return type'); | |
| 563 compareTypes(resynthesized.type, original.type, desc); | 562 compareTypes(resynthesized.type, original.type, desc); |
| 564 expect(resynthesized.typeParameters.length, original.typeParameters.length); | 563 expect(resynthesized.typeParameters.length, original.typeParameters.length); |
| 565 for (int i = 0; i < resynthesized.typeParameters.length; i++) { | 564 for (int i = 0; i < resynthesized.typeParameters.length; i++) { |
| 566 compareTypeParameterElements( | 565 compareTypeParameterElements( |
| 567 resynthesized.typeParameters[i], | 566 resynthesized.typeParameters[i], |
| 568 original.typeParameters[i], | 567 original.typeParameters[i], |
| 569 '$desc type parameter ${original.typeParameters[i].name}'); | 568 '$desc type parameter ${original.typeParameters[i].name}'); |
| 570 } | 569 } |
| 571 if (original is! Member) { | 570 if (original is! Member) { |
| 572 List<FunctionElement> rFunctions = resynthesized.functions; | 571 List<FunctionElement> rFunctions = resynthesized.functions; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 599 resynthesized.combinators[i], original.combinators[i]); | 598 resynthesized.combinators[i], original.combinators[i]); |
| 600 } | 599 } |
| 601 } | 600 } |
| 602 | 601 |
| 603 void compareFieldElements( | 602 void compareFieldElements( |
| 604 FieldElementImpl resynthesized, FieldElementImpl original, String desc) { | 603 FieldElementImpl resynthesized, FieldElementImpl original, String desc) { |
| 605 comparePropertyInducingElements(resynthesized, original, desc); | 604 comparePropertyInducingElements(resynthesized, original, desc); |
| 606 } | 605 } |
| 607 | 606 |
| 608 void compareFunctionElements( | 607 void compareFunctionElements( |
| 609 FunctionElement resynthesized, FunctionElement original, String desc) { | 608 FunctionElement resynthesized, FunctionElement original, String desc, |
| 610 compareExecutableElements(resynthesized, original, desc); | 609 {bool compareReturnTypes: true}) { |
| 610 if (original == null && resynthesized == null) { |
| 611 return; |
| 612 } |
| 613 expect(resynthesized, isNotNull, reason: desc); |
| 614 compareExecutableElements(resynthesized, original, desc, |
| 615 compareReturnTypes: compareReturnTypes); |
| 611 checkPossibleLocalElements(resynthesized, original); | 616 checkPossibleLocalElements(resynthesized, original); |
| 612 } | 617 } |
| 613 | 618 |
| 614 void compareFunctionTypeAliasElements( | 619 void compareFunctionTypeAliasElements( |
| 615 FunctionTypeAliasElementImpl resynthesized, | 620 FunctionTypeAliasElementImpl resynthesized, |
| 616 FunctionTypeAliasElementImpl original, | 621 FunctionTypeAliasElementImpl original, |
| 617 String desc) { | 622 String desc) { |
| 618 compareElements(resynthesized, original, desc); | 623 compareElements(resynthesized, original, desc); |
| 619 expect(resynthesized.parameters.length, original.parameters.length); | 624 compareParameterElementLists( |
| 620 for (int i = 0; i < resynthesized.parameters.length; i++) { | 625 resynthesized.parameters, original.parameters, desc); |
| 621 compareParameterElements( | |
| 622 resynthesized.parameters[i], | |
| 623 original.parameters[i], | |
| 624 '$desc parameter ${original.parameters[i].name}'); | |
| 625 } | |
| 626 compareTypes( | 626 compareTypes( |
| 627 resynthesized.returnType, original.returnType, '$desc return type'); | 627 resynthesized.returnType, original.returnType, '$desc return type'); |
| 628 compareTypes(resynthesized.type, original.type, desc); | 628 compareTypes(resynthesized.type, original.type, desc); |
| 629 expect(resynthesized.typeParameters.length, original.typeParameters.length); | 629 expect(resynthesized.typeParameters.length, original.typeParameters.length); |
| 630 for (int i = 0; i < resynthesized.typeParameters.length; i++) { | 630 for (int i = 0; i < resynthesized.typeParameters.length; i++) { |
| 631 compareTypeParameterElements( | 631 compareTypeParameterElements( |
| 632 resynthesized.typeParameters[i], | 632 resynthesized.typeParameters[i], |
| 633 original.typeParameters[i], | 633 original.typeParameters[i], |
| 634 '$desc type parameter ${original.typeParameters[i].name}'); | 634 '$desc type parameter ${original.typeParameters[i].name}'); |
| 635 } | 635 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 Map<String, Element> originalMap = original.definedNames; | 692 Map<String, Element> originalMap = original.definedNames; |
| 693 expect(resynthesizedMap.keys.toSet(), originalMap.keys.toSet(), | 693 expect(resynthesizedMap.keys.toSet(), originalMap.keys.toSet(), |
| 694 reason: desc); | 694 reason: desc); |
| 695 for (String key in originalMap.keys) { | 695 for (String key in originalMap.keys) { |
| 696 Element resynthesizedElement = resynthesizedMap[key]; | 696 Element resynthesizedElement = resynthesizedMap[key]; |
| 697 Element originalElement = originalMap[key]; | 697 Element originalElement = originalMap[key]; |
| 698 compareElements(resynthesizedElement, originalElement, key); | 698 compareElements(resynthesizedElement, originalElement, key); |
| 699 } | 699 } |
| 700 } | 700 } |
| 701 | 701 |
| 702 void compareParameterElementLists( |
| 703 List<ParameterElement> resynthesizedParameters, |
| 704 List<ParameterElement> originalParameters, |
| 705 String desc) { |
| 706 expect(resynthesizedParameters.length, originalParameters.length); |
| 707 for (int i = 0; i < resynthesizedParameters.length; i++) { |
| 708 compareParameterElements( |
| 709 resynthesizedParameters[i], |
| 710 originalParameters[i], |
| 711 '$desc parameter ${originalParameters[i].name}'); |
| 712 } |
| 713 } |
| 714 |
| 702 void compareParameterElements( | 715 void compareParameterElements( |
| 703 ParameterElement resynthesized, ParameterElement original, String desc) { | 716 ParameterElement resynthesized, ParameterElement original, String desc) { |
| 704 compareVariableElements(resynthesized, original, desc); | 717 compareVariableElements(resynthesized, original, desc); |
| 705 expect(resynthesized.parameters.length, original.parameters.length); | 718 compareParameterElementLists( |
| 706 for (int i = 0; i < resynthesized.parameters.length; i++) { | 719 resynthesized.parameters, original.parameters, desc); |
| 707 compareParameterElements( | |
| 708 resynthesized.parameters[i], | |
| 709 original.parameters[i], | |
| 710 '$desc parameter ${original.parameters[i].name}'); | |
| 711 } | |
| 712 expect(resynthesized.parameterKind, original.parameterKind); | 720 expect(resynthesized.parameterKind, original.parameterKind); |
| 713 expect(resynthesized.isInitializingFormal, original.isInitializingFormal, | 721 expect(resynthesized.isInitializingFormal, original.isInitializingFormal, |
| 714 reason: desc); | 722 reason: desc); |
| 715 expect(resynthesized is FieldFormalParameterElementImpl, | 723 expect(resynthesized is FieldFormalParameterElementImpl, |
| 716 original is FieldFormalParameterElementImpl); | 724 original is FieldFormalParameterElementImpl); |
| 717 if (resynthesized is FieldFormalParameterElementImpl && | 725 if (resynthesized is FieldFormalParameterElementImpl && |
| 718 original is FieldFormalParameterElementImpl) { | 726 original is FieldFormalParameterElementImpl) { |
| 719 if (original.field == null) { | 727 if (original.field == null) { |
| 720 expect(resynthesized.field, isNull, reason: '$desc field'); | 728 expect(resynthesized.field, isNull, reason: '$desc field'); |
| 721 } else { | 729 } else { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 860 expect(resynthesized.uriOffset, original.uriOffset, reason: desc); | 868 expect(resynthesized.uriOffset, original.uriOffset, reason: desc); |
| 861 expect(resynthesized.uriEnd, original.uriEnd, reason: desc); | 869 expect(resynthesized.uriEnd, original.uriEnd, reason: desc); |
| 862 } | 870 } |
| 863 | 871 |
| 864 void compareVariableElements( | 872 void compareVariableElements( |
| 865 VariableElement resynthesized, VariableElement original, String desc) { | 873 VariableElement resynthesized, VariableElement original, String desc) { |
| 866 compareElements(resynthesized, original, desc); | 874 compareElements(resynthesized, original, desc); |
| 867 compareTypes(resynthesized.type, original.type, desc); | 875 compareTypes(resynthesized.type, original.type, desc); |
| 868 // TODO(scheglov) VariableMember.initializer is not implemented | 876 // TODO(scheglov) VariableMember.initializer is not implemented |
| 869 if (original is! VariableMember) { | 877 if (original is! VariableMember) { |
| 870 compareVariableInitializers( | 878 compareFunctionElements( |
| 871 resynthesized.initializer, original.initializer, desc); | 879 resynthesized.initializer, original.initializer, desc, |
| 880 compareReturnTypes: false); |
| 872 } | 881 } |
| 873 VariableElementImpl originalActual = getActualElement(original, desc); | 882 VariableElementImpl originalActual = getActualElement(original, desc); |
| 874 if (originalActual is ConstVariableElement) { | 883 if (originalActual is ConstVariableElement) { |
| 875 VariableElementImpl resynthesizedActual = | 884 VariableElementImpl resynthesizedActual = |
| 876 getActualElement(resynthesized, desc); | 885 getActualElement(resynthesized, desc); |
| 877 Expression initializer = resynthesizedActual.constantInitializer; | 886 Expression initializer = resynthesizedActual.constantInitializer; |
| 878 if (constantInitializersAreInvalid) { | 887 if (constantInitializersAreInvalid) { |
| 879 _assertUnresolvedIdentifier(initializer, desc); | 888 _assertUnresolvedIdentifier(initializer, desc); |
| 880 } else { | 889 } else { |
| 881 compareConstAsts(initializer, originalActual.constantInitializer, | 890 compareConstAsts(initializer, originalActual.constantInitializer, |
| 882 '$desc initializer'); | 891 '$desc initializer'); |
| 883 } | 892 } |
| 884 } | 893 } |
| 885 checkPossibleMember(resynthesized, original, desc); | 894 checkPossibleMember(resynthesized, original, desc); |
| 886 checkPossibleLocalElements(resynthesized, original); | 895 checkPossibleLocalElements(resynthesized, original); |
| 887 } | 896 } |
| 888 | 897 |
| 889 void compareVariableInitializers( | |
| 890 FunctionElement resynthesized, FunctionElement original, String desc) { | |
| 891 if (original == null && resynthesized == null) { | |
| 892 return; | |
| 893 } | |
| 894 expect(resynthesized, isNotNull, reason: desc); | |
| 895 expect(resynthesized.nameOffset, original.nameOffset, reason: desc); | |
| 896 expect(resynthesized.name, original.name, reason: desc); | |
| 897 expect(resynthesized.isSynthetic, original.isSynthetic, reason: desc); | |
| 898 // TODO(scheglov) replace this method with compareFunctionElements() | |
| 899 // once we resynthesize initializers return types. | |
| 900 } | |
| 901 | |
| 902 /** | 898 /** |
| 903 * Serialize the given [library] into a summary. Then create a | 899 * Serialize the given [library] into a summary. Then create a |
| 904 * [_TestSummaryResynthesizer] which can deserialize it, along with any | 900 * [_TestSummaryResynthesizer] which can deserialize it, along with any |
| 905 * references it makes to `dart:core`. | 901 * references it makes to `dart:core`. |
| 906 * | 902 * |
| 907 * Errors will lead to a test failure unless [allowErrors] is `true`. | 903 * Errors will lead to a test failure unless [allowErrors] is `true`. |
| 908 */ | 904 */ |
| 909 _TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library, | 905 _TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library, |
| 910 {bool allowErrors: false, bool dumpSummaries: false}) { | 906 {bool allowErrors: false, bool dumpSummaries: false}) { |
| 911 if (!allowErrors) { | 907 if (!allowErrors) { |
| (...skipping 2784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3696 fail('Unexpectedly tried to get unlinked summary for $uri'); | 3692 fail('Unexpectedly tried to get unlinked summary for $uri'); |
| 3697 } | 3693 } |
| 3698 return serializedUnit; | 3694 return serializedUnit; |
| 3699 } | 3695 } |
| 3700 | 3696 |
| 3701 @override | 3697 @override |
| 3702 bool hasLibrarySummary(String uri) { | 3698 bool hasLibrarySummary(String uri) { |
| 3703 return true; | 3699 return true; |
| 3704 } | 3700 } |
| 3705 } | 3701 } |
| OLD | NEW |