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 file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library analyzer.test.src.summary.resynthesize_ast_test; | 5 library analyzer.test.src.summary.resynthesize_ast_test; |
6 | 6 |
7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
8 import 'package:analyzer/dart/element/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
9 import 'package:analyzer/src/dart/element/element.dart'; | 9 import 'package:analyzer/src/dart/element/element.dart'; |
10 import 'package:analyzer/src/generated/engine.dart' | 10 import 'package:analyzer/src/generated/engine.dart' |
11 show AnalysisContext, AnalysisOptionsImpl; | 11 show AnalysisContext, AnalysisOptionsImpl; |
12 import 'package:analyzer/src/generated/sdk.dart'; | 12 import 'package:analyzer/src/generated/sdk.dart'; |
13 import 'package:analyzer/src/generated/source.dart'; | 13 import 'package:analyzer/src/generated/source.dart'; |
14 import 'package:analyzer/src/summary/format.dart'; | 14 import 'package:analyzer/src/summary/format.dart'; |
15 import 'package:analyzer/src/summary/idl.dart'; | 15 import 'package:analyzer/src/summary/idl.dart'; |
16 import 'package:analyzer/src/summary/link.dart'; | 16 import 'package:analyzer/src/summary/link.dart'; |
17 import 'package:analyzer/src/summary/prelink.dart'; | 17 import 'package:analyzer/src/summary/prelink.dart'; |
18 import 'package:analyzer/src/summary/resynthesize.dart'; | 18 import 'package:analyzer/src/summary/resynthesize.dart'; |
19 import 'package:analyzer/src/summary/summarize_ast.dart'; | 19 import 'package:analyzer/src/summary/summarize_ast.dart'; |
20 import 'package:analyzer/src/summary/summarize_elements.dart' | 20 import 'package:analyzer/src/summary/summarize_elements.dart' |
21 show PackageBundleAssembler; | 21 show PackageBundleAssembler; |
22 import 'package:analyzer/task/dart.dart' show PARSED_UNIT; | 22 import 'package:analyzer/task/dart.dart' show PARSED_UNIT; |
| 23 import 'package:analyzer/task/general.dart'; |
23 import 'package:unittest/unittest.dart'; | 24 import 'package:unittest/unittest.dart'; |
24 | 25 |
25 import '../../reflective_tests.dart'; | 26 import '../../reflective_tests.dart'; |
26 import '../context/abstract_context.dart'; | 27 import '../context/abstract_context.dart'; |
27 import '../task/strong/inferred_type_test.dart'; | 28 import '../task/strong/inferred_type_test.dart'; |
28 import 'resynthesize_test.dart'; | 29 import 'resynthesize_test.dart'; |
29 import 'summary_common.dart'; | 30 import 'summary_common.dart'; |
30 | 31 |
31 main() { | 32 main() { |
32 groupSep = ' | '; | 33 groupSep = ' | '; |
33 runReflectiveTests(ResynthesizeAstTest); | 34 runReflectiveTests(ResynthesizeAstTest); |
34 runReflectiveTests(AstInferredTypeTest); | 35 runReflectiveTests(AstInferredTypeTest); |
35 } | 36 } |
36 | 37 |
37 @reflectiveTest | 38 @reflectiveTest |
38 class AstInferredTypeTest extends AbstractResynthesizeTest | 39 class AstInferredTypeTest extends AbstractResynthesizeTest |
39 with _AstResynthesizeTestMixin, InferredTypeMixin { | 40 with _AstResynthesizeTestMixin, InferredTypeMixin { |
| 41 @override |
| 42 bool allowMissingFiles = false; |
| 43 |
40 bool get checkPropagatedTypes { | 44 bool get checkPropagatedTypes { |
41 // AST-based summaries do not yet handle propagated types. | 45 // AST-based summaries do not yet handle propagated types. |
42 // TODO(paulberry): fix this. | 46 // TODO(paulberry): fix this. |
43 return false; | 47 return false; |
44 } | 48 } |
45 | 49 |
46 @override | 50 @override |
47 bool get mayCheckTypesOfLocals => false; | 51 bool get mayCheckTypesOfLocals => false; |
48 | 52 |
49 @override | 53 @override |
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 LibraryElementImpl original = context.computeLibraryElement(source); | 687 LibraryElementImpl original = context.computeLibraryElement(source); |
684 checkLibraryElements(original, resynthesized); | 688 checkLibraryElements(original, resynthesized); |
685 return resynthesized; | 689 return resynthesized; |
686 } | 690 } |
687 } | 691 } |
688 | 692 |
689 @reflectiveTest | 693 @reflectiveTest |
690 class ResynthesizeAstTest extends ResynthesizeTest | 694 class ResynthesizeAstTest extends ResynthesizeTest |
691 with _AstResynthesizeTestMixin { | 695 with _AstResynthesizeTestMixin { |
692 @override | 696 @override |
| 697 bool allowMissingFiles = false; |
| 698 |
| 699 @override |
693 bool get checkPropagatedTypes => false; | 700 bool get checkPropagatedTypes => false; |
694 | 701 |
695 @override | 702 @override |
696 LibraryElementImpl checkLibrary(String text, | 703 LibraryElementImpl checkLibrary(String text, |
697 {bool allowErrors: false, bool dumpSummaries: false}) { | 704 {bool allowErrors: false, bool dumpSummaries: false}) { |
698 Source source = addTestSource(text); | 705 Source source = addTestSource(text); |
699 LibraryElementImpl resynthesized = _encodeDecodeLibraryElement(source); | 706 LibraryElementImpl resynthesized = _encodeDecodeLibraryElement(source); |
700 LibraryElementImpl original = context.computeLibraryElement(source); | 707 LibraryElementImpl original = context.computeLibraryElement(source); |
701 checkLibraryElements(original, resynthesized); | 708 checkLibraryElements(original, resynthesized); |
702 return resynthesized; | 709 return resynthesized; |
(...skipping 10 matching lines...) Expand all Loading... |
713 | 720 |
714 /** | 721 /** |
715 * Abstract mixin for serializing ASTs and resynthesizing elements from it. | 722 * Abstract mixin for serializing ASTs and resynthesizing elements from it. |
716 */ | 723 */ |
717 abstract class _AstResynthesizeTestMixin { | 724 abstract class _AstResynthesizeTestMixin { |
718 final Set<Source> serializedSources = new Set<Source>(); | 725 final Set<Source> serializedSources = new Set<Source>(); |
719 final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler(); | 726 final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler(); |
720 final Map<String, UnlinkedUnitBuilder> uriToUnit = | 727 final Map<String, UnlinkedUnitBuilder> uriToUnit = |
721 <String, UnlinkedUnitBuilder>{}; | 728 <String, UnlinkedUnitBuilder>{}; |
722 | 729 |
| 730 bool get allowMissingFiles; |
| 731 |
723 AnalysisContext get context; | 732 AnalysisContext get context; |
724 | 733 |
725 LibraryElementImpl _encodeDecodeLibraryElement(Source source) { | 734 LibraryElementImpl _encodeDecodeLibraryElement(Source source) { |
726 SummaryResynthesizer resynthesizer = _encodeLibrary(source); | 735 SummaryResynthesizer resynthesizer = _encodeLibrary(source); |
727 return resynthesizer.getLibraryElement(source.uri.toString()); | 736 return resynthesizer.getLibraryElement(source.uri.toString()); |
728 } | 737 } |
729 | 738 |
730 TestSummaryResynthesizer _encodeLibrary(Source source) { | 739 TestSummaryResynthesizer _encodeLibrary(Source source) { |
731 _serializeLibrary(source); | 740 _serializeLibrary(source); |
732 | 741 |
733 PackageBundle bundle = | 742 PackageBundle bundle = |
734 new PackageBundle.fromBuffer(bundleAssembler.assemble().toBuffer()); | 743 new PackageBundle.fromBuffer(bundleAssembler.assemble().toBuffer()); |
735 | 744 |
736 Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{}; | 745 Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{}; |
737 for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) { | 746 for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) { |
738 String uri = bundle.unlinkedUnitUris[i]; | 747 String uri = bundle.unlinkedUnitUris[i]; |
739 unlinkedSummaries[uri] = bundle.unlinkedUnits[i]; | 748 unlinkedSummaries[uri] = bundle.unlinkedUnits[i]; |
740 } | 749 } |
741 | 750 |
742 LinkedLibrary getDependency(String absoluteUri) { | 751 LinkedLibrary getDependency(String absoluteUri) { |
743 Map<String, LinkedLibrary> sdkLibraries = | 752 Map<String, LinkedLibrary> sdkLibraries = |
744 SerializedMockSdk.instance.uriToLinkedLibrary; | 753 SerializedMockSdk.instance.uriToLinkedLibrary; |
745 LinkedLibrary linkedLibrary = sdkLibraries[absoluteUri]; | 754 LinkedLibrary linkedLibrary = sdkLibraries[absoluteUri]; |
746 if (linkedLibrary == null) { | 755 if (linkedLibrary == null && !allowMissingFiles) { |
747 fail('Linker unexpectedly requested LinkedLibrary for "$absoluteUri".' | 756 fail('Linker unexpectedly requested LinkedLibrary for "$absoluteUri".' |
748 ' Libraries available: ${sdkLibraries.keys}'); | 757 ' Libraries available: ${sdkLibraries.keys}'); |
749 } | 758 } |
750 return linkedLibrary; | 759 return linkedLibrary; |
751 } | 760 } |
752 | 761 |
753 UnlinkedUnit getUnit(String absoluteUri) { | 762 UnlinkedUnit getUnit(String absoluteUri) { |
754 UnlinkedUnit unit = uriToUnit[absoluteUri] ?? | 763 UnlinkedUnit unit = uriToUnit[absoluteUri] ?? |
755 SerializedMockSdk.instance.uriToUnlinkedUnit[absoluteUri]; | 764 SerializedMockSdk.instance.uriToUnlinkedUnit[absoluteUri]; |
756 if (unit == null) { | 765 if (unit == null && !allowMissingFiles) { |
757 fail('Linker unexpectedly requested unit for "$absoluteUri".'); | 766 fail('Linker unexpectedly requested unit for "$absoluteUri".'); |
758 } | 767 } |
759 return unit; | 768 return unit; |
760 } | 769 } |
761 | 770 |
762 Set<String> nonSdkLibraryUris = context.sources | 771 Set<String> nonSdkLibraryUris = context.sources |
763 .where((Source source) => | 772 .where((Source source) => |
764 !source.isInSystemLibrary && | 773 !source.isInSystemLibrary && |
765 context.computeKindOf(source) == SourceKind.LIBRARY) | 774 context.computeKindOf(source) == SourceKind.LIBRARY) |
766 .map((Source source) => source.uri.toString()) | 775 .map((Source source) => source.uri.toString()) |
767 .toSet(); | 776 .toSet(); |
768 | 777 |
769 Map<String, LinkedLibrary> linkedSummaries = link(nonSdkLibraryUris, | 778 Map<String, LinkedLibrary> linkedSummaries = link(nonSdkLibraryUris, |
770 getDependency, getUnit, context.analysisOptions.strongMode); | 779 getDependency, getUnit, context.analysisOptions.strongMode); |
771 | 780 |
772 return new TestSummaryResynthesizer( | 781 return new TestSummaryResynthesizer( |
773 null, | 782 null, |
774 context, | 783 context, |
775 new Map<String, UnlinkedUnit>() | 784 new Map<String, UnlinkedUnit>() |
776 ..addAll(SerializedMockSdk.instance.uriToUnlinkedUnit) | 785 ..addAll(SerializedMockSdk.instance.uriToUnlinkedUnit) |
777 ..addAll(unlinkedSummaries), | 786 ..addAll(unlinkedSummaries), |
778 new Map<String, LinkedLibrary>() | 787 new Map<String, LinkedLibrary>() |
779 ..addAll(SerializedMockSdk.instance.uriToLinkedLibrary) | 788 ..addAll(SerializedMockSdk.instance.uriToLinkedLibrary) |
780 ..addAll(linkedSummaries)); | 789 ..addAll(linkedSummaries), |
| 790 allowMissingFiles); |
781 } | 791 } |
782 | 792 |
783 UnlinkedUnit _getUnlinkedUnit(Source source) { | 793 UnlinkedUnit _getUnlinkedUnit(Source source) { |
784 String uriStr = source.uri.toString(); | 794 String uriStr = source.uri.toString(); |
785 { | 795 { |
786 UnlinkedUnit unlinkedUnitInSdk = | 796 UnlinkedUnit unlinkedUnitInSdk = |
787 SerializedMockSdk.instance.uriToUnlinkedUnit[uriStr]; | 797 SerializedMockSdk.instance.uriToUnlinkedUnit[uriStr]; |
788 if (unlinkedUnitInSdk != null) { | 798 if (unlinkedUnitInSdk != null) { |
789 return unlinkedUnitInSdk; | 799 return unlinkedUnitInSdk; |
790 } | 800 } |
791 } | 801 } |
792 return uriToUnit.putIfAbsent(uriStr, () { | 802 return uriToUnit.putIfAbsent(uriStr, () { |
| 803 int modificationTime = context.computeResult(source, MODIFICATION_TIME); |
| 804 if (modificationTime < 0) { |
| 805 // Source does not exist. |
| 806 if (!allowMissingFiles) { |
| 807 fail('Unexpectedly tried to get unlinked summary for $source'); |
| 808 } |
| 809 return null; |
| 810 } |
793 CompilationUnit unit = context.computeResult(source, PARSED_UNIT); | 811 CompilationUnit unit = context.computeResult(source, PARSED_UNIT); |
794 UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit); | 812 UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit); |
795 bundleAssembler.addUnlinkedUnit(source, unlinkedUnit); | 813 bundleAssembler.addUnlinkedUnit(source, unlinkedUnit); |
796 return unlinkedUnit; | 814 return unlinkedUnit; |
797 }); | 815 }); |
798 } | 816 } |
799 | 817 |
800 void _serializeLibrary(Source librarySource) { | 818 void _serializeLibrary(Source librarySource) { |
801 if (librarySource.isInSystemLibrary) { | 819 if (librarySource.isInSystemLibrary) { |
802 return; | 820 return; |
(...skipping 10 matching lines...) Expand all Loading... |
813 '$librarySource (${librarySource.runtimeType})'); | 831 '$librarySource (${librarySource.runtimeType})'); |
814 } | 832 } |
815 return resolvedSource; | 833 return resolvedSource; |
816 } | 834 } |
817 | 835 |
818 UnlinkedUnit getPart(String relativeUri) { | 836 UnlinkedUnit getPart(String relativeUri) { |
819 return _getUnlinkedUnit(resolveRelativeUri(relativeUri)); | 837 return _getUnlinkedUnit(resolveRelativeUri(relativeUri)); |
820 } | 838 } |
821 | 839 |
822 UnlinkedPublicNamespace getImport(String relativeUri) { | 840 UnlinkedPublicNamespace getImport(String relativeUri) { |
823 return getPart(relativeUri).publicNamespace; | 841 return getPart(relativeUri)?.publicNamespace; |
824 } | 842 } |
825 | 843 |
826 UnlinkedUnit definingUnit = _getUnlinkedUnit(librarySource); | 844 UnlinkedUnit definingUnit = _getUnlinkedUnit(librarySource); |
827 LinkedLibraryBuilder linkedLibrary = | 845 if (definingUnit != null) { |
828 prelink(definingUnit, getPart, getImport); | 846 LinkedLibraryBuilder linkedLibrary = |
829 linkedLibrary.dependencies.skip(1).forEach((LinkedDependency d) { | 847 prelink(definingUnit, getPart, getImport); |
830 _serializeLibrary(resolveRelativeUri(d.uri)); | 848 linkedLibrary.dependencies.skip(1).forEach((LinkedDependency d) { |
831 }); | 849 _serializeLibrary(resolveRelativeUri(d.uri)); |
| 850 }); |
| 851 } |
832 } | 852 } |
833 } | 853 } |
OLD | NEW |