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:analyzer/src/summary/summary_sdk.dart'; |
20 import 'package:kernel/application_root.dart'; | 20 import 'package:kernel/application_root.dart'; |
21 import 'package:package_config/discovery.dart'; | 21 import 'package:package_config/discovery.dart'; |
22 import 'package:package_config/packages.dart'; | 22 import 'package:package_config/packages.dart'; |
23 | 23 |
24 import '../ast.dart' as ast; | 24 import '../ast.dart' as ast; |
25 import '../repository.dart'; | |
26 import '../target/targets.dart' show Target; | 25 import '../target/targets.dart' show Target; |
27 import '../type_algebra.dart'; | 26 import '../type_algebra.dart'; |
28 import 'analyzer.dart'; | 27 import 'analyzer.dart'; |
29 import 'ast_from_analyzer.dart'; | 28 import 'ast_from_analyzer.dart'; |
30 | 29 |
31 /// Options passed to the Dart frontend. | 30 /// Options passed to the Dart frontend. |
32 class DartOptions { | 31 class DartOptions { |
33 /// True if user code should be loaded in strong mode. | 32 /// True if user code should be loaded in strong mode. |
34 bool strongMode; | 33 bool strongMode; |
35 | 34 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 ast.TypeParameter tryGetClassTypeParameter(TypeParameterElement element); | 80 ast.TypeParameter tryGetClassTypeParameter(TypeParameterElement element); |
82 ast.Class getSharedMixinApplicationClass( | 81 ast.Class getSharedMixinApplicationClass( |
83 ast.Library library, ast.Class supertype, ast.Class mixin); | 82 ast.Library library, ast.Class supertype, ast.Class mixin); |
84 bool get strongMode; | 83 bool get strongMode; |
85 | 84 |
86 /// Whether or not to include redirecting factories in the output. | 85 /// Whether or not to include redirecting factories in the output. |
87 bool get ignoreRedirectingFactories; | 86 bool get ignoreRedirectingFactories; |
88 } | 87 } |
89 | 88 |
90 class DartLoader implements ReferenceLevelLoader { | 89 class DartLoader implements ReferenceLevelLoader { |
91 final Repository repository; | 90 final ast.Program program; |
92 final ApplicationRoot applicationRoot; | 91 final ApplicationRoot applicationRoot; |
93 final Bimap<ClassElement, ast.Class> _classes = | 92 final Bimap<ClassElement, ast.Class> _classes = |
94 new Bimap<ClassElement, ast.Class>(); | 93 new Bimap<ClassElement, ast.Class>(); |
95 final Bimap<Element, ast.Member> _members = new Bimap<Element, ast.Member>(); | 94 final Bimap<Element, ast.Member> _members = new Bimap<Element, ast.Member>(); |
96 final Map<TypeParameterElement, ast.TypeParameter> _classTypeParameters = | 95 final Map<TypeParameterElement, ast.TypeParameter> _classTypeParameters = |
97 <TypeParameterElement, ast.TypeParameter>{}; | 96 <TypeParameterElement, ast.TypeParameter>{}; |
98 final Map<ast.Library, Map<String, ast.Class>> _mixinApplications = | 97 final Map<ast.Library, Map<String, ast.Class>> _mixinApplications = |
99 <ast.Library, Map<String, ast.Class>>{}; | 98 <ast.Library, Map<String, ast.Class>>{}; |
| 99 final Map<LibraryElement, ast.Library> _libraries = |
| 100 <LibraryElement, ast.Library>{}; |
100 final AnalysisContext context; | 101 final AnalysisContext context; |
101 LibraryElement _dartCoreLibrary; | 102 LibraryElement _dartCoreLibrary; |
102 final List errors = []; | 103 final List errors = []; |
103 final List libraryElements = []; | 104 final List libraryElements = []; |
104 | 105 |
105 /// Classes that have been referenced, and must be promoted to type level | 106 /// Classes that have been referenced, and must be promoted to type level |
106 /// so as not to expose partially initialized classes. | 107 /// so as not to expose partially initialized classes. |
107 final List<ast.Class> temporaryClassWorklist = []; | 108 final List<ast.Class> temporaryClassWorklist = []; |
108 | 109 |
109 final Map<LibraryElement, List<ClassElement>> mixinLibraryWorklist = {}; | 110 final Map<LibraryElement, List<ClassElement>> mixinLibraryWorklist = {}; |
110 | 111 |
111 final bool ignoreRedirectingFactories; | 112 final bool ignoreRedirectingFactories; |
112 | 113 |
113 LibraryElement _libraryBeingLoaded = null; | 114 LibraryElement _libraryBeingLoaded = null; |
114 | 115 |
115 bool get strongMode => context.analysisOptions.strongMode; | 116 bool get strongMode => context.analysisOptions.strongMode; |
116 | 117 |
117 DartLoader(this.repository, DartOptions options, Packages packages, | 118 DartLoader(this.program, DartOptions options, Packages packages, |
118 {DartSdk dartSdk, | 119 {DartSdk dartSdk, |
119 AnalysisContext context, | 120 AnalysisContext context, |
120 this.ignoreRedirectingFactories: true}) | 121 this.ignoreRedirectingFactories: true}) |
121 : this.context = | 122 : this.context = |
122 context ?? createContext(options, packages, dartSdk: dartSdk), | 123 context ?? createContext(options, packages, dartSdk: dartSdk), |
123 this.applicationRoot = options.applicationRoot; | 124 this.applicationRoot = options.applicationRoot; |
124 | 125 |
125 String getLibraryName(LibraryElement element) { | 126 String getLibraryName(LibraryElement element) { |
126 return element.name.isEmpty ? null : element.name; | 127 return element.name.isEmpty ? null : element.name; |
127 } | 128 } |
128 | 129 |
| 130 LibraryElement getLibraryElementFromUri(Uri uri) { |
| 131 var source = context.sourceFactory.forUri2(uri); |
| 132 if (source == null) return null; |
| 133 return context.computeLibraryElement(source); |
| 134 } |
| 135 |
129 ast.Library getLibraryReference(LibraryElement element) { | 136 ast.Library getLibraryReference(LibraryElement element) { |
130 var uri = applicationRoot.relativeUri(element.source.uri); | 137 var uri = applicationRoot.relativeUri(element.source.uri); |
131 return repository.getLibraryReference(uri) | 138 var library = _libraries[element]; |
132 ..name ??= getLibraryName(element) | 139 if (library == null) { |
133 ..fileUri = '${element.source.uri}'; | 140 library = new ast.Library(uri) |
| 141 ..isExternal = true |
| 142 ..name = getLibraryName(element) |
| 143 ..fileUri = '${element.source.uri}'; |
| 144 program.libraries.add(library..parent = program); |
| 145 _libraries[element] = library; |
| 146 } |
| 147 return library; |
| 148 } |
| 149 |
| 150 ast.Library getLibraryReferenceFromUri(Uri uri) { |
| 151 return getLibraryReference(getLibraryElementFromUri(uri)); |
134 } | 152 } |
135 | 153 |
136 void _buildTopLevelMember( | 154 void _buildTopLevelMember( |
137 ast.Member member, Element element, Declaration astNode) { | 155 ast.Member member, Element element, Declaration astNode) { |
138 assert(member.parent != null); | 156 assert(member.parent != null); |
139 new MemberBodyBuilder(this, member, element).build(astNode); | 157 new MemberBodyBuilder(this, member, element).build(astNode); |
140 } | 158 } |
141 | 159 |
142 /// True if [element] is in the process of being loaded by | 160 /// True if [element] is in the process of being loaded by |
143 /// [_buildLibraryBody]. | 161 /// [_buildLibraryBody]. |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 var freshParameters = | 359 var freshParameters = |
342 getFreshTypeParameters(classNode.typeParameters); | 360 getFreshTypeParameters(classNode.typeParameters); |
343 var mixinClass = new ast.Class( | 361 var mixinClass = new ast.Class( |
344 name: '${classNode.name}^${mixinType.classNode.name}', | 362 name: '${classNode.name}^${mixinType.classNode.name}', |
345 isAbstract: true, | 363 isAbstract: true, |
346 typeParameters: freshParameters.freshTypeParameters, | 364 typeParameters: freshParameters.freshTypeParameters, |
347 supertype: freshParameters.substituteSuper(supertype), | 365 supertype: freshParameters.substituteSuper(supertype), |
348 mixedInType: freshParameters.substituteSuper(mixinType), | 366 mixedInType: freshParameters.substituteSuper(mixinType), |
349 fileUri: classNode.fileUri)..fileOffset = element.nameOffset; | 367 fileUri: classNode.fileUri)..fileOffset = element.nameOffset; |
350 mixinClass.level = ast.ClassLevel.Type; | 368 mixinClass.level = ast.ClassLevel.Type; |
| 369 addMixinClassToLibrary(mixinClass, classNode.enclosingLibrary); |
351 supertype = new ast.Supertype(mixinClass, | 370 supertype = new ast.Supertype(mixinClass, |
352 classNode.typeParameters.map(makeTypeParameterType).toList()); | 371 classNode.typeParameters.map(makeTypeParameterType).toList()); |
353 addMixinClassToLibrary(mixinClass, classNode.enclosingLibrary); | |
354 // This class cannot be used from anywhere else, so don't try to | 372 // This class cannot be used from anywhere else, so don't try to |
355 // generate shared mixin applications using it. | 373 // generate shared mixin applications using it. |
356 useSharedMixin = false; | 374 useSharedMixin = false; |
357 } | 375 } |
358 } | 376 } |
359 classNode.supertype = supertype; | 377 classNode.supertype = supertype; |
360 for (var implementedType in element.interfaces) { | 378 for (var implementedType in element.interfaces) { |
361 classNode.implementedTypes.add(scope.buildSupertype(implementedType)); | 379 classNode.implementedTypes.add(scope.buildSupertype(implementedType)); |
362 } | 380 } |
363 } | 381 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 } | 457 } |
440 | 458 |
441 ast.Member getMemberReference(Element element) { | 459 ast.Member getMemberReference(Element element) { |
442 assert(element != null); | 460 assert(element != null); |
443 assert(element is! Member); // Use the "base element". | 461 assert(element is! Member); // Use the "base element". |
444 return _members[element] ??= _buildMemberReference(element); | 462 return _members[element] ??= _buildMemberReference(element); |
445 } | 463 } |
446 | 464 |
447 ast.Member _buildMemberReference(Element element) { | 465 ast.Member _buildMemberReference(Element element) { |
448 assert(element != null); | 466 assert(element != null); |
449 var node = _buildOrphanedMemberReference(element); | 467 var member = _buildOrphanedMemberReference(element); |
450 // Set the parent pointer and store it in the enclosing class or library. | 468 // Set the parent pointer and store it in the enclosing class or library. |
451 // If the enclosing library is being built from the AST, do not add the | 469 // If the enclosing library is being built from the AST, do not add the |
452 // member, since the AST builder will put it in there. | 470 // member, since the AST builder will put it in there. |
453 var parent = element.enclosingElement; | 471 var parent = element.enclosingElement; |
454 if (parent is ClassElement) { | 472 if (parent is ClassElement) { |
455 var class_ = getClassReference(parent); | 473 var class_ = getClassReference(parent); |
456 node.parent = class_; | 474 member.parent = class_; |
457 if (!isLibraryBeingLoaded(element.library)) { | 475 if (!isLibraryBeingLoaded(element.library)) { |
458 class_.addMember(node); | 476 class_.addMember(member); |
459 } | 477 } |
460 } else { | 478 } else { |
461 var library = getLibraryReference(element.library); | 479 var library = getLibraryReference(element.library); |
462 node.parent = library; | 480 member.parent = library; |
463 if (!isLibraryBeingLoaded(element.library)) { | 481 if (!isLibraryBeingLoaded(element.library)) { |
464 library.addMember(node); | 482 library.addMember(member); |
465 } | 483 } |
466 } | 484 } |
467 return node; | 485 return member; |
468 } | 486 } |
469 | 487 |
470 ast.Member _buildOrphanedMemberReference(Element element) { | 488 ast.Member _buildOrphanedMemberReference(Element element) { |
471 assert(element != null); | 489 assert(element != null); |
472 ClassElement classElement = element.enclosingElement is ClassElement | 490 ClassElement classElement = element.enclosingElement is ClassElement |
473 ? element.enclosingElement | 491 ? element.enclosingElement |
474 : null; | 492 : null; |
475 TypeScope scope = classElement != null | 493 TypeScope scope = classElement != null |
476 ? new ClassScope(this, getLibraryReference(element.library)) | 494 ? new ClassScope(this, getLibraryReference(element.library)) |
477 : new TypeScope(this); | 495 : new TypeScope(this); |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 for (var uri in target.extraRequiredLibraries) { | 728 for (var uri in target.extraRequiredLibraries) { |
711 var library = _findLibraryElement(uri); | 729 var library = _findLibraryElement(uri); |
712 if (library == null) { | 730 if (library == null) { |
713 errors.add('Could not find required library $uri'); | 731 errors.add('Could not find required library $uri'); |
714 continue; | 732 continue; |
715 } | 733 } |
716 ensureLibraryIsLoaded(getLibraryReference(library)); | 734 ensureLibraryIsLoaded(getLibraryReference(library)); |
717 } | 735 } |
718 } | 736 } |
719 } | 737 } |
720 for (int i = 0; i < repository.libraries.length; ++i) { | 738 for (int i = 0; i < program.libraries.length; ++i) { |
721 var library = repository.libraries[i]; | 739 var library = program.libraries[i]; |
722 if (compileSdk || library.importUri.scheme != 'dart') { | 740 if (compileSdk || library.importUri.scheme != 'dart') { |
723 ensureLibraryIsLoaded(library); | 741 ensureLibraryIsLoaded(library); |
724 } | 742 } |
725 } | 743 } |
726 } | 744 } |
727 | 745 |
728 /// Builds a list of sources that have been loaded. | 746 /// Builds a list of sources that have been loaded. |
729 /// | 747 /// |
730 /// This operation may be expensive and should only be used for diagnostics. | 748 /// This operation may be expensive and should only be used for diagnostics. |
731 List<String> getLoadedFileNames() { | 749 List<String> getLoadedFileNames() { |
732 var list = <String>[]; | 750 var list = <String>[]; |
733 for (var library in repository.libraries) { | 751 for (var library in program.libraries) { |
734 LibraryElement element = context.computeLibraryElement(context | 752 LibraryElement element = context.computeLibraryElement(context |
735 .sourceFactory | 753 .sourceFactory |
736 .forUri2(applicationRoot.absoluteUri(library.importUri))); | 754 .forUri2(applicationRoot.absoluteUri(library.importUri))); |
737 for (var unit in element.units) { | 755 for (var unit in element.units) { |
738 list.add(unit.source.fullName); | 756 list.add(unit.source.fullName); |
739 } | 757 } |
740 } | 758 } |
741 return list; | 759 return list; |
742 } | 760 } |
743 | 761 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 var main = new ast.Procedure( | 799 var main = new ast.Procedure( |
782 new ast.Name('main'), | 800 new ast.Name('main'), |
783 ast.ProcedureKind.Method, | 801 ast.ProcedureKind.Method, |
784 new ast.FunctionNode(new ast.ExpressionStatement(new ast.Throw( | 802 new ast.FunctionNode(new ast.ExpressionStatement(new ast.Throw( |
785 new ast.StringLiteral('Program has no main method')))), | 803 new ast.StringLiteral('Program has no main method')))), |
786 isStatic: true)..fileUri = library.fileUri; | 804 isStatic: true)..fileUri = library.fileUri; |
787 library.addMember(main); | 805 library.addMember(main); |
788 return main; | 806 return main; |
789 } | 807 } |
790 | 808 |
791 ast.Program loadProgram(Uri mainLibrary, {Target target, bool compileSdk}) { | 809 void loadProgram(Uri mainLibrary, {Target target, bool compileSdk}) { |
792 Uri uri = applicationRoot.relativeUri(mainLibrary); | 810 ast.Library library = getLibraryReferenceFromUri(mainLibrary); |
793 ast.Library library = repository.getLibraryReference(uri); | |
794 ensureLibraryIsLoaded(library); | 811 ensureLibraryIsLoaded(library); |
795 var mainMethod = _getMainMethod(mainLibrary); | 812 var mainMethod = _getMainMethod(mainLibrary); |
796 loadEverything(target: target, compileSdk: compileSdk); | 813 loadEverything(target: target, compileSdk: compileSdk); |
797 var program = new ast.Program(repository.libraries); | |
798 if (mainMethod == null) { | 814 if (mainMethod == null) { |
799 mainMethod = _makeMissingMainMethod(library); | 815 mainMethod = _makeMissingMainMethod(library); |
800 } | 816 } |
801 program.mainMethod = mainMethod; | 817 program.mainMethod = mainMethod; |
802 for (LibraryElement libraryElement in libraryElements) { | 818 for (LibraryElement libraryElement in libraryElements) { |
803 for (CompilationUnitElement compilationUnitElement | 819 for (CompilationUnitElement compilationUnitElement |
804 in libraryElement.units) { | 820 in libraryElement.units) { |
805 var source = compilationUnitElement.source; | 821 var source = compilationUnitElement.source; |
806 LineInfo lineInfo = context.computeLineInfo(source); | 822 LineInfo lineInfo = context.computeLineInfo(source); |
807 String sourceCode; | 823 String sourceCode; |
808 try { | 824 try { |
809 sourceCode = context.getContents(source).data; | 825 sourceCode = context.getContents(source).data; |
810 } catch (e) { | 826 } catch (e) { |
811 // The source's contents could not be accessed. | 827 // The source's contents could not be accessed. |
812 sourceCode = ''; | 828 sourceCode = ''; |
813 } | 829 } |
814 program.uriToSource['${source.uri}'] = | 830 program.uriToSource['${source.uri}'] = |
815 new ast.Source(lineInfo.lineStarts, sourceCode); | 831 new ast.Source(lineInfo.lineStarts, sourceCode); |
816 } | 832 } |
817 } | 833 } |
818 return program; | |
819 } | 834 } |
820 | 835 |
821 ast.Library loadLibrary(Uri uri) { | 836 ast.Library loadLibrary(Uri uri) { |
822 ast.Library library = | 837 ast.Library library = getLibraryReferenceFromUri(uri); |
823 repository.getLibraryReference(applicationRoot.relativeUri(uri)); | |
824 ensureLibraryIsLoaded(library); | 838 ensureLibraryIsLoaded(library); |
825 return library; | 839 return library; |
826 } | 840 } |
827 } | 841 } |
828 | 842 |
829 class Bimap<K, V> { | 843 class Bimap<K, V> { |
830 final Map<K, V> nodeMap = <K, V>{}; | 844 final Map<K, V> nodeMap = <K, V>{}; |
831 final Map<V, K> inverse = <V, K>{}; | 845 final Map<V, K> inverse = <V, K>{}; |
832 | 846 |
833 bool containsKey(K key) => nodeMap.containsKey(key); | 847 bool containsKey(K key) => nodeMap.containsKey(key); |
(...skipping 10 matching lines...) Expand all Loading... |
844 /// Creates [DartLoader]s for a given configuration, while reusing the | 858 /// Creates [DartLoader]s for a given configuration, while reusing the |
845 /// [DartSdk] and [Packages] object if possible. | 859 /// [DartSdk] and [Packages] object if possible. |
846 class DartLoaderBatch { | 860 class DartLoaderBatch { |
847 Packages packages; | 861 Packages packages; |
848 DartSdk dartSdk; | 862 DartSdk dartSdk; |
849 | 863 |
850 String lastSdk; | 864 String lastSdk; |
851 String lastPackagePath; | 865 String lastPackagePath; |
852 bool lastStrongMode; | 866 bool lastStrongMode; |
853 | 867 |
854 Future<DartLoader> getLoader(Repository repository, DartOptions options, | 868 Future<DartLoader> getLoader(ast.Program program, DartOptions options, |
855 {String packageDiscoveryPath}) async { | 869 {String packageDiscoveryPath}) async { |
856 if (dartSdk == null || | 870 if (dartSdk == null || |
857 lastSdk != options.sdk || | 871 lastSdk != options.sdk || |
858 lastStrongMode != options.strongMode) { | 872 lastStrongMode != options.strongMode) { |
859 lastSdk = options.sdk; | 873 lastSdk = options.sdk; |
860 lastStrongMode = options.strongMode; | 874 lastStrongMode = options.strongMode; |
861 dartSdk = createDartSdk(options.sdk, strongMode: options.strongModeSdk); | 875 dartSdk = createDartSdk(options.sdk, strongMode: options.strongModeSdk); |
862 } | 876 } |
863 if (packages == null || | 877 if (packages == null || |
864 lastPackagePath != options.packagePath || | 878 lastPackagePath != options.packagePath || |
865 packageDiscoveryPath != null) { | 879 packageDiscoveryPath != null) { |
866 lastPackagePath = options.packagePath; | 880 lastPackagePath = options.packagePath; |
867 packages = await createPackages(options.packagePath, | 881 packages = await createPackages(options.packagePath, |
868 discoveryPath: packageDiscoveryPath); | 882 discoveryPath: packageDiscoveryPath); |
869 } | 883 } |
870 return new DartLoader(repository, options, packages, dartSdk: dartSdk); | 884 return new DartLoader(program, options, packages, dartSdk: dartSdk); |
871 } | 885 } |
872 } | 886 } |
873 | 887 |
874 Future<Packages> createPackages(String packagePath, | 888 Future<Packages> createPackages(String packagePath, |
875 {String discoveryPath}) async { | 889 {String discoveryPath}) async { |
876 if (packagePath != null) { | 890 if (packagePath != null) { |
877 var absolutePath = new io.File(packagePath).absolute.path; | 891 var absolutePath = new io.File(packagePath).absolute.path; |
878 if (await new io.Directory(packagePath).exists()) { | 892 if (await new io.Directory(packagePath).exists()) { |
879 return getPackagesDirectory(new Uri.file(absolutePath)); | 893 return getPackagesDirectory(new Uri.file(absolutePath)); |
880 } else if (await new io.File(packagePath).exists()) { | 894 } else if (await new io.File(packagePath).exists()) { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
972 AnalysisContext context = AnalysisEngine.instance.createAnalysisContext() | 986 AnalysisContext context = AnalysisEngine.instance.createAnalysisContext() |
973 ..sourceFactory = new SourceFactory(resolvers) | 987 ..sourceFactory = new SourceFactory(resolvers) |
974 ..analysisOptions = createAnalysisOptions(options.strongMode); | 988 ..analysisOptions = createAnalysisOptions(options.strongMode); |
975 | 989 |
976 options.declaredVariables.forEach((String name, String value) { | 990 options.declaredVariables.forEach((String name, String value) { |
977 context.declaredVariables.define(name, value); | 991 context.declaredVariables.define(name, value); |
978 }); | 992 }); |
979 | 993 |
980 return context; | 994 return context; |
981 } | 995 } |
OLD | NEW |