OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of dart2js; | 5 part of dart2js; |
6 | 6 |
7 /** | 7 /** |
8 * If true, print a warning for each method that was resolved, but not | 8 * If true, print a warning for each method that was resolved, but not |
9 * compiled. | 9 * compiled. |
10 */ | 10 */ |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 world.registerStaticUse(element); | 169 world.registerStaticUse(element); |
170 } | 170 } |
171 | 171 |
172 void registerDirectInvocation(Element element) { | 172 void registerDirectInvocation(Element element) { |
173 world.registerStaticUse(element); | 173 world.registerStaticUse(element); |
174 } | 174 } |
175 | 175 |
176 void registerInstantiation(InterfaceType type) { | 176 void registerInstantiation(InterfaceType type) { |
177 world.registerInstantiatedType(type, this); | 177 world.registerInstantiatedType(type, this); |
178 } | 178 } |
| 179 |
| 180 void registerAsyncMarker(FunctionElement element) { |
| 181 backend.registerAsyncMarker(element, world, this); |
| 182 } |
| 183 |
179 } | 184 } |
180 | 185 |
181 /// [WorkItem] used exclusively by the [CodegenEnqueuer]. | 186 /// [WorkItem] used exclusively by the [CodegenEnqueuer]. |
182 class CodegenWorkItem extends WorkItem { | 187 class CodegenWorkItem extends WorkItem { |
183 Registry registry; | 188 Registry registry; |
184 final TreeElements resolutionTree; | 189 final TreeElements resolutionTree; |
185 | 190 |
186 CodegenWorkItem(AstElement element, | 191 CodegenWorkItem(AstElement element, |
187 ItemCompilationContext compilationContext) | 192 ItemCompilationContext compilationContext) |
188 : this.resolutionTree = element.resolvedAst.elements, | 193 : this.resolutionTree = element.resolvedAst.elements, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 | 227 |
223 void registerDynamicGetter(Selector selector); | 228 void registerDynamicGetter(Selector selector); |
224 | 229 |
225 void registerDynamicSetter(Selector selector); | 230 void registerDynamicSetter(Selector selector); |
226 | 231 |
227 void registerStaticInvocation(Element element); | 232 void registerStaticInvocation(Element element); |
228 | 233 |
229 void registerInstantiation(InterfaceType type); | 234 void registerInstantiation(InterfaceType type); |
230 | 235 |
231 void registerGetOfStaticFunction(FunctionElement element); | 236 void registerGetOfStaticFunction(FunctionElement element); |
| 237 |
| 238 void registerAsyncMarker(FunctionElement element); |
232 } | 239 } |
233 | 240 |
234 abstract class Backend { | 241 abstract class Backend { |
235 final Compiler compiler; | 242 final Compiler compiler; |
236 | 243 |
237 Backend(this.compiler); | 244 Backend(this.compiler); |
238 | 245 |
239 /// The [ConstantSystem] used to interpret compile-time constants for this | 246 /// The [ConstantSystem] used to interpret compile-time constants for this |
240 /// backend. | 247 /// backend. |
241 ConstantSystem get constantSystem; | 248 ConstantSystem get constantSystem; |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 | 516 |
510 FunctionElement helperForBadMain() => null; | 517 FunctionElement helperForBadMain() => null; |
511 | 518 |
512 FunctionElement helperForMissingMain() => null; | 519 FunctionElement helperForMissingMain() => null; |
513 | 520 |
514 FunctionElement helperForMainArity() => null; | 521 FunctionElement helperForMainArity() => null; |
515 | 522 |
516 void forgetElement(Element element) {} | 523 void forgetElement(Element element) {} |
517 | 524 |
518 void registerMainHasArguments(Enqueuer enqueuer) {} | 525 void registerMainHasArguments(Enqueuer enqueuer) {} |
| 526 |
| 527 void registerAsyncMarker(FunctionElement element, |
| 528 Enqueuer enqueuer, |
| 529 Registry registry) {} |
519 } | 530 } |
520 | 531 |
521 /// Backend callbacks function specific to the resolution phase. | 532 /// Backend callbacks function specific to the resolution phase. |
522 class ResolutionCallbacks { | 533 class ResolutionCallbacks { |
523 /// Register that [node] is a call to `assert`. | 534 /// Register that [node] is a call to `assert`. |
524 void onAssert(Send node, Registry registry) {} | 535 void onAssert(Send node, Registry registry) {} |
525 | 536 |
526 /// Called during resolution to notify to the backend that the | 537 /// Called during resolution to notify to the backend that the |
527 /// program uses string interpolation. | 538 /// program uses string interpolation. |
528 void onStringInterpolation(Registry registry) {} | 539 void onStringInterpolation(Registry registry) {} |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 /// `true` if the last diagnostic was filtered, in which case the | 744 /// `true` if the last diagnostic was filtered, in which case the |
734 /// accompanying info message should be filtered as well. | 745 /// accompanying info message should be filtered as well. |
735 bool lastDiagnosticWasFiltered = false; | 746 bool lastDiagnosticWasFiltered = false; |
736 | 747 |
737 /// Map containing information about the warnings and hints that have been | 748 /// Map containing information about the warnings and hints that have been |
738 /// suppressed for each library. | 749 /// suppressed for each library. |
739 Map<Uri, SuppressionInfo> suppressedWarnings = <Uri, SuppressionInfo>{}; | 750 Map<Uri, SuppressionInfo> suppressedWarnings = <Uri, SuppressionInfo>{}; |
740 | 751 |
741 final bool suppressWarnings; | 752 final bool suppressWarnings; |
742 | 753 |
743 /// `true` if async/await features are supported. | |
744 final bool enableAsyncAwait; | |
745 | |
746 /// `true` if the compiler uses the [JavaScriptBackend]. | |
747 final bool emitJavaScript; | |
748 | |
749 /// If `true`, some values are cached for reuse in incremental compilation. | 754 /// If `true`, some values are cached for reuse in incremental compilation. |
750 /// Incremental compilation is basically calling [run] more than once. | 755 /// Incremental compilation is basically calling [run] more than once. |
751 final bool hasIncrementalSupport; | 756 final bool hasIncrementalSupport; |
752 | 757 |
753 /// If `true` native extension syntax is supported by the frontend. | 758 /// If `true` native extension syntax is supported by the frontend. |
754 final bool allowNativeExtensions; | 759 final bool allowNativeExtensions; |
755 | 760 |
756 /// Output provider from user of Compiler API. | 761 /// Output provider from user of Compiler API. |
757 api.CompilerOutputProvider userOutputProvider; | 762 api.CompilerOutputProvider userOutputProvider; |
758 | 763 |
759 /// Generate output even when there are compile-time errors. | 764 /// Generate output even when there are compile-time errors. |
760 final bool generateCodeWithCompileTimeErrors; | 765 final bool generateCodeWithCompileTimeErrors; |
761 | 766 |
762 bool disableInlining = false; | 767 bool disableInlining = false; |
763 | 768 |
764 List<Uri> librariesToAnalyzeWhenRun; | 769 List<Uri> librariesToAnalyzeWhenRun; |
765 | 770 |
766 Tracer tracer; | 771 Tracer tracer; |
767 | 772 |
768 CompilerTask measuredTask; | 773 CompilerTask measuredTask; |
769 Element _currentElement; | 774 Element _currentElement; |
770 LibraryElement coreLibrary; | 775 LibraryElement coreLibrary; |
| 776 LibraryElement asyncLibrary; |
771 | 777 |
772 LibraryElement mainApp; | 778 LibraryElement mainApp; |
773 FunctionElement mainFunction; | 779 FunctionElement mainFunction; |
774 | 780 |
775 /// Initialized when dart:mirrors is loaded. | 781 /// Initialized when dart:mirrors is loaded. |
776 LibraryElement mirrorsLibrary; | 782 LibraryElement mirrorsLibrary; |
777 | 783 |
778 /// Initialized when dart:typed_data is loaded. | 784 /// Initialized when dart:typed_data is loaded. |
779 LibraryElement typedDataLibrary; | 785 LibraryElement typedDataLibrary; |
780 | 786 |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1000 this.outputUri: null, | 1006 this.outputUri: null, |
1001 this.buildId: UNDETERMINED_BUILD_ID, | 1007 this.buildId: UNDETERMINED_BUILD_ID, |
1002 this.terseDiagnostics: false, | 1008 this.terseDiagnostics: false, |
1003 this.deferredMapUri: null, | 1009 this.deferredMapUri: null, |
1004 this.dumpInfo: false, | 1010 this.dumpInfo: false, |
1005 this.showPackageWarnings: false, | 1011 this.showPackageWarnings: false, |
1006 this.useContentSecurityPolicy: false, | 1012 this.useContentSecurityPolicy: false, |
1007 this.suppressWarnings: false, | 1013 this.suppressWarnings: false, |
1008 bool hasIncrementalSupport: false, | 1014 bool hasIncrementalSupport: false, |
1009 this.enableExperimentalMirrors: false, | 1015 this.enableExperimentalMirrors: false, |
1010 bool enableAsyncAwait: false, | |
1011 this.allowNativeExtensions: false, | 1016 this.allowNativeExtensions: false, |
1012 this.generateCodeWithCompileTimeErrors: false, | 1017 this.generateCodeWithCompileTimeErrors: false, |
1013 api.CompilerOutputProvider outputProvider, | 1018 api.CompilerOutputProvider outputProvider, |
1014 List<String> strips: const []}) | 1019 List<String> strips: const []}) |
1015 : this.emitJavaScript = emitJavaScript, | 1020 : this.disableTypeInferenceFlag = |
1016 this.enableAsyncAwait = enableAsyncAwait || !emitJavaScript, | |
1017 this.disableTypeInferenceFlag = | |
1018 disableTypeInferenceFlag || !emitJavaScript, | 1021 disableTypeInferenceFlag || !emitJavaScript, |
1019 this.analyzeOnly = | 1022 this.analyzeOnly = |
1020 analyzeOnly || analyzeSignaturesOnly || analyzeAllFlag, | 1023 analyzeOnly || analyzeSignaturesOnly || analyzeAllFlag, |
1021 this.analyzeSignaturesOnly = analyzeSignaturesOnly, | 1024 this.analyzeSignaturesOnly = analyzeSignaturesOnly, |
1022 this.analyzeAllFlag = analyzeAllFlag, | 1025 this.analyzeAllFlag = analyzeAllFlag, |
1023 this.hasIncrementalSupport = hasIncrementalSupport, | 1026 this.hasIncrementalSupport = hasIncrementalSupport, |
1024 cacheStrategy = new CacheStrategy(hasIncrementalSupport), | 1027 cacheStrategy = new CacheStrategy(hasIncrementalSupport), |
1025 this.userOutputProvider = (outputProvider == null) | 1028 this.userOutputProvider = (outputProvider == null) |
1026 ? NullSink.outputProvider | 1029 ? NullSink.outputProvider |
1027 : outputProvider { | 1030 : outputProvider { |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 Uri uri = library.canonicalUri; | 1238 Uri uri = library.canonicalUri; |
1236 if (uri == DART_CORE) { | 1239 if (uri == DART_CORE) { |
1237 initializeCoreClasses(); | 1240 initializeCoreClasses(); |
1238 identicalFunction = coreLibrary.find('identical'); | 1241 identicalFunction = coreLibrary.find('identical'); |
1239 } else if (uri == DART_INTERNAL) { | 1242 } else if (uri == DART_INTERNAL) { |
1240 symbolImplementationClass = findRequiredElement(library, 'Symbol'); | 1243 symbolImplementationClass = findRequiredElement(library, 'Symbol'); |
1241 } else if (uri == DART_MIRRORS) { | 1244 } else if (uri == DART_MIRRORS) { |
1242 mirrorSystemClass = findRequiredElement(library, 'MirrorSystem'); | 1245 mirrorSystemClass = findRequiredElement(library, 'MirrorSystem'); |
1243 mirrorsUsedClass = findRequiredElement(library, 'MirrorsUsed'); | 1246 mirrorsUsedClass = findRequiredElement(library, 'MirrorsUsed'); |
1244 } else if (uri == DART_ASYNC) { | 1247 } else if (uri == DART_ASYNC) { |
| 1248 asyncLibrary = library; |
1245 deferredLibraryClass = findRequiredElement(library, 'DeferredLibrary'); | 1249 deferredLibraryClass = findRequiredElement(library, 'DeferredLibrary'); |
1246 _coreTypes.futureClass = findRequiredElement(library, 'Future'); | 1250 _coreTypes.futureClass = findRequiredElement(library, 'Future'); |
1247 _coreTypes.streamClass = findRequiredElement(library, 'Stream'); | 1251 _coreTypes.streamClass = findRequiredElement(library, 'Stream'); |
1248 } else if (uri == DART_NATIVE_TYPED_DATA) { | 1252 } else if (uri == DART_NATIVE_TYPED_DATA) { |
1249 typedDataClass = findRequiredElement(library, 'NativeTypedData'); | 1253 typedDataClass = findRequiredElement(library, 'NativeTypedData'); |
1250 } else if (uri == js_backend.JavaScriptBackend.DART_JS_HELPER) { | 1254 } else if (uri == js_backend.JavaScriptBackend.DART_JS_HELPER) { |
1251 patchAnnotationClass = findRequiredElement(library, '_Patch'); | 1255 patchAnnotationClass = findRequiredElement(library, '_Patch'); |
1252 nativeAnnotationClass = findRequiredElement(library, 'Native'); | 1256 nativeAnnotationClass = findRequiredElement(library, 'Native'); |
1253 } | 1257 } |
1254 return backend.onLibraryScanned(library, loader); | 1258 return backend.onLibraryScanned(library, loader); |
(...skipping 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2407 return futureClass.computeType(compiler).createInstantiation([elementType]); | 2411 return futureClass.computeType(compiler).createInstantiation([elementType]); |
2408 } | 2412 } |
2409 | 2413 |
2410 @override | 2414 @override |
2411 InterfaceType streamType([DartType elementType = const DynamicType()]) { | 2415 InterfaceType streamType([DartType elementType = const DynamicType()]) { |
2412 return streamClass.computeType(compiler).createInstantiation([elementType]); | 2416 return streamClass.computeType(compiler).createInstantiation([elementType]); |
2413 } | 2417 } |
2414 } | 2418 } |
2415 | 2419 |
2416 typedef void InternalErrorFunction(Spannable location, String message); | 2420 typedef void InternalErrorFunction(Spannable location, String message); |
OLD | NEW |