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 Future; | 7 import 'dart:async' show Future; |
8 | 8 |
9 import 'dart:io' show File, IOSink; | 9 import 'dart:io' show File, IOSink; |
10 | 10 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 if (cls.interfaces != null) { | 168 if (cls.interfaces != null) { |
169 for (NamedTypeBuilder t in cls.interfaces) { | 169 for (NamedTypeBuilder t in cls.interfaces) { |
170 add(t); | 170 add(t); |
171 } | 171 } |
172 } | 172 } |
173 } | 173 } |
174 | 174 |
175 List<ClassBuilder> collectAllClasses() { | 175 List<ClassBuilder> collectAllClasses() { |
176 List<ClassBuilder> result = <ClassBuilder>[]; | 176 List<ClassBuilder> result = <ClassBuilder>[]; |
177 loader.builders.forEach((Uri uri, LibraryBuilder library) { | 177 loader.builders.forEach((Uri uri, LibraryBuilder library) { |
178 library.members.forEach((String name, Builder member) { | 178 library.forEach((String name, Builder member) { |
179 if (member is KernelClassBuilder) { | 179 if (member is KernelClassBuilder) { |
180 result.add(member); | 180 result.add(member); |
181 } | 181 } |
182 }); | 182 }); |
183 // TODO(ahe): Translate this if needed: | 183 // TODO(ahe): Translate this if needed: |
184 // if (library is KernelLibraryBuilder) { | 184 // if (library is KernelLibraryBuilder) { |
185 // result.addAll(library.mixinApplicationClasses); | 185 // result.addAll(library.mixinApplicationClasses); |
186 // } | 186 // } |
187 }); | 187 }); |
188 return result; | 188 return result; |
189 } | 189 } |
190 | 190 |
191 List<SourceClassBuilder> collectAllSourceClasses() { | 191 List<SourceClassBuilder> collectAllSourceClasses() { |
192 List<SourceClassBuilder> result = <SourceClassBuilder>[]; | 192 List<SourceClassBuilder> result = <SourceClassBuilder>[]; |
193 loader.builders.forEach((Uri uri, LibraryBuilder library) { | 193 loader.builders.forEach((Uri uri, LibraryBuilder library) { |
194 library.members.forEach((String name, Builder member) { | 194 library.forEach((String name, Builder member) { |
195 if (member is SourceClassBuilder) { | 195 if (member is SourceClassBuilder) { |
196 result.add(member); | 196 result.add(member); |
197 } | 197 } |
198 }); | 198 }); |
199 }); | 199 }); |
200 return result; | 200 return result; |
201 } | 201 } |
202 | 202 |
203 void breakCycle(ClassBuilder builder) { | 203 void breakCycle(ClassBuilder builder) { |
204 Class cls = builder.target; | 204 Class cls = builder.target; |
(...skipping 18 matching lines...) Expand all Loading... |
223 ? new Future<Program>.value(program) | 223 ? new Future<Program>.value(program) |
224 : writeLinkedProgram(uri, program, isFullProgram: isFullProgram); | 224 : writeLinkedProgram(uri, program, isFullProgram: isFullProgram); |
225 } | 225 } |
226 | 226 |
227 Future<Program> writeOutline(Uri uri) async { | 227 Future<Program> writeOutline(Uri uri) async { |
228 if (loader.first == null) return null; | 228 if (loader.first == null) return null; |
229 try { | 229 try { |
230 await loader.buildOutlines(); | 230 await loader.buildOutlines(); |
231 loader.coreLibrary | 231 loader.coreLibrary |
232 .becomeCoreLibrary(const DynamicType(), const VoidType()); | 232 .becomeCoreLibrary(const DynamicType(), const VoidType()); |
233 dynamicType.bind(loader.coreLibrary.members["dynamic"]); | 233 dynamicType.bind(loader.coreLibrary["dynamic"]); |
234 loader.resolveParts(); | 234 loader.resolveParts(); |
235 loader.computeLibraryScopes(); | 235 loader.computeLibraryScopes(); |
236 loader.resolveTypes(); | 236 loader.resolveTypes(); |
237 loader.buildProgram(); | 237 loader.buildProgram(); |
238 loader.checkSemantics(); | 238 loader.checkSemantics(); |
239 List<SourceClassBuilder> sourceClasses = collectAllSourceClasses(); | 239 List<SourceClassBuilder> sourceClasses = collectAllSourceClasses(); |
240 installDefaultSupertypes(); | 240 installDefaultSupertypes(); |
241 installDefaultConstructors(sourceClasses); | 241 installDefaultConstructors(sourceClasses); |
242 loader.resolveConstructors(); | 242 loader.resolveConstructors(); |
243 loader.finishTypeVariables(objectClassBuilder); | 243 loader.finishTypeVariables(objectClassBuilder); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 libraries.addAll(binary.libraries); | 350 libraries.addAll(binary.libraries); |
351 uriToSource.addAll(binary.uriToSource); | 351 uriToSource.addAll(binary.uriToSource); |
352 } | 352 } |
353 | 353 |
354 // TODO(ahe): Remove this line. Kernel seems to generate a default line map | 354 // TODO(ahe): Remove this line. Kernel seems to generate a default line map |
355 // that used when there's no fileUri on an element. Instead, ensure all | 355 // that used when there's no fileUri on an element. Instead, ensure all |
356 // elements have a fileUri. | 356 // elements have a fileUri. |
357 uriToSource[""] = new Source(<int>[0], const <int>[]); | 357 uriToSource[""] = new Source(<int>[0], const <int>[]); |
358 Program program = new Program(libraries, uriToSource); | 358 Program program = new Program(libraries, uriToSource); |
359 if (loader.first != null) { | 359 if (loader.first != null) { |
360 Builder builder = loader.first.members["main"]; | 360 Builder builder = loader.first.lookup("main", -1, null); |
361 if (builder is KernelProcedureBuilder) { | 361 if (builder is KernelProcedureBuilder) { |
362 program.mainMethod = builder.procedure; | 362 program.mainMethod = builder.procedure; |
363 } | 363 } |
364 } | 364 } |
365 if (errors.isEmpty || dillTarget.isLoaded) { | 365 if (errors.isEmpty || dillTarget.isLoaded) { |
366 setup_builtin_library.transformProgram(program); | 366 setup_builtin_library.transformProgram(program); |
367 } | 367 } |
368 ticker.logMs("Linked program"); | 368 ticker.logMs("Linked program"); |
369 return program; | 369 return program; |
370 } | 370 } |
(...skipping 12 matching lines...) Expand all Loading... |
383 ticker.logMs("Wrote program to ${uri.toFilePath()}"); | 383 ticker.logMs("Wrote program to ${uri.toFilePath()}"); |
384 } else { | 384 } else { |
385 ticker.logMs("Wrote outline to ${uri.toFilePath()}"); | 385 ticker.logMs("Wrote outline to ${uri.toFilePath()}"); |
386 } | 386 } |
387 return null; | 387 return null; |
388 } | 388 } |
389 | 389 |
390 void installDefaultSupertypes() { | 390 void installDefaultSupertypes() { |
391 Class objectClass = this.objectClass; | 391 Class objectClass = this.objectClass; |
392 loader.builders.forEach((Uri uri, LibraryBuilder library) { | 392 loader.builders.forEach((Uri uri, LibraryBuilder library) { |
393 library.members.forEach((String name, Builder builder) { | 393 library.forEach((String name, Builder builder) { |
394 if (builder is SourceClassBuilder) { | 394 if (builder is SourceClassBuilder) { |
395 Class cls = builder.target; | 395 Class cls = builder.target; |
396 if (cls != objectClass) { | 396 if (cls != objectClass) { |
397 cls.supertype ??= objectClass.asRawSupertype; | 397 cls.supertype ??= objectClass.asRawSupertype; |
398 } | 398 } |
399 if (builder.isMixinApplication) { | 399 if (builder.isMixinApplication) { |
400 cls.mixedInType = builder.mixedInType.buildSupertype(library); | 400 cls.mixedInType = builder.mixedInType.buildSupertype(library); |
401 } | 401 } |
402 } | 402 } |
403 }); | 403 }); |
404 }); | 404 }); |
405 ticker.logMs("Installed Object as implicit superclass"); | 405 ticker.logMs("Installed Object as implicit superclass"); |
406 } | 406 } |
407 | 407 |
408 void installDefaultConstructors(List<SourceClassBuilder> builders) { | 408 void installDefaultConstructors(List<SourceClassBuilder> builders) { |
409 Class objectClass = this.objectClass; | 409 Class objectClass = this.objectClass; |
410 for (SourceClassBuilder builder in builders) { | 410 for (SourceClassBuilder builder in builders) { |
411 if (builder.target != objectClass) { | 411 if (builder.target != objectClass) { |
412 installDefaultConstructor(builder); | 412 installDefaultConstructor(builder); |
413 } | 413 } |
414 } | 414 } |
415 ticker.logMs("Installed default constructors"); | 415 ticker.logMs("Installed default constructors"); |
416 } | 416 } |
417 | 417 |
418 KernelClassBuilder get objectClassBuilder { | 418 KernelClassBuilder get objectClassBuilder => loader.coreLibrary["Object"]; |
419 return loader.coreLibrary.exports["Object"]; | |
420 } | |
421 | 419 |
422 Class get objectClass => objectClassBuilder.cls; | 420 Class get objectClass => objectClassBuilder.cls; |
423 | 421 |
424 /// If [builder] doesn't have a constructors, install the defaults. | 422 /// If [builder] doesn't have a constructors, install the defaults. |
425 void installDefaultConstructor(SourceClassBuilder builder) { | 423 void installDefaultConstructor(SourceClassBuilder builder) { |
426 if (builder.cls.isMixinApplication) { | 424 if (builder.cls.isMixinApplication) { |
427 // We have to test if builder.cls is a mixin application. [builder] may | 425 // We have to test if builder.cls is a mixin application. [builder] may |
428 // think it's a mixin application, but if its mixed-in type couldn't be | 426 // think it's a mixin application, but if its mixed-in type couldn't be |
429 // resolved, the target class won't be a mixin application and we need | 427 // resolved, the target class won't be a mixin application and we need |
430 // to add a default constructor to complete error recovery. | 428 // to add a default constructor to complete error recovery. |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 } | 696 } |
699 for (Constructor constructor in superclass.constructors) { | 697 for (Constructor constructor in superclass.constructors) { |
700 if (constructor.name.name.isEmpty) { | 698 if (constructor.name.name.isEmpty) { |
701 return constructor.function.requiredParameterCount == 0 | 699 return constructor.function.requiredParameterCount == 0 |
702 ? constructor | 700 ? constructor |
703 : null; | 701 : null; |
704 } | 702 } |
705 } | 703 } |
706 return null; | 704 return null; |
707 } | 705 } |
OLD | NEW |