OLD | NEW |
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 LibraryInfo; | 11 LibraryInfo; |
12 | 12 |
13 import 'package:compiler/compiler_new.dart' as api; | 13 import 'package:compiler/compiler_new.dart' as api; |
14 | 14 |
15 import 'package:compiler/src/apiimpl.dart' as apiimpl; | 15 import 'package:compiler/src/apiimpl.dart' show |
16 | 16 CompilerImpl; |
17 import 'package:compiler/src/compiler.dart' show | |
18 GlobalDependencyRegistry; | |
19 | 17 |
20 import 'package:compiler/src/io/source_file.dart'; | 18 import 'package:compiler/src/io/source_file.dart'; |
21 | 19 |
22 import 'package:compiler/src/source_file_provider.dart' show | 20 import 'package:compiler/src/source_file_provider.dart' show |
23 SourceFileProvider; | 21 SourceFileProvider; |
24 | 22 |
25 import 'package:compiler/src/elements/modelx.dart' show | 23 import 'package:compiler/src/elements/modelx.dart' show |
26 CompilationUnitElementX, | 24 CompilationUnitElementX, |
27 LibraryElementX; | 25 LibraryElementX; |
28 | 26 |
29 import 'package:compiler/compiler_new.dart' show | 27 import 'package:compiler/compiler_new.dart' show |
30 CompilerOutput; | 28 CompilerOutput; |
31 | 29 |
32 import 'package:compiler/src/diagnostics/messages.dart' show | 30 import 'package:compiler/src/diagnostics/messages.dart' show |
33 Message, | 31 Message, |
34 MessageKind, | 32 MessageKind, |
35 MessageTemplate; | 33 MessageTemplate; |
| 34 |
36 import 'package:compiler/src/diagnostics/source_span.dart' show | 35 import 'package:compiler/src/diagnostics/source_span.dart' show |
37 SourceSpan; | 36 SourceSpan; |
38 | 37 |
39 import 'package:compiler/src/diagnostics/diagnostic_listener.dart' show | 38 import 'package:compiler/src/diagnostics/diagnostic_listener.dart' show |
40 DiagnosticMessage, | 39 DiagnosticMessage, |
41 DiagnosticReporter; | 40 DiagnosticReporter; |
42 | 41 |
43 import 'package:compiler/src/diagnostics/spannable.dart' show | 42 import 'package:compiler/src/diagnostics/spannable.dart' show |
44 Spannable; | 43 Spannable; |
45 | 44 |
46 import 'fletch_registry.dart' show | |
47 FletchRegistry; | |
48 | |
49 import 'please_report_crash.dart' show | 45 import 'please_report_crash.dart' show |
50 crashReportRequested, | 46 crashReportRequested, |
51 requestBugReportOnCompilerCrashMessage; | 47 requestBugReportOnCompilerCrashMessage; |
52 | 48 |
53 import 'fletch_function_builder.dart'; | 49 import 'fletch_function_builder.dart'; |
54 import 'debug_info.dart'; | 50 import 'debug_info.dart'; |
55 import 'find_position_visitor.dart'; | 51 import 'find_position_visitor.dart'; |
56 import 'fletch_context.dart'; | 52 import 'fletch_context.dart'; |
57 | 53 |
58 import 'fletch_enqueuer.dart' show | 54 import 'fletch_enqueuer.dart' show |
59 FletchEnqueueTask; | 55 FletchEnqueueTask; |
60 | 56 |
61 import '../fletch_system.dart'; | 57 import '../fletch_system.dart'; |
| 58 |
62 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; | 59 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; |
63 import 'package:compiler/src/elements/elements.dart'; | 60 |
| 61 import 'fletch_diagnostic_reporter.dart' show |
| 62 FletchDiagnosticReporter; |
64 | 63 |
65 const EXTRA_DART2JS_OPTIONS = const <String>[ | 64 const EXTRA_DART2JS_OPTIONS = const <String>[ |
66 // TODO(ahe): This doesn't completely disable type inference. Investigate. | 65 // TODO(ahe): This doesn't completely disable type inference. Investigate. |
67 '--disable-type-inference', | 66 '--disable-type-inference', |
68 '--output-type=dart', | 67 '--output-type=dart', |
69 // We want to continue generating code in the case of errors, to support | 68 // We want to continue generating code in the case of errors, to support |
70 // incremental fixes of erroneous code. | 69 // incremental fixes of erroneous code. |
71 '--generate-code-with-compile-time-errors', | 70 '--generate-code-with-compile-time-errors', |
72 ]; | 71 ]; |
73 | 72 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 documented: false, | 113 documented: false, |
115 platforms: FLETCH_PLATFORM), | 114 platforms: FLETCH_PLATFORM), |
116 | 115 |
117 "fletch.os": const LibraryInfo( | 116 "fletch.os": const LibraryInfo( |
118 "os/os.dart", | 117 "os/os.dart", |
119 categories: "Client,Server,Embedded", | 118 categories: "Client,Server,Embedded", |
120 documented: false, | 119 documented: false, |
121 platforms: FLETCH_PLATFORM), | 120 platforms: FLETCH_PLATFORM), |
122 }; | 121 }; |
123 | 122 |
124 class FletchCompilerImplementation extends apiimpl.CompilerImpl { | 123 class FletchCompilerImplementation extends CompilerImpl { |
125 final Map<String, LibraryInfo> fletchLibraries = <String, LibraryInfo>{}; | 124 final Map<String, LibraryInfo> fletchLibraries = <String, LibraryInfo>{}; |
126 | 125 |
127 final Uri fletchVm; | 126 final Uri fletchVm; |
128 | 127 |
129 /// Location of fletch patch files. | 128 /// Location of fletch patch files. |
130 final Uri patchRoot; | 129 final Uri patchRoot; |
131 | 130 |
132 final Uri nativesJson; | 131 final Uri nativesJson; |
133 | 132 |
134 Map<Uri, CompilationUnitElementX> compilationUnits; | 133 Map<Uri, CompilationUnitElementX> compilationUnits; |
135 FletchContext internalContext; | 134 FletchContext internalContext; |
136 | 135 |
137 /// A reference to [../compiler.dart:FletchCompiler] used for testing. | 136 /// A reference to [../compiler.dart:FletchCompiler] used for testing. |
138 // TODO(ahe): Clean this up and remove this. | 137 // TODO(ahe): Clean this up and remove this. |
139 var helper; | 138 var helper; |
140 | 139 |
141 @override | |
142 FletchEnqueueTask get enqueuer => super.enqueuer; | 140 FletchEnqueueTask get enqueuer => super.enqueuer; |
143 | 141 |
144 FletchDiagnosticReporter reporter; | 142 FletchDiagnosticReporter reporter; |
145 | 143 |
146 FletchCompilerImplementation( | 144 FletchCompilerImplementation( |
147 api.CompilerInput provider, | 145 api.CompilerInput provider, |
148 api.CompilerOutput outputProvider, | 146 api.CompilerOutput outputProvider, |
149 api.CompilerDiagnostics handler, | 147 api.CompilerDiagnostics handler, |
150 Uri libraryRoot, | 148 Uri libraryRoot, |
151 Uri packageConfig, | 149 Uri packageConfig, |
(...skipping 13 matching lines...) Expand all Loading... |
165 | 163 |
166 FletchContext get context { | 164 FletchContext get context { |
167 if (internalContext == null) { | 165 if (internalContext == null) { |
168 internalContext = new FletchContext(this); | 166 internalContext = new FletchContext(this); |
169 } | 167 } |
170 return internalContext; | 168 return internalContext; |
171 } | 169 } |
172 | 170 |
173 String fletchPatchLibraryFor(String name) => FLETCH_PATCHES[name]; | 171 String fletchPatchLibraryFor(String name) => FLETCH_PATCHES[name]; |
174 | 172 |
175 @override | |
176 Uri lookupLibraryUri(String libraryName) { | 173 Uri lookupLibraryUri(String libraryName) { |
177 LibraryInfo info = FLETCH_LIBRARIES[libraryName]; | 174 LibraryInfo info = FLETCH_LIBRARIES[libraryName]; |
178 if (info == null) return super.lookupLibraryUri(libraryName); | 175 if (info == null) return super.lookupLibraryUri(libraryName); |
179 return patchRoot.resolve("lib/${info.path}"); | 176 return patchRoot.resolve("lib/${info.path}"); |
180 } | 177 } |
181 | 178 |
182 Uri resolvePatchUri(String dartLibraryPath) { | 179 Uri resolvePatchUri(String dartLibraryPath) { |
183 String patchPath = fletchPatchLibraryFor(dartLibraryPath); | 180 String patchPath = fletchPatchLibraryFor(dartLibraryPath); |
184 if (patchPath == null) return null; | 181 if (patchPath == null) return null; |
185 return patchRoot.resolve("lib/$patchPath"); | 182 return patchRoot.resolve("lib/$patchPath"); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 } | 296 } |
300 } | 297 } |
301 | 298 |
302 SourceFile getSourceFile(api.CompilerInput provider, Uri uri) { | 299 SourceFile getSourceFile(api.CompilerInput provider, Uri uri) { |
303 if (provider is SourceFileProvider) { | 300 if (provider is SourceFileProvider) { |
304 return provider.sourceFiles[uri]; | 301 return provider.sourceFiles[uri]; |
305 } else { | 302 } else { |
306 return null; | 303 return null; |
307 } | 304 } |
308 } | 305 } |
309 | |
310 /// A wrapper around a DiagnosticReporter, that customizes some messages to | |
311 /// Fletch. | |
312 class FletchDiagnosticReporter extends DiagnosticReporter { | |
313 DiagnosticReporter _internalReporter; | |
314 | |
315 FletchDiagnosticReporter(this._internalReporter); | |
316 | |
317 @override | |
318 DiagnosticMessage createMessage(Spannable spannable, | |
319 MessageKind messageKind, | |
320 [Map arguments = const {}]) { | |
321 return _internalReporter.createMessage(spannable, messageKind, arguments); | |
322 } | |
323 | |
324 @override | |
325 internalError(Spannable spannable, message) { | |
326 return _internalReporter.internalError(spannable, message); | |
327 } | |
328 | |
329 @override | |
330 void log(message) { | |
331 _internalReporter.log(message); | |
332 } | |
333 | |
334 @override | |
335 DiagnosticOptions get options => _internalReporter.options; | |
336 | |
337 @override | |
338 void reportError(DiagnosticMessage message, | |
339 [List<DiagnosticMessage> infos = const <DiagnosticMessage> []]) { | |
340 if (message.message.kind == | |
341 MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND) { | |
342 const String noMirrors = | |
343 "Fletch doesn't support 'dart:mirrors'. See https://goo.gl/Kwrd0O"; | |
344 message = createMessage(message.spannable, | |
345 MessageKind.GENERIC, | |
346 {'text': message}); | |
347 } | |
348 _internalReporter.reportError(message, infos); | |
349 } | |
350 | |
351 @override | |
352 void reportHint(DiagnosticMessage message, | |
353 [List<DiagnosticMessage> infos = const <DiagnosticMessage> []]) { | |
354 _internalReporter.reportHint(message, infos); | |
355 } | |
356 | |
357 @override | |
358 void reportInfo(Spannable node, | |
359 MessageKind errorCode, | |
360 [Map arguments = const {}]) { | |
361 _internalReporter.reportInfo(node, errorCode, arguments); | |
362 } | |
363 | |
364 @override | |
365 void reportWarning(DiagnosticMessage message, | |
366 [List<DiagnosticMessage> infos = const <DiagnosticMessage> []]) { | |
367 _internalReporter.reportWarning(message, infos); | |
368 } | |
369 | |
370 @override | |
371 SourceSpan spanFromSpannable(Spannable node) { | |
372 return _internalReporter.spanFromSpannable(node); | |
373 } | |
374 | |
375 @override | |
376 withCurrentElement(Element element, f()) { | |
377 return _internalReporter.withCurrentElement(element, f); | |
378 } | |
379 } | |
OLD | NEW |