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

Side by Side Diff: pkg/compiler/lib/src/compiler.dart

Issue 2865693002: Create closed world for hello world using .dill file (Closed)
Patch Set: Updated cf. comments. Created 3 years, 7 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
« no previous file with comments | « pkg/compiler/lib/src/colors.dart ('k') | pkg/compiler/lib/src/elements/operators.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 library dart2js.compiler_base; 5 library dart2js.compiler_base;
6 6
7 import 'dart:async' show Future; 7 import 'dart:async' show Future;
8 8
9 import '../compiler_new.dart' as api; 9 import '../compiler_new.dart' as api;
10 import 'backend_strategy.dart'; 10 import 'backend_strategy.dart';
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 119
120 DiagnosticReporter get reporter => _reporter; 120 DiagnosticReporter get reporter => _reporter;
121 ElementEnvironment get elementEnvironment => _elementEnvironment; 121 ElementEnvironment get elementEnvironment => _elementEnvironment;
122 CommonElements get commonElements => _commonElements; 122 CommonElements get commonElements => _commonElements;
123 Resolution get resolution => _resolution; 123 Resolution get resolution => _resolution;
124 ParsingContext get parsingContext => _parsingContext; 124 ParsingContext get parsingContext => _parsingContext;
125 125
126 // TODO(zarah): Remove this map and incorporate compile-time errors 126 // TODO(zarah): Remove this map and incorporate compile-time errors
127 // in the model. 127 // in the model.
128 /// Tracks elements with compile-time errors. 128 /// Tracks elements with compile-time errors.
129 final Map<Element, List<DiagnosticMessage>> elementsWithCompileTimeErrors = 129 final Map<Entity, List<DiagnosticMessage>> elementsWithCompileTimeErrors =
130 new Map<Element, List<DiagnosticMessage>>(); 130 new Map<Entity, List<DiagnosticMessage>>();
131 131
132 final Environment environment; 132 final Environment environment;
133 // TODO(sigmund): delete once we migrate the rest of the compiler to use 133 // TODO(sigmund): delete once we migrate the rest of the compiler to use
134 // `environment` directly. 134 // `environment` directly.
135 @deprecated 135 @deprecated
136 fromEnvironment(String name) => environment.valueOf(name); 136 fromEnvironment(String name) => environment.valueOf(name);
137 137
138 Element get currentElement => _reporter.currentElement; 138 Entity get currentElement => _reporter.currentElement;
139 139
140 List<CompilerTask> tasks; 140 List<CompilerTask> tasks;
141 ScannerTask scanner; 141 ScannerTask scanner;
142 DietParserTask dietParser; 142 DietParserTask dietParser;
143 ParserTask parser; 143 ParserTask parser;
144 PatchParserTask patchParser; 144 PatchParserTask patchParser;
145 LibraryLoaderTask libraryLoader; 145 LibraryLoaderTask libraryLoader;
146 SerializationTask serialization; 146 SerializationTask serialization;
147 ResolverTask resolver; 147 ResolverTask resolver;
148 closureMapping.ClosureTask closureToClassMapper; 148 closureMapping.ClosureTask closureToClassMapper;
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 return resolutionEnqueuer; 512 return resolutionEnqueuer;
513 } 513 }
514 514
515 /// Performs the compilation when all libraries have been loaded. 515 /// Performs the compilation when all libraries have been loaded.
516 void compileLoadedLibraries(LibraryEntity rootLibrary) => 516 void compileLoadedLibraries(LibraryEntity rootLibrary) =>
517 selfTask.measureSubtask("Compiler.compileLoadedLibraries", () { 517 selfTask.measureSubtask("Compiler.compileLoadedLibraries", () {
518 ResolutionEnqueuer resolutionEnqueuer = startResolution(); 518 ResolutionEnqueuer resolutionEnqueuer = startResolution();
519 WorldImpactBuilderImpl mainImpact = new WorldImpactBuilderImpl(); 519 WorldImpactBuilderImpl mainImpact = new WorldImpactBuilderImpl();
520 mainFunction = frontEndStrategy.computeMain(rootLibrary, mainImpact); 520 mainFunction = frontEndStrategy.computeMain(rootLibrary, mainImpact);
521 521
522 mirrorUsageAnalyzerTask.analyzeUsage(rootLibrary); 522 if (!options.loadFromDill) {
523 // TODO(johnniwinther): Support mirrors usages analysis from dill.
524 mirrorUsageAnalyzerTask.analyzeUsage(rootLibrary);
525 }
523 526
524 // In order to see if a library is deferred, we must compute the 527 // In order to see if a library is deferred, we must compute the
525 // compile-time constants that are metadata. This means adding 528 // compile-time constants that are metadata. This means adding
526 // something to the resolution queue. So we cannot wait with 529 // something to the resolution queue. So we cannot wait with
527 // this until after the resolution queue is processed. 530 // this until after the resolution queue is processed.
528 deferredLoadTask.beforeResolution(this); 531 deferredLoadTask.beforeResolution(this);
529 impactStrategy = backend.createImpactStrategy( 532 impactStrategy = backend.createImpactStrategy(
530 supportDeferredLoad: deferredLoadTask.isProgramSplit, 533 supportDeferredLoad: deferredLoadTask.isProgramSplit,
531 supportDumpInfo: options.dumpInfo, 534 supportDumpInfo: options.dumpInfo,
532 supportSerialization: serialization.supportSerialization); 535 supportSerialization: serialization.supportSerialization);
(...skipping 17 matching lines...) Expand all
550 resolutionEnqueuer 553 resolutionEnqueuer
551 .applyImpact(computeImpactForLibrary(rootLibrary)); 554 .applyImpact(computeImpactForLibrary(rootLibrary));
552 } 555 }
553 if (librariesToAnalyzeWhenRun != null) { 556 if (librariesToAnalyzeWhenRun != null) {
554 for (Uri libraryUri in librariesToAnalyzeWhenRun) { 557 for (Uri libraryUri in librariesToAnalyzeWhenRun) {
555 resolutionEnqueuer.applyImpact(computeImpactForLibrary( 558 resolutionEnqueuer.applyImpact(computeImpactForLibrary(
556 libraryLoader.lookupLibrary(libraryUri))); 559 libraryLoader.lookupLibrary(libraryUri)));
557 } 560 }
558 } 561 }
559 } 562 }
560 if (commonElements.mirrorsLibrary != null) { 563 if (commonElements.mirrorsLibrary != null && !options.loadFromDill) {
564 // TODO(johnniwinther): Support mirrors from dill.
561 resolveLibraryMetadata(); 565 resolveLibraryMetadata();
562 } 566 }
563 reporter.log('Resolving...'); 567 reporter.log('Resolving...');
564 568
565 processQueue(resolutionEnqueuer, mainFunction, libraryLoader.libraries, 569 processQueue(resolutionEnqueuer, mainFunction, libraryLoader.libraries,
566 onProgress: showResolutionProgress); 570 onProgress: showResolutionProgress);
567 backend.onResolutionEnd(); 571 backend.onResolutionEnd();
568 resolutionEnqueuer.logSummary(reporter.log); 572 resolutionEnqueuer.logSummary(reporter.log);
569 573
570 _reporter.reportSuppressedMessagesSummary(); 574 _reporter.reportSuppressedMessagesSummary();
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 int slashPos = libraryUri.path.indexOf('/'); 928 int slashPos = libraryUri.path.indexOf('/');
925 if (slashPos != -1) { 929 if (slashPos != -1) {
926 String packageName = libraryUri.path.substring(0, slashPos); 930 String packageName = libraryUri.path.substring(0, slashPos);
927 return new Uri(scheme: 'package', path: packageName); 931 return new Uri(scheme: 'package', path: packageName);
928 } 932 }
929 } 933 }
930 return libraryUri; 934 return libraryUri;
931 } 935 }
932 936
933 /// Returns [true] if a compile-time error has been reported for element. 937 /// Returns [true] if a compile-time error has been reported for element.
934 bool elementHasCompileTimeError(Element element) { 938 bool elementHasCompileTimeError(Entity element) {
935 return elementsWithCompileTimeErrors.containsKey(element); 939 return elementsWithCompileTimeErrors.containsKey(element);
936 } 940 }
937 941
938 /// Associate [element] with a compile-time error [message]. 942 /// Associate [element] with a compile-time error [message].
939 void registerCompileTimeError(Element element, DiagnosticMessage message) { 943 void registerCompileTimeError(Entity element, DiagnosticMessage message) {
940 // The information is only needed if [generateCodeWithCompileTimeErrors]. 944 // The information is only needed if [generateCodeWithCompileTimeErrors].
941 if (options.generateCodeWithCompileTimeErrors) { 945 if (options.generateCodeWithCompileTimeErrors) {
942 if (element == null) { 946 if (element == null) {
943 // Record as global error. 947 // Record as global error.
944 // TODO(zarah): Extend element model to represent compile-time 948 // TODO(zarah): Extend element model to represent compile-time
945 // errors instead of using a map. 949 // errors instead of using a map.
946 element = mainFunction as MethodElement; 950 element = mainFunction;
947 } 951 }
948 elementsWithCompileTimeErrors 952 elementsWithCompileTimeErrors
949 .putIfAbsent(element, () => <DiagnosticMessage>[]) 953 .putIfAbsent(element, () => <DiagnosticMessage>[])
950 .add(message); 954 .add(message);
951 } 955 }
952 } 956 }
953 957
954 api.OutputSink outputProvider( 958 api.OutputSink outputProvider(
955 String name, String extension, api.OutputType type) { 959 String name, String extension, api.OutputType type) {
956 if (compilationFailed) { 960 if (compilationFailed) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 lastDiagnosticWasFiltered = false; 1059 lastDiagnosticWasFiltered = false;
1056 reportDiagnostic(message, infos, kind); 1060 reportDiagnostic(message, infos, kind);
1057 } 1061 }
1058 1062
1059 void reportDiagnostic(DiagnosticMessage message, 1063 void reportDiagnostic(DiagnosticMessage message,
1060 List<DiagnosticMessage> infos, api.Diagnostic kind) { 1064 List<DiagnosticMessage> infos, api.Diagnostic kind) {
1061 compiler.reportDiagnostic(message, infos, kind); 1065 compiler.reportDiagnostic(message, infos, kind);
1062 if (kind == api.Diagnostic.ERROR || 1066 if (kind == api.Diagnostic.ERROR ||
1063 kind == api.Diagnostic.CRASH || 1067 kind == api.Diagnostic.CRASH ||
1064 (options.fatalWarnings && kind == api.Diagnostic.WARNING)) { 1068 (options.fatalWarnings && kind == api.Diagnostic.WARNING)) {
1065 Element errorElement; 1069 Entity errorElement;
1066 if (message.spannable is Element) { 1070 if (message.spannable is Entity) {
1067 errorElement = message.spannable; 1071 errorElement = message.spannable;
1068 } else { 1072 } else {
1069 errorElement = currentElement; 1073 errorElement = currentElement;
1070 } 1074 }
1071 compiler.registerCompileTimeError(errorElement, message); 1075 compiler.registerCompileTimeError(errorElement, message);
1072 compiler.fatalDiagnosticReported(message, infos, kind); 1076 compiler.fatalDiagnosticReported(message, infos, kind);
1073 } 1077 }
1074 } 1078 }
1075 1079
1076 @override 1080 @override
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 1116
1113 void reportAssertionFailure(SpannableAssertionFailure ex) { 1117 void reportAssertionFailure(SpannableAssertionFailure ex) {
1114 String message = 1118 String message =
1115 (ex.message != null) ? tryToString(ex.message) : tryToString(ex); 1119 (ex.message != null) ? tryToString(ex.message) : tryToString(ex);
1116 reportDiagnosticInternal( 1120 reportDiagnosticInternal(
1117 createMessage(ex.node, MessageKind.GENERIC, {'text': message}), 1121 createMessage(ex.node, MessageKind.GENERIC, {'text': message}),
1118 const <DiagnosticMessage>[], 1122 const <DiagnosticMessage>[],
1119 api.Diagnostic.CRASH); 1123 api.Diagnostic.CRASH);
1120 } 1124 }
1121 1125
1122 @override 1126 /// Using [frontEndStrategy] to compute a [SourceSpan] from spannable using
1123 SourceSpan spanFromToken(Token token) => spanFromTokens(token, token); 1127 /// the [currentElement] as context.
1124 1128 SourceSpan _spanFromStrategy(Spannable spannable) {
1125 SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) { 1129 SourceSpan span =
1126 if (begin == null || end == null) { 1130 compiler.frontEndStrategy.spanFromSpannable(spannable, currentElement);
1127 // TODO(ahe): We can almost always do better. Often it is only 1131 if (span != null) return span;
1128 // end that is null. Otherwise, we probably know the current 1132 throw 'No error location.';
1129 // URI.
1130 throw 'Cannot find tokens to produce error message.';
1131 }
1132 if (uri == null && currentElement != null) {
1133 if (currentElement is! Element) {
1134 throw 'Can only find tokens from an Element.';
1135 }
1136 Element element = currentElement;
1137 uri = element.compilationUnit.script.resourceUri;
1138 assert(invariant(currentElement, () {
1139 bool sameToken(Token token, Token sought) {
1140 if (token == sought) return true;
1141 if (token.stringValue == '>>') {
1142 // `>>` is converted to `>` in the parser when needed.
1143 return sought.stringValue == '>' &&
1144 token.charOffset <= sought.charOffset &&
1145 sought.charOffset < token.charEnd;
1146 }
1147 return false;
1148 }
1149
1150 /// Check that [begin] and [end] can be found between [from] and [to].
1151 validateToken(Token from, Token to) {
1152 if (from == null || to == null) return true;
1153 bool foundBegin = false;
1154 bool foundEnd = false;
1155 Token token = from;
1156 while (true) {
1157 if (sameToken(token, begin)) {
1158 foundBegin = true;
1159 }
1160 if (sameToken(token, end)) {
1161 foundEnd = true;
1162 }
1163 if (foundBegin && foundEnd) {
1164 return true;
1165 }
1166 if (token == to || token == token.next || token.next == null) {
1167 break;
1168 }
1169 token = token.next;
1170 }
1171
1172 // Create a good message for when the tokens were not found.
1173 StringBuffer sb = new StringBuffer();
1174 sb.write('Invalid current element: $element. ');
1175 sb.write('Looking for ');
1176 sb.write('[${begin} (${begin.hashCode}),');
1177 sb.write('${end} (${end.hashCode})] in');
1178
1179 token = from;
1180 while (true) {
1181 sb.write('\n ${token} (${token.hashCode})');
1182 if (token == to || token == token.next || token.next == null) {
1183 break;
1184 }
1185 token = token.next;
1186 }
1187 return sb.toString();
1188 }
1189
1190 if (element.enclosingClass != null &&
1191 element.enclosingClass.isEnumClass) {
1192 // Enums ASTs are synthesized (and give messed up messages).
1193 return true;
1194 }
1195
1196 if (element is AstElement) {
1197 AstElement astElement = element;
1198 if (astElement.hasNode) {
1199 Token from = astElement.node.getBeginToken();
1200 Token to = astElement.node.getEndToken();
1201 if (astElement.metadata.isNotEmpty) {
1202 if (!astElement.metadata.first.hasNode) {
1203 // We might try to report an error while parsing the metadata
1204 // itself.
1205 return true;
1206 }
1207 from = astElement.metadata.first.node.getBeginToken();
1208 }
1209 return validateToken(from, to);
1210 }
1211 }
1212 return true;
1213 }, message: "Invalid current element: $element [$begin,$end]."));
1214 }
1215 return new SourceSpan.fromTokens(uri, begin, end);
1216 } 1133 }
1217 1134
1218 SourceSpan spanFromNode(Node node) { 1135 SourceSpan spanFromSpannable(Spannable spannable) {
1219 return spanFromTokens(node.getBeginToken(), node.getPrefixEndToken()); 1136 if (spannable == CURRENT_ELEMENT_SPANNABLE) {
1220 } 1137 spannable = currentElement;
1221 1138 } else if (spannable == NO_LOCATION_SPANNABLE) {
1222 SourceSpan spanFromElement(Element element) { 1139 if (currentElement == null) return null;
1223 if (element != null && element.sourcePosition != null) { 1140 spannable = currentElement;
1224 return element.sourcePosition;
1225 } 1141 }
1226 while (element != null && element.isSynthesized) { 1142 if (spannable is SourceSpan) {
1227 element = element.enclosingElement; 1143 return spannable;
1228 } 1144 } else if (spannable is HInstruction) {
1229 if (element != null && 1145 Entity element = spannable.sourceElement;
1230 element.sourcePosition == null && 1146 if (element == null) element = currentElement;
1231 !element.isLibrary && 1147 SourceInformation position = spannable.sourceInformation;
1232 !element.isCompilationUnit) { 1148 if (position != null) return position.sourceSpan;
1233 // Sometimes, the backend fakes up elements that have no 1149 return _spanFromStrategy(element);
1234 // position. So we use the enclosing element instead. It is 1150 } else if (spannable is Local) {
1235 // not a good error location, but cancel really is "internal 1151 Local local = spannable;
1236 // error" or "not implemented yet", so the vicinity is good 1152 return _spanFromStrategy(local.executableContext);
1237 // enough for now.
1238 element = element.enclosingElement;
1239 // TODO(ahe): I plan to overhaul this infrastructure anyways.
1240 }
1241 if (element == null) {
1242 element = currentElement;
1243 }
1244 if (element == null) {
1245 return null;
1246 }
1247
1248 if (element.sourcePosition != null) {
1249 return element.sourcePosition;
1250 }
1251 Token position = element.position;
1252 Uri uri = element.compilationUnit.script.resourceUri;
1253 return (position == null)
1254 ? new SourceSpan(uri, 0, 0)
1255 : spanFromTokens(position, position, uri);
1256 }
1257
1258 SourceSpan spanFromHInstruction(HInstruction instruction) {
1259 Element element = _elementFromHInstruction(instruction);
1260 if (element == null) element = currentElement;
1261 SourceInformation position = instruction.sourceInformation;
1262 if (position == null) return spanFromElement(element);
1263 return position.sourceSpan;
1264 }
1265
1266 SourceSpan spanFromSpannable(Spannable node) {
1267 if (node == CURRENT_ELEMENT_SPANNABLE) {
1268 node = currentElement;
1269 } else if (node == NO_LOCATION_SPANNABLE) {
1270 if (currentElement == null) return null;
1271 node = currentElement;
1272 }
1273 if (node is SourceSpan) {
1274 return node;
1275 } else if (node is Node) {
1276 return spanFromNode(node);
1277 } else if (node is HInstruction) {
1278 return spanFromHInstruction(node);
1279 } else if (node is Element) {
1280 return spanFromElement(node);
1281 } else if (node is MetadataAnnotation) {
1282 return node.sourcePosition;
1283 } else if (node is Local) {
1284 Local local = node;
1285 return spanFromElement(local.executableContext);
1286 } else if (node is Entity) {
1287 return spanFromElement(currentElement);
1288 } else { 1153 } else {
1289 throw 'No error location.'; 1154 return _spanFromStrategy(spannable);
1290 } 1155 }
1291 } 1156 }
1292 1157
1158 // TODO(johnniwinther): Move this to the parser listeners.
1159 @override
1160 SourceSpan spanFromToken(Token token) {
1161 if (compiler.frontEndStrategy is ResolutionFrontEndStrategy) {
1162 ResolutionFrontEndStrategy strategy = compiler.frontEndStrategy;
1163 return strategy.spanFromToken(currentElement, token);
1164 }
1165 throw 'No error location.';
1166 }
1167
1293 Element _elementFromHInstruction(HInstruction instruction) { 1168 Element _elementFromHInstruction(HInstruction instruction) {
1294 return instruction.sourceElement is Element 1169 return instruction.sourceElement is Element
1295 ? instruction.sourceElement 1170 ? instruction.sourceElement
1296 : null; 1171 : null;
1297 } 1172 }
1298 1173
1299 internalError(Spannable node, reason) { 1174 internalError(Spannable spannable, reason) {
1300 String message = tryToString(reason); 1175 String message = tryToString(reason);
1301 reportDiagnosticInternal( 1176 reportDiagnosticInternal(
1302 createMessage(node, MessageKind.GENERIC, {'text': message}), 1177 createMessage(spannable, MessageKind.GENERIC, {'text': message}),
1303 const <DiagnosticMessage>[], 1178 const <DiagnosticMessage>[],
1304 api.Diagnostic.CRASH); 1179 api.Diagnostic.CRASH);
1305 throw 'Internal Error: $message'; 1180 throw 'Internal Error: $message';
1306 } 1181 }
1307 1182
1308 void unhandledExceptionOnElement(Entity element) { 1183 void unhandledExceptionOnElement(Entity element) {
1309 if (hasCrashed) return; 1184 if (hasCrashed) return;
1310 hasCrashed = true; 1185 hasCrashed = true;
1311 reportDiagnostic(createMessage(element, MessageKind.COMPILER_CRASHED), 1186 reportDiagnostic(createMessage(element, MessageKind.COMPILER_CRASHED),
1312 const <DiagnosticMessage>[], api.Diagnostic.CRASH); 1187 const <DiagnosticMessage>[], api.Diagnostic.CRASH);
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
1685 _ElementScanner(this.scanner); 1560 _ElementScanner(this.scanner);
1686 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library); 1561 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library);
1687 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit); 1562 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit);
1688 } 1563 }
1689 1564
1690 class _EmptyEnvironment implements Environment { 1565 class _EmptyEnvironment implements Environment {
1691 const _EmptyEnvironment(); 1566 const _EmptyEnvironment();
1692 1567
1693 String valueOf(String key) => null; 1568 String valueOf(String key) => null;
1694 } 1569 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/colors.dart ('k') | pkg/compiler/lib/src/elements/operators.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698