| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 fasta.kernel_target; | 5 library fasta.kernel_target; |
| 6 | 6 |
| 7 import 'dart:async' show | 7 import 'dart:async' show |
| 8 Future; | 8 Future; |
| 9 | 9 |
| 10 import 'dart:io' show | 10 import 'dart:io' show |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 68 |
| 69 import '../ast_kind.dart' show | 69 import '../ast_kind.dart' show |
| 70 AstKind; | 70 AstKind; |
| 71 | 71 |
| 72 import '../errors.dart' show | 72 import '../errors.dart' show |
| 73 InputError, | 73 InputError, |
| 74 internalError, | 74 internalError, |
| 75 reportCrash, | 75 reportCrash, |
| 76 resetCrashReporting; | 76 resetCrashReporting; |
| 77 | 77 |
| 78 import '../util/relativize.dart' show |
| 79 relativizeUri; |
| 80 |
| 81 import '../compiler_context.dart' show |
| 82 CompilerContext; |
| 83 |
| 78 import 'kernel_builder.dart' show | 84 import 'kernel_builder.dart' show |
| 79 Builder, | 85 Builder, |
| 80 ClassBuilder, | 86 ClassBuilder, |
| 81 DynamicTypeBuilder, | 87 DynamicTypeBuilder, |
| 82 InvalidTypeBuilder, | 88 InvalidTypeBuilder, |
| 83 KernelClassBuilder, | 89 KernelClassBuilder, |
| 84 KernelLibraryBuilder, | 90 KernelLibraryBuilder, |
| 85 KernelNamedTypeBuilder, | 91 KernelNamedTypeBuilder, |
| 86 KernelProcedureBuilder, | 92 KernelProcedureBuilder, |
| 87 LibraryBuilder, | 93 LibraryBuilder, |
| 88 MixinApplicationBuilder, | 94 MixinApplicationBuilder, |
| 89 NamedMixinApplicationBuilder, | 95 NamedMixinApplicationBuilder, |
| 90 NamedTypeBuilder, | 96 NamedTypeBuilder, |
| 91 TypeBuilder; | 97 TypeBuilder; |
| 92 | 98 |
| 93 class KernelTarget extends TargetImplementation { | 99 class KernelTarget extends TargetImplementation { |
| 94 final DillTarget dillTarget; | 100 final DillTarget dillTarget; |
| 101 |
| 102 /// Shared with [CompilerContext]. |
| 103 final Map<String, Source> uriToSource; |
| 104 |
| 95 SourceLoader<Library> loader; | 105 SourceLoader<Library> loader; |
| 96 Program program; | 106 Program program; |
| 97 | 107 |
| 98 final List errors = []; | 108 final List errors = []; |
| 99 | 109 |
| 100 KernelTarget(DillTarget dillTarget, TranslateUri uriTranslator) | 110 KernelTarget(DillTarget dillTarget, TranslateUri uriTranslator, |
| 111 [Map<String, Source> uriToSource]) |
| 101 : dillTarget = dillTarget, | 112 : dillTarget = dillTarget, |
| 113 uriToSource = uriToSource ?? CompilerContext.current.uriToSource, |
| 102 super(dillTarget.ticker, uriTranslator) { | 114 super(dillTarget.ticker, uriTranslator) { |
| 103 resetCrashReporting(); | 115 resetCrashReporting(); |
| 104 loader = new SourceLoader<Library>(this); | 116 loader = new SourceLoader<Library>(this); |
| 105 } | 117 } |
| 106 | 118 |
| 119 void addLineStarts(Uri uri, List<int> lineStarts) { |
| 120 String fileUri = relativizeUri(uri); |
| 121 uriToSource[fileUri] = new Source(lineStarts, fileUri); |
| 122 } |
| 123 |
| 107 void read(Uri uri) { | 124 void read(Uri uri) { |
| 108 loader.read(uri); | 125 loader.read(uri); |
| 109 } | 126 } |
| 110 | 127 |
| 111 LibraryBuilder createLibraryBuilder(Uri uri, Uri fileUri) { | 128 LibraryBuilder createLibraryBuilder(Uri uri, Uri fileUri) { |
| 112 if (dillTarget.isLoaded) { | 129 if (dillTarget.isLoaded) { |
| 113 var builder = dillTarget.loader.builders[uri]; | 130 var builder = dillTarget.loader.builders[uri]; |
| 114 if (builder != null) { | 131 if (builder != null) { |
| 115 return builder; | 132 return builder; |
| 116 } | 133 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 } else { | 241 } else { |
| 225 loader.computeHierarchy(program); | 242 loader.computeHierarchy(program); |
| 226 } | 243 } |
| 227 await loader.buildBodies(astKind); | 244 await loader.buildBodies(astKind); |
| 228 loader.finishStaticInvocations(); | 245 loader.finishStaticInvocations(); |
| 229 finishAllConstructors(); | 246 finishAllConstructors(); |
| 230 loader.finishNativeMethods(); | 247 loader.finishNativeMethods(); |
| 231 transformMixinApplications(); | 248 transformMixinApplications(); |
| 232 // TODO(ahe): Don't call this from two different places. | 249 // TODO(ahe): Don't call this from two different places. |
| 233 setup_builtin_library.transformProgram(program); | 250 setup_builtin_library.transformProgram(program); |
| 234 errors.addAll(loader.collectCompileTimeErrors().map((e) => e.format())); | 251 errors.addAll( |
| 252 loader.collectCompileTimeErrors().map((e) => e.format())); |
| 235 if (errors.isNotEmpty) { | 253 if (errors.isNotEmpty) { |
| 236 return handleInputError(uri, null, isFullProgram: true); | 254 return handleInputError(uri, null, isFullProgram: true); |
| 237 } | 255 } |
| 238 if (uri == null) return program; | 256 if (uri == null) return program; |
| 239 return await writeLinkedProgram(uri, program, isFullProgram: true); | 257 return await writeLinkedProgram(uri, program, isFullProgram: true); |
| 240 } on InputError catch (e) { | 258 } on InputError catch (e) { |
| 241 return handleInputError(uri, e, isFullProgram: true); | 259 return handleInputError(uri, e, isFullProgram: true); |
| 242 } catch (e, s) { | 260 } catch (e, s) { |
| 243 return reportCrash(e, s, loader?.currentUriForCrashReporting); | 261 return reportCrash(e, s, loader?.currentUriForCrashReporting); |
| 244 } | 262 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 // that used when there's no fileUri on an element. Instead, ensure all | 328 // that used when there's no fileUri on an element. Instead, ensure all |
| 311 // elements have a fileUri. | 329 // elements have a fileUri. |
| 312 uriToSource[""] = new Source(<int>[0], ""); | 330 uriToSource[""] = new Source(<int>[0], ""); |
| 313 Program program = new Program(libraries, uriToSource); | 331 Program program = new Program(libraries, uriToSource); |
| 314 if (loader.first != null) { | 332 if (loader.first != null) { |
| 315 Builder builder = loader.first.members["main"]; | 333 Builder builder = loader.first.members["main"]; |
| 316 if (builder is KernelProcedureBuilder) { | 334 if (builder is KernelProcedureBuilder) { |
| 317 program.mainMethod = builder.procedure; | 335 program.mainMethod = builder.procedure; |
| 318 } | 336 } |
| 319 } | 337 } |
| 320 setup_builtin_library.transformProgram(program); | 338 if (errors.isEmpty || dillTarget.isLoaded) { |
| 339 setup_builtin_library.transformProgram(program); |
| 340 } |
| 321 ticker.logMs("Linked program"); | 341 ticker.logMs("Linked program"); |
| 322 return program; | 342 return program; |
| 323 } | 343 } |
| 324 | 344 |
| 325 Future<Program> writeLinkedProgram(Uri uri, Program program, | 345 Future<Program> writeLinkedProgram(Uri uri, Program program, |
| 326 {bool isFullProgram}) async { | 346 {bool isFullProgram}) async { |
| 327 File output = new File.fromUri(uri); | 347 File output = new File.fromUri(uri); |
| 328 IOSink sink = output.openWrite(); | 348 IOSink sink = output.openWrite(); |
| 329 try { | 349 try { |
| 330 new BinaryPrinter(sink).writeProgramFile(program); | 350 new BinaryPrinter(sink).writeProgramFile(program); |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 superclass = superclass.superclass; | 601 superclass = superclass.superclass; |
| 582 } | 602 } |
| 583 for (Constructor constructor in superclass.constructors) { | 603 for (Constructor constructor in superclass.constructors) { |
| 584 if (constructor.name.name.isEmpty) { | 604 if (constructor.name.name.isEmpty) { |
| 585 return constructor.function.requiredParameterCount == 0 ? | 605 return constructor.function.requiredParameterCount == 0 ? |
| 586 constructor : null; | 606 constructor : null; |
| 587 } | 607 } |
| 588 } | 608 } |
| 589 return null; | 609 return null; |
| 590 } | 610 } |
| OLD | NEW |