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

Side by Side Diff: pkg/fletchc/lib/src/fletch_compiler_implementation.dart

Issue 1450393002: Roll sdk dependency to 34357cdad108dcba734949bd13bd28c76ea285e0 (Closed) Base URL: git@github.com:dart-lang/fletch.git@master
Patch Set: Update status files Created 5 years 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
OLDNEW
1 // Copyright (c) 2015, the Fletch project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Fletch 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.md file. 3 // BSD-style license that can be found in the LICENSE.md file.
4 4
5 library fletchc.fletch_compiler_implementation; 5 library fletchc.fletch_compiler_implementation;
6 6
7 import 'dart:async' show 7 import 'dart:async' show
8 EventSink; 8 EventSink;
9 9
10 import 'package:sdk_library_metadata/libraries.dart' show 10 import 'package:sdk_library_metadata/libraries.dart' show
11 libraries,
12 LibraryInfo; 11 LibraryInfo;
13 12
14 import 'package:compiler/compiler_new.dart' as api; 13 import 'package:compiler/compiler_new.dart' as api;
15 14
16 import 'package:compiler/src/apiimpl.dart' as apiimpl; 15 import 'package:compiler/src/apiimpl.dart' as apiimpl;
17 16
17 import 'package:compiler/src/compiler.dart' show
18 GlobalDependencyRegistry;
ahe 2015/12/01 10:12:13 Unused import.
sigurdm 2015/12/03 14:48:10 Done.
19
18 import 'package:compiler/src/io/source_file.dart'; 20 import 'package:compiler/src/io/source_file.dart';
19 21
20 import 'package:compiler/src/source_file_provider.dart' show 22 import 'package:compiler/src/source_file_provider.dart' show
21 SourceFileProvider; 23 SourceFileProvider;
22 24
23 import 'package:compiler/src/elements/modelx.dart' show 25 import 'package:compiler/src/elements/modelx.dart' show
24 CompilationUnitElementX, 26 CompilationUnitElementX,
25 LibraryElementX; 27 LibraryElementX;
26 28
27 import 'package:compiler/compiler_new.dart' show 29 import 'package:compiler/compiler_new.dart' show
28 CompilerOutput; 30 CompilerOutput;
29 31
30 import 'package:compiler/src/util/uri_extras.dart' show 32 import 'package:compiler/src/diagnostics/messages.dart' show
31 relativize;
32
33 import 'package:compiler/src/dart2jslib.dart' show
34 CodegenRegistry,
35 Message, 33 Message,
36 MessageKind, 34 MessageKind,
37 MessageTemplate; 35 MessageTemplate;
36 import 'package:compiler/src/diagnostics/source_span.dart' show
ahe 2015/12/01 10:12:13 Add newline before import.
sigurdm 2015/12/03 14:48:10 Done.
37 SourceSpan;
38 38
39 import 'package:compiler/src/util/util.dart' show 39 import 'package:compiler/src/diagnostics/diagnostic_listener.dart' show
40 DiagnosticMessage,
41 DiagnosticReporter;
42
43 import 'package:compiler/src/diagnostics/spannable.dart' show
40 Spannable; 44 Spannable;
41 45
42 import 'fletch_registry.dart' show 46 import 'fletch_registry.dart' show
43 FletchRegistry; 47 FletchRegistry;
44 48
45 import 'please_report_crash.dart' show 49 import 'please_report_crash.dart' show
46 crashReportRequested, 50 crashReportRequested,
47 requestBugReportOnCompilerCrashMessage; 51 requestBugReportOnCompilerCrashMessage;
48 52
49 import 'fletch_function_builder.dart'; 53 import 'fletch_function_builder.dart';
50 import 'debug_info.dart'; 54 import 'debug_info.dart';
51 import 'find_position_visitor.dart'; 55 import 'find_position_visitor.dart';
52 import 'fletch_context.dart'; 56 import 'fletch_context.dart';
53 57
58 import 'fletch_enqueuer.dart' show
59 FletchEnqueueTask;
60
54 import '../fletch_system.dart'; 61 import '../fletch_system.dart';
62 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
ahe 2015/12/01 10:12:13 Newlines between imports.
sigurdm 2015/12/03 14:48:10 Done.
63 import 'package:compiler/src/elements/elements.dart';
55 64
56 const EXTRA_DART2JS_OPTIONS = const <String>[ 65 const EXTRA_DART2JS_OPTIONS = const <String>[
57 // TODO(ahe): This doesn't completely disable type inference. Investigate. 66 // TODO(ahe): This doesn't completely disable type inference. Investigate.
58 '--disable-type-inference', 67 '--disable-type-inference',
59 '--output-type=dart', 68 '--output-type=dart',
60 // We want to continue generating code in the case of errors, to support 69 // We want to continue generating code in the case of errors, to support
61 // incremental fixes of erroneous code. 70 // incremental fixes of erroneous code.
62 '--generate-code-with-compile-time-errors', 71 '--generate-code-with-compile-time-errors',
63 ]; 72 ];
64 73
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 documented: false, 114 documented: false,
106 platforms: FLETCH_PLATFORM), 115 platforms: FLETCH_PLATFORM),
107 116
108 "fletch.os": const LibraryInfo( 117 "fletch.os": const LibraryInfo(
109 "os/os.dart", 118 "os/os.dart",
110 categories: "Client,Server,Embedded", 119 categories: "Client,Server,Embedded",
111 documented: false, 120 documented: false,
112 platforms: FLETCH_PLATFORM), 121 platforms: FLETCH_PLATFORM),
113 }; 122 };
114 123
115 class FletchCompilerImplementation extends apiimpl.Compiler { 124 class FletchCompilerImplementation extends apiimpl.CompilerImpl {
116 final Map<String, LibraryInfo> fletchLibraries = <String, LibraryInfo>{}; 125 final Map<String, LibraryInfo> fletchLibraries = <String, LibraryInfo>{};
117 126
118 final Uri fletchVm; 127 final Uri fletchVm;
119 128
120 /// Location of fletch patch files. 129 /// Location of fletch patch files.
121 final Uri patchRoot; 130 final Uri patchRoot;
122 131
123 final Uri nativesJson; 132 final Uri nativesJson;
124 133
125 Map<Uri, CompilationUnitElementX> compilationUnits; 134 Map<Uri, CompilationUnitElementX> compilationUnits;
126 FletchContext internalContext; 135 FletchContext internalContext;
127 136
128 /// A reference to [../compiler.dart:FletchCompiler] used for testing. 137 /// A reference to [../compiler.dart:FletchCompiler] used for testing.
129 // TODO(ahe): Clean this up and remove this. 138 // TODO(ahe): Clean this up and remove this.
130 var helper; 139 var helper;
131 140
141 @override
ahe 2015/12/01 10:12:13 Please dont use @override.
sigurdm 2015/12/03 14:48:10 Done.
142 FletchEnqueueTask get enqueuer => super.enqueuer;
143
144 FletchDiagnosticReporter reporter;
145
132 FletchCompilerImplementation( 146 FletchCompilerImplementation(
133 api.CompilerInput provider, 147 api.CompilerInput provider,
134 api.CompilerOutput outputProvider, 148 api.CompilerOutput outputProvider,
135 api.CompilerDiagnostics handler, 149 api.CompilerDiagnostics handler,
136 Uri libraryRoot, 150 Uri libraryRoot,
137 Uri packageConfig, 151 Uri packageConfig,
138 this.patchRoot, 152 this.patchRoot,
139 this.nativesJson, 153 this.nativesJson,
140 List<String> options, 154 List<String> options,
141 Map<String, dynamic> environment, 155 Map<String, dynamic> environment,
142 this.fletchVm) 156 this.fletchVm)
143 : super( 157 : super(
144 provider, outputProvider, handler, libraryRoot, null, 158 provider, outputProvider, handler, libraryRoot, null,
145 EXTRA_DART2JS_OPTIONS.toList()..addAll(options), environment, 159 EXTRA_DART2JS_OPTIONS.toList()..addAll(options), environment,
146 packageConfig, null, FletchBackend.newInstance) { 160 packageConfig, null, FletchBackend.newInstance) {
147 CodegenRegistry global = globalDependencies; 161 reporter = new FletchDiagnosticReporter(super.reporter);
148 globalDependencies =
149 new FletchRegistry(this, global.treeElements).asRegistry;
150 } 162 }
151 163
152 bool get showPackageWarnings => true; 164 bool get showPackageWarnings => true;
153 165
154 FletchContext get context { 166 FletchContext get context {
155 if (internalContext == null) { 167 if (internalContext == null) {
156 internalContext = new FletchContext(this); 168 internalContext = new FletchContext(this);
157 } 169 }
158 return internalContext; 170 return internalContext;
159 } 171 }
160 172
161 String fletchPatchLibraryFor(String name) => FLETCH_PATCHES[name]; 173 String fletchPatchLibraryFor(String name) => FLETCH_PATCHES[name];
162 174
163 LibraryInfo lookupLibraryInfo(String name) { 175 @override
ahe 2015/12/01 10:12:13 Ditto.
sigurdm 2015/12/03 14:48:10 Done.
164 return fletchLibraries.putIfAbsent(name, () { 176 Uri lookupLibraryUri(String libraryName) {
165 // Let FLETCH_LIBRARIES shadow libraries. 177 LibraryInfo info = FLETCH_LIBRARIES[libraryName];
166 if (FLETCH_LIBRARIES.containsKey(name)) { 178 if (info == null) return super.lookupLibraryUri(libraryName);
167 return computeFletchLibraryInfo(name); 179 return patchRoot.resolve("lib/${info.path}");
168 }
169 LibraryInfo info = libraries[name];
170 if (info == null) {
171 return computeFletchLibraryInfo(name);
172 }
173 return new LibraryInfo(
174 info.path,
175 categories: info.categoriesString,
176 dart2jsPath: info.dart2jsPath,
177 dart2jsPatchPath: fletchPatchLibraryFor(name),
178 implementation: info.implementation,
179 documented: info.documented,
180 maturity: info.maturity,
181 platforms: info.platforms);
182 });
183 }
184
185 LibraryInfo computeFletchLibraryInfo(String name) {
186 LibraryInfo info = FLETCH_LIBRARIES[name];
187 if (info == null) return null;
188 // Since this LibraryInfo is completely internal to Fletch, there's no need
189 // for dart2js extensions and patches.
190 assert(info.dart2jsPath == null);
191 assert(info.dart2jsPatchPath == null);
192 String path = relativize(
193 libraryRoot, patchRoot.resolve("lib/${info.path}"), false);
194 return new LibraryInfo(
195 '../$path',
196 categories: info.categoriesString,
197 implementation: info.implementation,
198 documented: info.documented,
199 maturity: info.maturity,
200 platforms: info.platforms);
201 } 180 }
202 181
203 Uri resolvePatchUri(String dartLibraryPath) { 182 Uri resolvePatchUri(String dartLibraryPath) {
204 String patchPath = lookupPatchPath(dartLibraryPath); 183 String patchPath = fletchPatchLibraryFor(dartLibraryPath);
205 if (patchPath == null) return null; 184 if (patchPath == null) return null;
206 return patchRoot.resolve(patchPath); 185 return patchRoot.resolve("lib/$patchPath");
207 } 186 }
208 187
209 CompilationUnitElementX compilationUnitForUri(Uri uri) { 188 CompilationUnitElementX compilationUnitForUri(Uri uri) {
210 if (compilationUnits == null) { 189 if (compilationUnits == null) {
211 compilationUnits = <Uri, CompilationUnitElementX>{}; 190 compilationUnits = <Uri, CompilationUnitElementX>{};
212 libraryLoader.libraries.forEach((LibraryElementX library) { 191 libraryLoader.libraries.forEach((LibraryElementX library) {
213 for (CompilationUnitElementX unit in library.compilationUnits) { 192 for (CompilationUnitElementX unit in library.compilationUnits) {
214 compilationUnits[unit.script.resourceUri] = unit; 193 compilationUnits[unit.script.resourceUri] = unit;
215 } 194 }
216 }); 195 });
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 236
258 int positionInFile(String file, int line, int column) { 237 int positionInFile(String file, int line, int column) {
259 // TODO(ahe): [file] should be a Uri. 238 // TODO(ahe): [file] should be a Uri.
260 Uri uri = Uri.base.resolve(file); 239 Uri uri = Uri.base.resolve(file);
261 SourceFile sourceFile = getSourceFile(provider, uri); 240 SourceFile sourceFile = getSourceFile(provider, uri);
262 if (sourceFile == null) return null; 241 if (sourceFile == null) return null;
263 if (line >= sourceFile.lineStarts.length) return null; 242 if (line >= sourceFile.lineStarts.length) return null;
264 return sourceFile.lineStarts[line] + column; 243 return sourceFile.lineStarts[line] + column;
265 } 244 }
266 245
267 void reportVerboseInfo( 246 void reportVerboseInfo(
ahe 2015/12/01 10:12:13 This should probably be moved to our reporter obje
sigurdm 2015/12/03 14:48:10 I'll wait for Johnni to move it in the dart2js fro
268 Spannable node, 247 Spannable node,
269 String message, 248 String messageText,
270 {bool forceVerbose: false}) { 249 {bool forceVerbose: false}) {
271 // TODO(johnniwinther): Use super.reportVerboseInfo once added. 250 // TODO(johnniwinther): Use super.reportVerboseInfo once added.
272 if (forceVerbose || verbose) { 251 if (forceVerbose || verbose) {
273 MessageTemplate template = MessageTemplate.TEMPLATES[MessageKind.GENERIC]; 252 MessageTemplate template = MessageTemplate.TEMPLATES[MessageKind.GENERIC];
274 reportDiagnostic( 253 SourceSpan span = reporter.spanFromSpannable(node);
275 node, template.message({'text': message}, true), api.Diagnostic.HINT); 254 Message message = template.message({'text': messageText});
255 reportDiagnostic(new DiagnosticMessage(span, node, message),
ahe 2015/12/01 10:12:13 Why is reportDiagnostic not called on reporter?
sigurdm 2015/12/03 14:48:10 There is not reportDiagnostic on reporter, but on
256 [], api.Diagnostic.HINT);
276 } 257 }
277 } 258 }
278 259
279 void pleaseReportCrash() { 260 void pleaseReportCrash() {
280 if (crashReportRequested) return; 261 if (crashReportRequested) return;
281 crashReportRequested = true; 262 crashReportRequested = true;
282 print(requestBugReportOnCompilerCrashMessage); 263 print(requestBugReportOnCompilerCrashMessage);
283 } 264 }
284
285 void reportError(
286 Spannable node,
287 MessageKind messageKind,
288 [Map arguments = const {}]) {
289 if (messageKind == MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND) {
290 const String noMirrors =
291 "Fletch doesn't support 'dart:mirrors'. See https://goo.gl/Kwrd0O";
292 messageKind = MessageKind.GENERIC;
293 arguments = {'text': noMirrors};
294 }
295 super.reportError(node, messageKind, arguments);
296 }
297 } 265 }
298 266
299 /// Output provider which collects output in [output]. 267 /// Output provider which collects output in [output].
300 class OutputProvider implements CompilerOutput { 268 class OutputProvider implements CompilerOutput {
301 final Map<String, String> output = new Map<String, String>(); 269 final Map<String, String> output = new Map<String, String>();
302 270
303 EventSink<String> createEventSink(String name, String extension) { 271 EventSink<String> createEventSink(String name, String extension) {
304 return new StringEventSink((String data) { 272 return new StringEventSink((String data) {
305 output['$name.$extension'] = data; 273 output['$name.$extension'] = data;
306 }); 274 });
(...skipping 27 matching lines...) Expand all
334 } 302 }
335 } 303 }
336 304
337 SourceFile getSourceFile(api.CompilerInput provider, Uri uri) { 305 SourceFile getSourceFile(api.CompilerInput provider, Uri uri) {
338 if (provider is SourceFileProvider) { 306 if (provider is SourceFileProvider) {
339 return provider.sourceFiles[uri]; 307 return provider.sourceFiles[uri];
340 } else { 308 } else {
341 return null; 309 return null;
342 } 310 }
343 } 311 }
312
313 /// A wrapper around a DiagnosticReporter, that customizes some messages to
314 /// Fletch.
315 class FletchDiagnosticReporter extends DiagnosticReporter {
ahe 2015/12/01 10:12:13 Move to own file.
ahe 2015/12/01 10:12:13 If you used implements, you wouldn't need all thos
sigurdm 2015/12/03 14:48:10 I don't understand the argument. I use extends to
sigurdm 2015/12/03 14:48:10 Done.
316 DiagnosticReporter _internalReporter;
ahe 2015/12/01 10:12:13 Please don't use library privacy when you're not i
sigurdm 2015/12/03 14:48:10 Done.
317
318 FletchDiagnosticReporter(this._internalReporter);
319
320 @override
321 DiagnosticMessage createMessage(Spannable spannable,
ahe 2015/12/01 10:12:13 Add newline after ( for consistency with code styl
sigurdm 2015/12/03 14:48:10 Done.
322 MessageKind messageKind,
323 [Map arguments = const {}]) {
324 return _internalReporter.createMessage(spannable, messageKind, arguments);
325 }
326
327 @override
328 internalError(Spannable spannable, message) {
329 return _internalReporter.internalError(spannable, message);
330 }
331
332 @override
333 void log(message) {
334 _internalReporter.log(message);
335 }
336
337 @override
338 DiagnosticOptions get options => _internalReporter.options;
339
340 @override
341 void reportError(DiagnosticMessage message,
342 [List<DiagnosticMessage> infos = const <DiagnosticMessage> []]) {
343 if (message.message.kind ==
344 MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND) {
345 const String noMirrors =
346 "Fletch doesn't support 'dart:mirrors'. See https://goo.gl/Kwrd0O";
347 message = createMessage(message.spannable,
348 MessageKind.GENERIC,
349 {'text': message});
350 }
351 _internalReporter.reportError(message, infos);
352 }
353
354 @override
355 void reportHint(DiagnosticMessage message,
356 [List<DiagnosticMessage> infos = const <DiagnosticMessage> []]) {
357 _internalReporter.reportHint(message, infos);
358 }
359
360 @override
361 void reportInfo(Spannable node,
362 MessageKind errorCode,
363 [Map arguments = const {}]) {
364 _internalReporter.reportInfo(node, errorCode, arguments);
365 }
366
367 @override
368 void reportWarning(DiagnosticMessage message,
369 [List<DiagnosticMessage> infos = const <DiagnosticMessage> []]) {
370 _internalReporter.reportWarning(message, infos);
371 }
372
373 @override
374 SourceSpan spanFromSpannable(Spannable node) {
375 return _internalReporter.spanFromSpannable(node);
376 }
377
378 @override
379 withCurrentElement(Element element, f()) {
380 return _internalReporter.withCurrentElement(element, f);
381 }
382 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698