Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: sdk/lib/_internal/compiler/implementation/compiler.dart

Issue 339563002: Remove scanBuiltinLibraries. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comments. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 bool isDefaultNoSuchMethodImplementation(Element element) { 390 bool isDefaultNoSuchMethodImplementation(Element element) {
391 assert(element.name == Compiler.NO_SUCH_METHOD); 391 assert(element.name == Compiler.NO_SUCH_METHOD);
392 ClassElement classElement = element.enclosingClass; 392 ClassElement classElement = element.enclosingClass;
393 return classElement == compiler.objectClass; 393 return classElement == compiler.objectClass;
394 } 394 }
395 395
396 bool isInterceptorClass(ClassElement element) => false; 396 bool isInterceptorClass(ClassElement element) => false;
397 397
398 void registerStaticUse(Element element, Enqueuer enqueuer) {} 398 void registerStaticUse(Element element, Enqueuer enqueuer) {}
399 399
400 Future onLibraryLoaded(LibraryElement library, Uri uri) { 400 /// This method is called immediately after the [LibraryElement] [library] has
401 /// been created.
402 void onLibraryCreated(LibraryElement library) {}
403
404 /// This method is called immediately after the [library] and its parts have
405 /// been scanned.
406 void onLibraryScanned(LibraryElement library) {}
407
408 /// This method is called when all new libraries loaded through
409 /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
410 /// have been computed.
411 Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
401 return new Future.value(); 412 return new Future.value();
402 } 413 }
403 414
404 /// Called by [MirrorUsageAnalyzerTask] after it has merged all @MirrorsUsed 415 /// Called by [MirrorUsageAnalyzerTask] after it has merged all @MirrorsUsed
405 /// annotations. The arguments corresponds to the unions of the corresponding 416 /// annotations. The arguments corresponds to the unions of the corresponding
406 /// fields of the annotations. 417 /// fields of the annotations.
407 void registerMirrorUsage(Set<String> symbols, 418 void registerMirrorUsage(Set<String> symbols,
408 Set<Element> targets, 419 Set<Element> targets,
409 Set<Element> metaTargets) {} 420 Set<Element> metaTargets) {}
410 421
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 484
474 abstract class Compiler implements DiagnosticListener { 485 abstract class Compiler implements DiagnosticListener {
475 static final Uri DART_CORE = new Uri(scheme: 'dart', path: 'core'); 486 static final Uri DART_CORE = new Uri(scheme: 'dart', path: 'core');
476 static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper'); 487 static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper');
477 static final Uri DART_INTERCEPTORS = 488 static final Uri DART_INTERCEPTORS =
478 new Uri(scheme: 'dart', path: '_interceptors'); 489 new Uri(scheme: 'dart', path: '_interceptors');
479 static final Uri DART_FOREIGN_HELPER = 490 static final Uri DART_FOREIGN_HELPER =
480 new Uri(scheme: 'dart', path: '_foreign_helper'); 491 new Uri(scheme: 'dart', path: '_foreign_helper');
481 static final Uri DART_ISOLATE_HELPER = 492 static final Uri DART_ISOLATE_HELPER =
482 new Uri(scheme: 'dart', path: '_isolate_helper'); 493 new Uri(scheme: 'dart', path: '_isolate_helper');
494 static final Uri DART_MIRRORS = new Uri(scheme: 'dart', path: 'mirrors');
495 static final Uri DART_NATIVE_TYPED_DATA =
496 new Uri(scheme: 'dart', path: '_native_typed_data');
497 static final Uri DART_INTERNAL = new Uri(scheme: 'dart', path: '_internal');
498 static final Uri DART_ASYNC = new Uri(scheme: 'dart', path: 'async');
499
500 // TODO(johnniwinther): Change to map from [Uri] to [LibraryElement].
483 final Map<String, LibraryElement> libraries = 501 final Map<String, LibraryElement> libraries =
484 new Map<String, LibraryElement>(); 502 new Map<String, LibraryElement>();
485 final Stopwatch totalCompileTime = new Stopwatch(); 503 final Stopwatch totalCompileTime = new Stopwatch();
486 int nextFreeClassId = 0; 504 int nextFreeClassId = 0;
487 World world; 505 World world;
488 String assembledCode; 506 String assembledCode;
489 Types types; 507 Types types;
490 508
491 /** 509 /**
492 * Map from token to the first preceeding comment token. 510 * Map from token to the first preceeding comment token.
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 611
594 List<Uri> librariesToAnalyzeWhenRun; 612 List<Uri> librariesToAnalyzeWhenRun;
595 613
596 Tracer tracer; 614 Tracer tracer;
597 615
598 CompilerTask measuredTask; 616 CompilerTask measuredTask;
599 Element _currentElement; 617 Element _currentElement;
600 LibraryElement coreLibrary; 618 LibraryElement coreLibrary;
601 LibraryElement isolateLibrary; 619 LibraryElement isolateLibrary;
602 LibraryElement isolateHelperLibrary; 620 LibraryElement isolateHelperLibrary;
621 // TODO(johnniwinther): Move JavaScript specific libraries to the JavaScript
622 // backend.
603 LibraryElement jsHelperLibrary; 623 LibraryElement jsHelperLibrary;
604 LibraryElement interceptorsLibrary; 624 LibraryElement interceptorsLibrary;
605 LibraryElement foreignLibrary; 625 LibraryElement foreignLibrary;
606 626
607 LibraryElement mainApp; 627 LibraryElement mainApp;
608 FunctionElement mainFunction; 628 FunctionElement mainFunction;
609 629
610 /// Initialized when dart:mirrors is loaded. 630 /// Initialized when dart:mirrors is loaded.
611 LibraryElement mirrorsLibrary; 631 LibraryElement mirrorsLibrary;
612 632
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 810
791 bool hasCrashed = false; 811 bool hasCrashed = false;
792 812
793 /// Set by the backend if real reflection is detected in use of dart:mirrors. 813 /// Set by the backend if real reflection is detected in use of dart:mirrors.
794 bool disableTypeInferenceForMirrors = false; 814 bool disableTypeInferenceForMirrors = false;
795 815
796 Compiler({this.enableTypeAssertions: false, 816 Compiler({this.enableTypeAssertions: false,
797 this.enableUserAssertions: false, 817 this.enableUserAssertions: false,
798 this.trustTypeAnnotations: false, 818 this.trustTypeAnnotations: false,
799 this.enableConcreteTypeInference: false, 819 this.enableConcreteTypeInference: false,
800 this.disableTypeInferenceFlag: false, 820 bool disableTypeInferenceFlag: false,
801 this.maxConcreteTypeSize: 5, 821 this.maxConcreteTypeSize: 5,
802 this.enableMinification: false, 822 this.enableMinification: false,
803 this.enableNativeLiveTypeAnalysis: false, 823 this.enableNativeLiveTypeAnalysis: false,
804 bool emitJavaScript: true, 824 bool emitJavaScript: true,
805 bool generateSourceMap: true, 825 bool generateSourceMap: true,
806 bool analyzeAllFlag: false, 826 bool analyzeAllFlag: false,
807 bool analyzeOnly: false, 827 bool analyzeOnly: false,
808 this.analyzeMain: false, 828 this.analyzeMain: false,
809 bool analyzeSignaturesOnly: false, 829 bool analyzeSignaturesOnly: false,
810 this.preserveComments: false, 830 this.preserveComments: false,
811 this.verbose: false, 831 this.verbose: false,
812 this.sourceMapUri: null, 832 this.sourceMapUri: null,
813 this.outputUri: null, 833 this.outputUri: null,
814 this.buildId: UNDETERMINED_BUILD_ID, 834 this.buildId: UNDETERMINED_BUILD_ID,
815 this.terseDiagnostics: false, 835 this.terseDiagnostics: false,
816 this.disableDeferredLoading: false, 836 this.disableDeferredLoading: false,
817 this.dumpInfo: false, 837 this.dumpInfo: false,
818 this.showPackageWarnings: false, 838 this.showPackageWarnings: false,
819 this.useContentSecurityPolicy: false, 839 this.useContentSecurityPolicy: false,
820 this.suppressWarnings: false, 840 this.suppressWarnings: false,
821 outputProvider, 841 outputProvider,
822 List<String> strips: const []}) 842 List<String> strips: const []})
823 : this.analyzeOnly = 843 : this.disableTypeInferenceFlag =
844 disableTypeInferenceFlag || !emitJavaScript,
845 this.analyzeOnly =
824 analyzeOnly || analyzeSignaturesOnly || analyzeAllFlag, 846 analyzeOnly || analyzeSignaturesOnly || analyzeAllFlag,
825 this.analyzeSignaturesOnly = analyzeSignaturesOnly, 847 this.analyzeSignaturesOnly = analyzeSignaturesOnly,
826 this.analyzeAllFlag = analyzeAllFlag, 848 this.analyzeAllFlag = analyzeAllFlag,
827 this.outputProvider = (outputProvider == null) 849 this.outputProvider = (outputProvider == null)
828 ? NullSink.outputProvider 850 ? NullSink.outputProvider
829 : outputProvider { 851 : outputProvider {
830 world = new World(this); 852 world = new World(this);
853 types = new Types(this);
831 tracer = new Tracer(this.outputProvider); 854 tracer = new Tracer(this.outputProvider);
832 855
833 closureMapping.ClosureNamer closureNamer; 856 closureMapping.ClosureNamer closureNamer;
834 if (emitJavaScript) { 857 if (emitJavaScript) {
835 js_backend.JavaScriptBackend jsBackend = 858 js_backend.JavaScriptBackend jsBackend =
836 new js_backend.JavaScriptBackend(this, generateSourceMap); 859 new js_backend.JavaScriptBackend(this, generateSourceMap);
837 closureNamer = jsBackend.namer; 860 closureNamer = jsBackend.namer;
838 backend = jsBackend; 861 backend = jsBackend;
839 } else { 862 } else {
840 closureNamer = new closureMapping.ClosureNamer(); 863 closureNamer = new closureMapping.ClosureNamer();
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 }).whenComplete(() { 1002 }).whenComplete(() {
980 tracer.close(); 1003 tracer.close();
981 totalCompileTime.stop(); 1004 totalCompileTime.stop();
982 }).then((_) { 1005 }).then((_) {
983 return !compilationFailed; 1006 return !compilationFailed;
984 }); 1007 });
985 } 1008 }
986 1009
987 bool hasIsolateSupport() => isolateLibrary != null; 1010 bool hasIsolateSupport() => isolateLibrary != null;
988 1011
989 /** 1012 /// This method is called immediately after the [LibraryElement] [library] has
990 * This method is called before [library] import and export scopes have been 1013 /// been created.
991 * set up. 1014 ///
992 */ 1015 /// Use this callback method to store references to specific libraries.
993 Future onLibraryLoaded(LibraryElement library, Uri uri) { 1016 /// Note that [library] has not been scanned yet, nor has its imports/exports
994 if (uri == new Uri(scheme: 'dart', path: 'mirrors')) { 1017 /// been resolved.
1018 void onLibraryCreated(LibraryElement library) {
1019 Uri uri = library.canonicalUri;
1020 if (uri == DART_CORE) {
1021 coreLibrary = library;
1022 } else if (uri == DART_JS_HELPER) {
1023 jsHelperLibrary = library;
1024 } else if (uri == DART_INTERCEPTORS) {
1025 interceptorsLibrary = library;
1026 } else if (uri == DART_FOREIGN_HELPER) {
1027 foreignLibrary = library;
1028 } else if (uri == DART_ISOLATE_HELPER) {
1029 isolateHelperLibrary = library;
1030 } else if (uri == DART_NATIVE_TYPED_DATA) {
1031 typedDataLibrary = library;
1032 } else if (uri == DART_MIRRORS) {
995 mirrorsLibrary = library; 1033 mirrorsLibrary = library;
996 mirrorSystemClass =
997 findRequiredElement(library, 'MirrorSystem');
998 mirrorsUsedClass =
999 findRequiredElement(library, 'MirrorsUsed');
1000 } else if (uri == new Uri(scheme: 'dart', path: '_native_typed_data')) {
1001 typedDataLibrary = library;
1002 typedDataClass =
1003 findRequiredElement(library, 'NativeTypedData');
1004 } else if (uri == new Uri(scheme: 'dart', path: '_internal')) {
1005 symbolImplementationClass =
1006 findRequiredElement(library, 'Symbol');
1007 } else if (uri == new Uri(scheme: 'dart', path: 'async')) {
1008 deferredLibraryClass =
1009 findRequiredElement(library, 'DeferredLibrary');
1010 } else if (isolateHelperLibrary == null
1011 && (uri == new Uri(scheme: 'dart', path: '_isolate_helper'))) {
1012 isolateHelperLibrary = library;
1013 } else if (foreignLibrary == null
1014 && (uri == new Uri(scheme: 'dart', path: '_foreign_helper'))) {
1015 foreignLibrary = library;
1016 } 1034 }
1017 return backend.onLibraryLoaded(library, uri); 1035 backend.onLibraryCreated(library);
1036 }
1037
1038 /// This method is called immediately after the [library] and its parts have
1039 /// been scanned.
1040 ///
1041 /// Use this callback method to store references to specific member declared
1042 /// in certain libraries. Note that [library] has not been patched yet, nor
1043 /// has its imports/exports been resolved.
1044 void onLibraryScanned(LibraryElement library) {
1045 Uri uri = library.canonicalUri;
1046 if (uri == DART_CORE) {
1047 initializeCoreClasses();
1048 identicalFunction = coreLibrary.find('identical');
1049 } else if (uri == DART_JS_HELPER) {
1050 initializeHelperClasses();
1051 assertMethod = jsHelperLibrary.find('assertHelper');
1052 } else if (uri == DART_INTERNAL) {
1053 symbolImplementationClass = findRequiredElement(library, 'Symbol');
1054 } else if (uri == DART_MIRRORS) {
1055 mirrorSystemClass = findRequiredElement(library, 'MirrorSystem');
1056 mirrorsUsedClass = findRequiredElement(library, 'MirrorsUsed');
1057 } else if (uri == DART_ASYNC) {
1058 deferredLibraryClass = findRequiredElement(library, 'DeferredLibrary');
1059 } else if (uri == DART_NATIVE_TYPED_DATA) {
1060 typedDataClass = findRequiredElement(library, 'NativeTypedData');
1061 }
1062 backend.onLibraryScanned(library);
1063 }
1064
1065 /// This method is called when all new libraries loaded through
1066 /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
1067 /// have been computed.
1068 ///
1069 /// [loadedLibraries] contains the newly loaded libraries.
1070 ///
1071 /// The method returns a [Future] allowing for the loading of additional
1072 /// libraries.
1073 Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
1074 return new Future.sync(() {
1075 if (!loadedLibraries.containsKey(DART_CORE)) return new Future.value();
1076
1077 functionClass.ensureResolved(this);
1078 functionApplyMethod = functionClass.lookupLocalMember('apply');
1079
1080 proxyConstant =
1081 resolver.constantCompiler.compileConstant(coreLibrary.find('proxy'));
1082
1083 if (jsInvocationMirrorClass != null) {
1084 jsInvocationMirrorClass.ensureResolved(this);
1085 invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON);
1086 }
1087
1088 if (preserveComments) {
1089 return libraryLoader.loadLibrary(DART_MIRRORS)
1090 .then((LibraryElement libraryElement) {
1091 documentClass = libraryElement.find('Comment');
1092 });
1093 }
1094 }).then((_) => backend.onLibrariesLoaded(loadedLibraries));
1018 } 1095 }
1019 1096
1020 Element findRequiredElement(LibraryElement library, String name) { 1097 Element findRequiredElement(LibraryElement library, String name) {
1021 var element = library.find(name); 1098 var element = library.find(name);
1022 if (element == null) { 1099 if (element == null) {
1023 internalError(library, 1100 internalError(library,
1024 "The library '${library.canonicalUri}' does not contain required " 1101 "The library '${library.canonicalUri}' does not contain required "
1025 "element: '$name'."); 1102 "element: '$name'.");
1026 } 1103 }
1027 return element; 1104 return element;
(...skipping 13 matching lines...) Expand all
1041 } else if (intClass == cls) { 1118 } else if (intClass == cls) {
1042 intEnvironment = intClass.lookupConstructor(fromEnvironmentSelector); 1119 intEnvironment = intClass.lookupConstructor(fromEnvironmentSelector);
1043 } else if (stringClass == cls) { 1120 } else if (stringClass == cls) {
1044 stringEnvironment = 1121 stringEnvironment =
1045 stringClass.lookupConstructor(fromEnvironmentSelector); 1122 stringClass.lookupConstructor(fromEnvironmentSelector);
1046 } else if (boolClass == cls) { 1123 } else if (boolClass == cls) {
1047 boolEnvironment = boolClass.lookupConstructor(fromEnvironmentSelector); 1124 boolEnvironment = boolClass.lookupConstructor(fromEnvironmentSelector);
1048 } 1125 }
1049 } 1126 }
1050 1127
1051 Future<LibraryElement> scanBuiltinLibrary(String filename); 1128 void initializeCoreClasses() {
1052
1053 void initializeSpecialClasses() {
1054 final List missingCoreClasses = []; 1129 final List missingCoreClasses = [];
1055 ClassElement lookupCoreClass(String name) { 1130 ClassElement lookupCoreClass(String name) {
1056 ClassElement result = coreLibrary.find(name); 1131 ClassElement result = coreLibrary.find(name);
1057 if (result == null) { 1132 if (result == null) {
1058 missingCoreClasses.add(name); 1133 missingCoreClasses.add(name);
1059 } 1134 }
1060 return result; 1135 return result;
1061 } 1136 }
1062 objectClass = lookupCoreClass('Object'); 1137 objectClass = lookupCoreClass('Object');
1063 boolClass = lookupCoreClass('bool'); 1138 boolClass = lookupCoreClass('bool');
(...skipping 10 matching lines...) Expand all
1074 if (!missingCoreClasses.isEmpty) { 1149 if (!missingCoreClasses.isEmpty) {
1075 internalError(coreLibrary, 1150 internalError(coreLibrary,
1076 'dart:core library does not contain required classes: ' 1151 'dart:core library does not contain required classes: '
1077 '$missingCoreClasses'); 1152 '$missingCoreClasses');
1078 } 1153 }
1079 1154
1080 // The Symbol class may not exist during unit testing. 1155 // The Symbol class may not exist during unit testing.
1081 // TODO(ahe): It is possible that we have to require the presence 1156 // TODO(ahe): It is possible that we have to require the presence
1082 // of Symbol as we change how we implement noSuchMethod. 1157 // of Symbol as we change how we implement noSuchMethod.
1083 symbolClass = lookupCoreClass('Symbol'); 1158 symbolClass = lookupCoreClass('Symbol');
1159 }
1084 1160
1161 void initializeHelperClasses() {
1085 final List missingHelperClasses = []; 1162 final List missingHelperClasses = [];
1086 ClassElement lookupHelperClass(String name) { 1163 ClassElement lookupHelperClass(String name) {
1087 ClassElement result = jsHelperLibrary.find(name); 1164 ClassElement result = jsHelperLibrary.find(name);
1088 if (result == null) { 1165 if (result == null) {
1089 missingHelperClasses.add(name); 1166 missingHelperClasses.add(name);
1090 } 1167 }
1091 return result; 1168 return result;
1092 } 1169 }
1093 jsInvocationMirrorClass = lookupHelperClass('JSInvocationMirror'); 1170 jsInvocationMirrorClass = lookupHelperClass('JSInvocationMirror');
1094 boundClosureClass = lookupHelperClass('BoundClosure'); 1171 boundClosureClass = lookupHelperClass('BoundClosure');
1095 closureClass = lookupHelperClass('Closure'); 1172 closureClass = lookupHelperClass('Closure');
1096 if (!missingHelperClasses.isEmpty) { 1173 if (!missingHelperClasses.isEmpty) {
1097 internalError(jsHelperLibrary, 1174 internalError(jsHelperLibrary,
1098 'dart:_js_helper library does not contain required classes: ' 1175 'dart:_js_helper library does not contain required classes: '
1099 '$missingHelperClasses'); 1176 '$missingHelperClasses');
1100 } 1177 }
1101
1102 if (types == null) {
1103 types = new Types(this);
1104 }
1105 backend.initializeHelperClasses();
1106
1107 proxyConstant =
1108 resolver.constantCompiler.compileConstant(coreLibrary.find('proxy'));
1109 } 1178 }
1110 1179
1111 Element _unnamedListConstructor; 1180 Element _unnamedListConstructor;
1112 Element get unnamedListConstructor { 1181 Element get unnamedListConstructor {
1113 if (_unnamedListConstructor != null) return _unnamedListConstructor; 1182 if (_unnamedListConstructor != null) return _unnamedListConstructor;
1114 Selector callConstructor = new Selector.callConstructor( 1183 Selector callConstructor = new Selector.callConstructor(
1115 "", listClass.library); 1184 "", listClass.library);
1116 return _unnamedListConstructor = 1185 return _unnamedListConstructor =
1117 listClass.lookupConstructor(callConstructor); 1186 listClass.lookupConstructor(callConstructor);
1118 } 1187 }
1119 1188
1120 Element _filledListConstructor; 1189 Element _filledListConstructor;
1121 Element get filledListConstructor { 1190 Element get filledListConstructor {
1122 if (_filledListConstructor != null) return _filledListConstructor; 1191 if (_filledListConstructor != null) return _filledListConstructor;
1123 Selector callConstructor = new Selector.callConstructor( 1192 Selector callConstructor = new Selector.callConstructor(
1124 "filled", listClass.library); 1193 "filled", listClass.library);
1125 return _filledListConstructor = 1194 return _filledListConstructor =
1126 listClass.lookupConstructor(callConstructor); 1195 listClass.lookupConstructor(callConstructor);
1127 } 1196 }
1128 1197
1129 Future scanBuiltinLibraries() {
1130 return scanBuiltinLibrary('_js_helper').then((LibraryElement library) {
1131 jsHelperLibrary = library;
1132 return scanBuiltinLibrary('_interceptors');
1133 }).then((LibraryElement library) {
1134 interceptorsLibrary = library;
1135
1136 assertMethod = jsHelperLibrary.find('assertHelper');
1137 identicalFunction = coreLibrary.find('identical');
1138
1139 initializeSpecialClasses();
1140
1141 functionClass.ensureResolved(this);
1142 functionApplyMethod =
1143 functionClass.lookupLocalMember('apply');
1144 jsInvocationMirrorClass.ensureResolved(this);
1145 invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON);
1146
1147 if (preserveComments) {
1148 var uri = new Uri(scheme: 'dart', path: 'mirrors');
1149 return libraryLoader.loadLibrary(uri, null, uri).then(
1150 (LibraryElement libraryElement) {
1151 documentClass = libraryElement.find('Comment');
1152 });
1153 }
1154 });
1155 }
1156
1157 void importHelperLibrary(LibraryElement library) {
1158 if (jsHelperLibrary != null) {
1159 libraryLoader.importLibrary(library, jsHelperLibrary, null);
1160 }
1161 }
1162
1163 /** 1198 /**
1164 * Get an [Uri] pointing to a patch for the dart: library with 1199 * Get an [Uri] pointing to a patch for the dart: library with
1165 * the given path. Returns null if there is no patch. 1200 * the given path. Returns null if there is no patch.
1166 */ 1201 */
1167 Uri resolvePatchUri(String dartLibraryPath); 1202 Uri resolvePatchUri(String dartLibraryPath);
1168 1203
1169 Future runCompiler(Uri uri) { 1204 Future runCompiler(Uri uri) {
1170 // TODO(ahe): This prevents memory leaks when invoking the compiler 1205 // TODO(ahe): This prevents memory leaks when invoking the compiler
1171 // multiple times. Implement a better mechanism where we can store 1206 // multiple times. Implement a better mechanism where we can store
1172 // such caches in the compiler and get access to them through a 1207 // such caches in the compiler and get access to them through a
1173 // suitably maintained static reference to the current compiler. 1208 // suitably maintained static reference to the current compiler.
1174 StringToken.canonicalizedSubstrings.clear(); 1209 StringToken.canonicalizedSubstrings.clear();
1175 Selector.canonicalizedValues.clear(); 1210 Selector.canonicalizedValues.clear();
1176 TypedSelector.canonicalizedValues.clear(); 1211 TypedSelector.canonicalizedValues.clear();
1177 1212
1178 assert(uri != null || analyzeOnly); 1213 assert(uri != null || analyzeOnly);
1179 return scanBuiltinLibraries().then((_) { 1214 return new Future.sync(() {
1180 if (librariesToAnalyzeWhenRun != null) { 1215 if (librariesToAnalyzeWhenRun != null) {
1181 return Future.forEach(librariesToAnalyzeWhenRun, (libraryUri) { 1216 return Future.forEach(librariesToAnalyzeWhenRun, (libraryUri) {
1182 log('Analyzing $libraryUri ($buildId)'); 1217 log('Analyzing $libraryUri ($buildId)');
1183 return libraryLoader.loadLibrary(libraryUri, null, libraryUri); 1218 return libraryLoader.loadLibrary(libraryUri);
1184 }); 1219 });
1185 } 1220 }
1186 }).then((_) { 1221 }).then((_) {
1187 if (uri != null) { 1222 if (uri != null) {
1188 if (analyzeOnly) { 1223 if (analyzeOnly) {
1189 log('Analyzing $uri ($buildId)'); 1224 log('Analyzing $uri ($buildId)');
1190 } else { 1225 } else {
1191 log('Compiling $uri ($buildId)'); 1226 log('Compiling $uri ($buildId)');
1192 } 1227 }
1193 return libraryLoader.loadLibrary(uri, null, uri) 1228 return libraryLoader.loadLibrary(uri).then((LibraryElement library) {
1194 .then((LibraryElement library) {
1195 mainApp = library; 1229 mainApp = library;
1196 }); 1230 });
1197 } 1231 }
1198 }).then((_) { 1232 }).then((_) {
1199 compileLoadedLibraries(); 1233 if (!compilationFailed) {
1234 // TODO(johnniwinther): Reenable analysis of programs with load failures
1235 // when these are handled as erroneous libraries/compilation units.
ahe 2014/07/17 08:33:13 I guess it isn't clear how detrimental fatal error
Johnni Winther 2014/07/17 11:13:03 Can you file a bug on this and put me in it?
1236 compileLoadedLibraries();
1237 }
1200 }); 1238 });
1201 } 1239 }
1202 1240
1203 /// Performs the compilation when all libraries have been loaded. 1241 /// Performs the compilation when all libraries have been loaded.
1204 void compileLoadedLibraries() { 1242 void compileLoadedLibraries() {
1205 Element main = null; 1243 Element main = null;
1206 if (mainApp != null) { 1244 if (mainApp != null) {
1207 main = mainApp.findExported(MAIN); 1245 main = mainApp.findExported(MAIN);
1208 if (main == null) { 1246 if (main == null) {
1209 if (!analyzeOnly) { 1247 if (!analyzeOnly) {
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
1952 static NullSink outputProvider(String name, String extension) { 1990 static NullSink outputProvider(String name, String extension) {
1953 return new NullSink('$name.$extension'); 1991 return new NullSink('$name.$extension');
1954 } 1992 }
1955 } 1993 }
1956 1994
1957 /// Information about suppressed warnings and hints for a given library. 1995 /// Information about suppressed warnings and hints for a given library.
1958 class SuppressionInfo { 1996 class SuppressionInfo {
1959 int warnings = 0; 1997 int warnings = 0;
1960 int hints = 0; 1998 int hints = 0;
1961 } 1999 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698