| 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 library kernel.analyzer.loader; | 4 library kernel.analyzer.loader; |
| 5 | 5 |
| 6 import 'dart:async'; | 6 import 'dart:async'; |
| 7 import 'dart:io' as io; | 7 import 'dart:io' as io; |
| 8 | 8 |
| 9 import 'package:analyzer/analyzer.dart'; | 9 import 'package:analyzer/analyzer.dart'; |
| 10 import 'package:analyzer/file_system/file_system.dart'; | 10 import 'package:analyzer/file_system/file_system.dart'; |
| 11 import 'package:analyzer/file_system/physical_file_system.dart'; | 11 import 'package:analyzer/file_system/physical_file_system.dart'; |
| 12 import 'package:analyzer/source/package_map_resolver.dart'; | 12 import 'package:analyzer/source/package_map_resolver.dart'; |
| 13 import 'package:analyzer/src/dart/scanner/scanner.dart'; | 13 import 'package:analyzer/src/dart/scanner/scanner.dart'; |
| 14 import 'package:analyzer/src/dart/sdk/sdk.dart'; | 14 import 'package:analyzer/src/dart/sdk/sdk.dart'; |
| 15 import 'package:analyzer/src/generated/engine.dart'; | 15 import 'package:analyzer/src/generated/engine.dart'; |
| 16 import 'package:analyzer/src/generated/parser.dart'; | 16 import 'package:analyzer/src/generated/parser.dart'; |
| 17 import 'package:analyzer/src/generated/sdk.dart'; | 17 import 'package:analyzer/src/generated/sdk.dart'; |
| 18 import 'package:analyzer/src/generated/source_io.dart'; | 18 import 'package:analyzer/src/generated/source_io.dart'; |
| 19 import 'package:analyzer/src/summary/summary_sdk.dart'; |
| 19 import 'package:kernel/application_root.dart'; | 20 import 'package:kernel/application_root.dart'; |
| 20 import 'package:package_config/discovery.dart'; | 21 import 'package:package_config/discovery.dart'; |
| 21 import 'package:package_config/packages.dart'; | 22 import 'package:package_config/packages.dart'; |
| 22 | 23 |
| 23 import '../ast.dart' as ast; | 24 import '../ast.dart' as ast; |
| 24 import '../repository.dart'; | 25 import '../repository.dart'; |
| 25 import '../target/targets.dart' show Target; | 26 import '../target/targets.dart' show Target; |
| 26 import '../type_algebra.dart'; | 27 import '../type_algebra.dart'; |
| 27 import 'analyzer.dart'; | 28 import 'analyzer.dart'; |
| 28 import 'ast_from_analyzer.dart'; | 29 import 'ast_from_analyzer.dart'; |
| 29 | 30 |
| 30 /// Options passed to the Dart frontend. | 31 /// Options passed to the Dart frontend. |
| 31 class DartOptions { | 32 class DartOptions { |
| 32 /// True if user code should be loaded in strong mode. | 33 /// True if user code should be loaded in strong mode. |
| 33 bool strongMode; | 34 bool strongMode; |
| 34 | 35 |
| 35 /// True if the Dart SDK should be loaded in strong mode. | 36 /// True if the Dart SDK should be loaded in strong mode. |
| 36 bool strongModeSdk; | 37 bool strongModeSdk; |
| 38 |
| 39 /// Path to the sdk sources, ignored if sdkSummary is provided. |
| 37 String sdk; | 40 String sdk; |
| 41 |
| 42 /// Path to a summary of the sdk sources. |
| 43 String sdkSummary; |
| 44 |
| 45 /// Path to the `.packages` file. |
| 38 String packagePath; | 46 String packagePath; |
| 47 |
| 48 /// Root used to relativize app file-urls, making them machine agnostic. |
| 39 ApplicationRoot applicationRoot; | 49 ApplicationRoot applicationRoot; |
| 50 |
| 40 Map<Uri, Uri> customUriMappings; | 51 Map<Uri, Uri> customUriMappings; |
| 52 |
| 53 /// Environment definitions provided via `-Dkey=value`. |
| 41 Map<String, String> declaredVariables; | 54 Map<String, String> declaredVariables; |
| 42 | 55 |
| 43 DartOptions( | 56 DartOptions( |
| 44 {bool strongMode: false, | 57 {bool strongMode: false, |
| 45 bool strongModeSdk, | 58 bool strongModeSdk, |
| 46 this.sdk, | 59 this.sdk, |
| 60 this.sdkSummary, |
| 47 this.packagePath, | 61 this.packagePath, |
| 48 ApplicationRoot applicationRoot, | 62 ApplicationRoot applicationRoot, |
| 49 Map<Uri, Uri> customUriMappings, | 63 Map<Uri, Uri> customUriMappings, |
| 50 Map<String, String> declaredVariables}) | 64 Map<String, String> declaredVariables}) |
| 51 : this.customUriMappings = customUriMappings ?? <Uri, Uri>{}, | 65 : this.customUriMappings = customUriMappings ?? <Uri, Uri>{}, |
| 52 this.declaredVariables = declaredVariables ?? <String, String>{}, | 66 this.declaredVariables = declaredVariables ?? <String, String>{}, |
| 53 this.strongMode = strongMode, | 67 this.strongMode = strongMode, |
| 54 this.strongModeSdk = strongModeSdk ?? strongMode, | 68 this.strongModeSdk = strongModeSdk ?? strongMode, |
| 55 this.applicationRoot = applicationRoot ?? new ApplicationRoot.none(); | 69 this.applicationRoot = applicationRoot ?? new ApplicationRoot.none(); |
| 56 } | 70 } |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 if (error.errorCode is CompileTimeErrorCode || | 627 if (error.errorCode is CompileTimeErrorCode || |
| 614 error.errorCode is ParserErrorCode || | 628 error.errorCode is ParserErrorCode || |
| 615 error.errorCode is ScannerErrorCode || | 629 error.errorCode is ScannerErrorCode || |
| 616 error.errorCode is StrongModeCode) { | 630 error.errorCode is StrongModeCode) { |
| 617 lines ??= context.computeLineInfo(source); | 631 lines ??= context.computeLineInfo(source); |
| 618 errors.add(formatErrorMessage(error, source.shortName, lines)); | 632 errors.add(formatErrorMessage(error, source.shortName, lines)); |
| 619 } | 633 } |
| 620 } | 634 } |
| 621 } | 635 } |
| 622 | 636 |
| 623 void loadEverything({Target target}) { | 637 void loadEverything({Target target, bool compileSdk}) { |
| 624 ensureLibraryIsLoaded(getLibraryReference(getDartCoreLibrary())); | 638 compileSdk ??= true; |
| 625 if (target != null) { | 639 if (compileSdk) { |
| 626 for (var uri in target.extraRequiredLibraries) { | 640 ensureLibraryIsLoaded(getLibraryReference(getDartCoreLibrary())); |
| 627 var library = _findLibraryElement(uri); | 641 if (target != null) { |
| 628 if (library == null) { | 642 for (var uri in target.extraRequiredLibraries) { |
| 629 errors.add('Could not find required library $uri'); | 643 var library = _findLibraryElement(uri); |
| 630 continue; | 644 if (library == null) { |
| 645 errors.add('Could not find required library $uri'); |
| 646 continue; |
| 647 } |
| 648 ensureLibraryIsLoaded(getLibraryReference(library)); |
| 631 } | 649 } |
| 632 ensureLibraryIsLoaded(getLibraryReference(library)); | |
| 633 } | 650 } |
| 634 } | 651 } |
| 635 for (int i = 0; i < repository.libraries.length; ++i) { | 652 for (int i = 0; i < repository.libraries.length; ++i) { |
| 636 ensureLibraryIsLoaded(repository.libraries[i]); | 653 var library = repository.libraries[i]; |
| 654 if (compileSdk || library.importUri.scheme != 'dart') { |
| 655 ensureLibraryIsLoaded(library); |
| 656 } |
| 637 } | 657 } |
| 638 } | 658 } |
| 639 | 659 |
| 640 /// Builds a list of sources that have been loaded. | 660 /// Builds a list of sources that have been loaded. |
| 641 /// | 661 /// |
| 642 /// This operation may be expensive and should only be used for diagnostics. | 662 /// This operation may be expensive and should only be used for diagnostics. |
| 643 List<String> getLoadedFileNames() { | 663 List<String> getLoadedFileNames() { |
| 644 var list = <String>[]; | 664 var list = <String>[]; |
| 645 for (var library in repository.libraries) { | 665 for (var library in repository.libraries) { |
| 646 LibraryElement element = context.computeLibraryElement(context | 666 LibraryElement element = context.computeLibraryElement(context |
| 647 .sourceFactory | 667 .sourceFactory |
| 648 .forUri2(applicationRoot.absoluteUri(library.importUri))); | 668 .forUri2(applicationRoot.absoluteUri(library.importUri))); |
| 649 for (var unit in element.units) { | 669 for (var unit in element.units) { |
| 650 list.add(unit.source.fullName); | 670 list.add(unit.source.fullName); |
| 651 } | 671 } |
| 652 } | 672 } |
| 653 return list; | 673 return list; |
| 654 } | 674 } |
| 655 | 675 |
| 656 void _iterateWorklist() { | 676 void _iterateWorklist() { |
| 657 while (temporaryClassWorklist.isNotEmpty) { | 677 while (temporaryClassWorklist.isNotEmpty) { |
| 658 var element = temporaryClassWorklist.removeLast(); | 678 var element = temporaryClassWorklist.removeLast(); |
| 659 promoteToTypeLevel(element); | 679 promoteToTypeLevel(element); |
| 660 } | 680 } |
| 661 } | 681 } |
| 662 | 682 |
| 663 ast.Program loadProgram(Uri mainLibrary, {Target target}) { | 683 ast.Program loadProgram(Uri mainLibrary, {Target target, bool compileSdk}) { |
| 664 ast.Library library = repository | 684 ast.Library library = repository |
| 665 .getLibraryReference(applicationRoot.relativeUri(mainLibrary)); | 685 .getLibraryReference(applicationRoot.relativeUri(mainLibrary)); |
| 666 ensureLibraryIsLoaded(library); | 686 ensureLibraryIsLoaded(library); |
| 667 loadEverything(target: target); | 687 loadEverything(target: target, compileSdk: compileSdk); |
| 668 var program = new ast.Program(repository.libraries); | 688 var program = new ast.Program(repository.libraries); |
| 669 program.mainMethod = library.procedures.firstWhere( | 689 program.mainMethod = library.procedures.firstWhere( |
| 670 (member) => member.name?.name == 'main', | 690 (member) => member.name?.name == 'main', |
| 671 orElse: () => null); | 691 orElse: () => null); |
| 672 for (LibraryElement libraryElement in libraryElements) { | 692 for (LibraryElement libraryElement in libraryElements) { |
| 673 for (CompilationUnitElement compilationUnitElement | 693 for (CompilationUnitElement compilationUnitElement |
| 674 in libraryElement.units) { | 694 in libraryElement.units) { |
| 675 var source = compilationUnitElement.source; | 695 var source = compilationUnitElement.source; |
| 676 LineInfo lineInfo = context.computeLineInfo(source); | 696 LineInfo lineInfo = context.computeLineInfo(source); |
| 677 program.uriToLineStarts["file://${source.fullName}"] = | 697 program.uriToLineStarts["file://${source.fullName}"] = |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 756 AnalysisOptions createAnalysisOptions(bool strongMode) { | 776 AnalysisOptions createAnalysisOptions(bool strongMode) { |
| 757 return new AnalysisOptionsImpl() | 777 return new AnalysisOptionsImpl() |
| 758 ..strongMode = strongMode | 778 ..strongMode = strongMode |
| 759 ..generateImplicitErrors = false | 779 ..generateImplicitErrors = false |
| 760 ..generateSdkErrors = false | 780 ..generateSdkErrors = false |
| 761 ..preserveComments = false | 781 ..preserveComments = false |
| 762 ..hint = false | 782 ..hint = false |
| 763 ..enableSuperMixins = true; | 783 ..enableSuperMixins = true; |
| 764 } | 784 } |
| 765 | 785 |
| 766 DartSdk createDartSdk(String path, {bool strongMode}) { | 786 DartSdk createDartSdk(String path, {bool strongMode, bool isSummary}) { |
| 787 if (isSummary) { |
| 788 return new SummaryBasedDartSdk(path, strongMode); |
| 789 } |
| 767 var resources = PhysicalResourceProvider.INSTANCE; | 790 var resources = PhysicalResourceProvider.INSTANCE; |
| 768 return new FolderBasedDartSdk(resources, resources.getFolder(path)) | 791 return new FolderBasedDartSdk(resources, resources.getFolder(path)) |
| 769 ..context | 792 ..context |
| 770 .analysisOptions | 793 .analysisOptions |
| 771 .setCrossContextOptionsFrom(createAnalysisOptions(strongMode)); | 794 .setCrossContextOptionsFrom(createAnalysisOptions(strongMode)); |
| 772 } | 795 } |
| 773 | 796 |
| 774 class CustomUriResolver extends UriResolver { | 797 class CustomUriResolver extends UriResolver { |
| 775 final ResourceUriResolver _resourceUriResolver; | 798 final ResourceUriResolver _resourceUriResolver; |
| 776 final Map<Uri, Uri> _customUrlMappings; | 799 final Map<Uri, Uri> _customUrlMappings; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 799 return _resourceUriResolver.resolveAbsolute(mapped, actualUri); | 822 return _resourceUriResolver.resolveAbsolute(mapped, actualUri); |
| 800 } | 823 } |
| 801 | 824 |
| 802 Uri restoreAbsolute(Source source) { | 825 Uri restoreAbsolute(Source source) { |
| 803 return _resourceUriResolver.restoreAbsolute(source); | 826 return _resourceUriResolver.restoreAbsolute(source); |
| 804 } | 827 } |
| 805 } | 828 } |
| 806 | 829 |
| 807 AnalysisContext createContext(DartOptions options, Packages packages, | 830 AnalysisContext createContext(DartOptions options, Packages packages, |
| 808 {DartSdk dartSdk}) { | 831 {DartSdk dartSdk}) { |
| 809 dartSdk ??= createDartSdk(options.sdk, strongMode: options.strongModeSdk); | 832 bool fromSummary = options.sdkSummary != null; |
| 833 dartSdk ??= createDartSdk(fromSummary ? options.sdkSummary : options.sdk, |
| 834 strongMode: options.strongModeSdk, isSummary: fromSummary); |
| 810 | 835 |
| 811 var resourceProvider = PhysicalResourceProvider.INSTANCE; | 836 var resourceProvider = PhysicalResourceProvider.INSTANCE; |
| 812 var resourceUriResolver = new ResourceUriResolver(resourceProvider); | 837 var resourceUriResolver = new ResourceUriResolver(resourceProvider); |
| 813 List<UriResolver> resolvers = []; | 838 List<UriResolver> resolvers = []; |
| 814 var customUriMappings = options.customUriMappings; | 839 var customUriMappings = options.customUriMappings; |
| 815 if (customUriMappings != null && customUriMappings.length > 0) { | 840 if (customUriMappings != null && customUriMappings.length > 0) { |
| 816 resolvers | 841 resolvers |
| 817 .add(new CustomUriResolver(resourceUriResolver, customUriMappings)); | 842 .add(new CustomUriResolver(resourceUriResolver, customUriMappings)); |
| 818 } | 843 } |
| 819 resolvers.add(new DartUriResolver(dartSdk)); | 844 resolvers.add(new DartUriResolver(dartSdk)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 831 AnalysisContext context = AnalysisEngine.instance.createAnalysisContext() | 856 AnalysisContext context = AnalysisEngine.instance.createAnalysisContext() |
| 832 ..sourceFactory = new SourceFactory(resolvers) | 857 ..sourceFactory = new SourceFactory(resolvers) |
| 833 ..analysisOptions = createAnalysisOptions(options.strongMode); | 858 ..analysisOptions = createAnalysisOptions(options.strongMode); |
| 834 | 859 |
| 835 options.declaredVariables.forEach((String name, String value) { | 860 options.declaredVariables.forEach((String name, String value) { |
| 836 context.declaredVariables.define(name, value); | 861 context.declaredVariables.define(name, value); |
| 837 }); | 862 }); |
| 838 | 863 |
| 839 return context; | 864 return context; |
| 840 } | 865 } |
| OLD | NEW |