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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
| 5 import 'dart:async'; |
5 import 'dart:collection' show Queue; | 6 import 'dart:collection' show Queue; |
6 | 7 |
7 import 'package:kernel/ast.dart' as ir; | 8 import 'package:kernel/ast.dart' as ir; |
8 import 'package:kernel/checks.dart' show CheckParentPointers; | 9 import 'package:kernel/checks.dart' show CheckParentPointers; |
9 | 10 |
10 import '../compiler.dart' show Compiler; | 11 import '../compiler.dart' show Compiler; |
11 import '../constants/expressions.dart' show TypeConstantExpression; | 12 import '../constants/expressions.dart' show TypeConstantExpression; |
12 import '../dart_types.dart' | 13 import '../dart_types.dart' |
13 show DartType, FunctionType, InterfaceType, TypeKind, TypeVariableType; | 14 show DartType, FunctionType, InterfaceType, TypeKind, TypeVariableType; |
14 import '../diagnostics/messages.dart' show MessageKind; | 15 import '../diagnostics/messages.dart' show MessageKind; |
15 import '../diagnostics/spannable.dart' show Spannable; | 16 import '../diagnostics/spannable.dart' show Spannable; |
16 import '../elements/elements.dart' | 17 import '../elements/elements.dart' |
17 show | 18 show |
18 ClassElement, | 19 ClassElement, |
19 ConstructorElement, | 20 ConstructorElement, |
20 Element, | 21 Element, |
| 22 ExportElement, |
21 FieldElement, | 23 FieldElement, |
22 FunctionElement, | 24 FunctionElement, |
| 25 ImportElement, |
23 LibraryElement, | 26 LibraryElement, |
24 MixinApplicationElement, | 27 MixinApplicationElement, |
25 TypeVariableElement; | 28 TypeVariableElement; |
26 import '../elements/modelx.dart' show ErroneousFieldElementX; | 29 import '../elements/modelx.dart' show ErroneousFieldElementX; |
27 import '../tree/tree.dart' show FunctionExpression, Node; | 30 import '../tree/tree.dart' show FunctionExpression, Node; |
28 import 'kernel_visitor.dart' show IrFunction, KernelVisitor; | 31 import 'kernel_visitor.dart' show IrFunction, KernelVisitor; |
29 | 32 |
30 typedef void WorkAction(); | 33 typedef void WorkAction(); |
31 | 34 |
32 class WorkItem { | 35 class WorkItem { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 ClassElement cls = element.enclosingClass; | 113 ClassElement cls = element.enclosingClass; |
111 if (cls != null && cls.isMixinApplication) { | 114 if (cls != null && cls.isMixinApplication) { |
112 MixinApplicationElement mixinApplication = cls; | 115 MixinApplicationElement mixinApplication = cls; |
113 element = mixinApplication.mixin; | 116 element = mixinApplication.mixin; |
114 } | 117 } |
115 irLibrary = libraryToIr(element.library); | 118 irLibrary = libraryToIr(element.library); |
116 } | 119 } |
117 return new ir.Name(name, irLibrary); | 120 return new ir.Name(name, irLibrary); |
118 } | 121 } |
119 | 122 |
| 123 Future<ir.Library> loadLibrary(Uri uri) async { |
| 124 return libraryToIr(await compiler.libraryLoader.loadLibrary(uri)); |
| 125 } |
| 126 |
120 ir.Library libraryToIr(LibraryElement library) { | 127 ir.Library libraryToIr(LibraryElement library) { |
121 library = library.declaration; | 128 library = library.declaration; |
122 return libraries.putIfAbsent(library, () { | 129 return libraries.putIfAbsent(library, () { |
123 String name = library.hasLibraryName ? library.libraryName : null; | 130 String name = library.hasLibraryName ? library.libraryName : null; |
124 ir.Library libraryNode = new ir.Library(library.canonicalUri, | 131 ir.Library libraryNode = new ir.Library(library.canonicalUri, |
125 name: name, classes: null, procedures: null, fields: null); | 132 name: name, classes: null, procedures: null, fields: null); |
126 addWork(library, () { | 133 addWork(library, () { |
127 Queue<ir.Class> classes = new Queue<ir.Class>(); | 134 Queue<ir.Class> classes = new Queue<ir.Class>(); |
128 Queue<ir.Member> members = new Queue<ir.Member>(); | 135 Queue<ir.Member> members = new Queue<ir.Member>(); |
129 library.implementation.forEachLocalMember((Element e) { | 136 library.implementation.forEachLocalMember((Element e) { |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 void debugMessage(Spannable spannable, String message) { | 489 void debugMessage(Spannable spannable, String message) { |
483 compiler.reporter | 490 compiler.reporter |
484 .reportHintMessage(spannable, MessageKind.GENERIC, {'text': message}); | 491 .reportHintMessage(spannable, MessageKind.GENERIC, {'text': message}); |
485 } | 492 } |
486 | 493 |
487 void internalError(Spannable spannable, String message) { | 494 void internalError(Spannable spannable, String message) { |
488 compiler.reporter.internalError(spannable, message); | 495 compiler.reporter.internalError(spannable, message); |
489 throw message; | 496 throw message; |
490 } | 497 } |
491 | 498 |
| 499 forEachLibraryElement(f(LibraryElement library)) { |
| 500 return compiler.libraryLoader.libraries.forEach(f); |
| 501 } |
| 502 |
492 ConstructorTarget computeEffectiveTarget( | 503 ConstructorTarget computeEffectiveTarget( |
493 ConstructorElement constructor, DartType type) { | 504 ConstructorElement constructor, DartType type) { |
494 constructor = constructor.implementation; | 505 constructor = constructor.implementation; |
495 Set<ConstructorElement> seen = new Set<ConstructorElement>(); | 506 Set<ConstructorElement> seen = new Set<ConstructorElement>(); |
496 functionToIr(constructor); | 507 functionToIr(constructor); |
497 while (constructor != constructor.effectiveTarget) { | 508 while (constructor != constructor.effectiveTarget) { |
498 type = constructor.computeEffectiveTargetType(type); | 509 type = constructor.computeEffectiveTargetType(type); |
499 if (constructor.isGenerativeConstructor) break; | 510 if (constructor.isGenerativeConstructor) break; |
500 if (!seen.add(constructor)) break; | 511 if (!seen.add(constructor)) break; |
501 constructor = constructor.effectiveTarget.implementation; | 512 constructor = constructor.effectiveTarget.implementation; |
502 if (isSyntheticError(constructor)) break; | 513 if (isSyntheticError(constructor)) break; |
503 functionToIr(constructor); | 514 functionToIr(constructor); |
504 } | 515 } |
505 return new ConstructorTarget(constructor, type); | 516 return new ConstructorTarget(constructor, type); |
506 } | 517 } |
507 | 518 |
| 519 /// Compute all the dependencies on the library with [uri] (including the |
| 520 /// library itself). This is useful for creating a Kernel IR `Program`. |
| 521 List<ir.Library> libraryDependencies(Uri uri) { |
| 522 List<ir.Library> result = <ir.Library>[]; |
| 523 Queue<LibraryElement> notProcessed = new Queue<LibraryElement>(); |
| 524 Set<LibraryElement> seen = new Set<LibraryElement>(); |
| 525 LibraryElement library = compiler.libraryLoader.lookupLibrary(uri); |
| 526 void processLater(LibraryElement library) { |
| 527 if (library != null) { |
| 528 notProcessed.addLast(library); |
| 529 } |
| 530 } |
| 531 |
| 532 processLater(library); |
| 533 seen.add(library); |
| 534 LibraryElement core = |
| 535 compiler.libraryLoader.lookupLibrary(Uri.parse("dart:core")); |
| 536 if (seen.add(core)) { |
| 537 // `dart:core` is implicitly imported by most libraries, and for some |
| 538 // reason not included in `library.imports` below. |
| 539 processLater(core); |
| 540 } |
| 541 while (notProcessed.isNotEmpty) { |
| 542 LibraryElement library = notProcessed.removeFirst(); |
| 543 ir.Library irLibrary = libraryToIr(library); |
| 544 for (ImportElement import in library.imports) { |
| 545 if (seen.add(import.importedLibrary)) { |
| 546 processLater(import.importedLibrary); |
| 547 } |
| 548 } |
| 549 for (ExportElement export in library.exports) { |
| 550 if (seen.add(export.exportedLibrary)) { |
| 551 processLater(export.exportedLibrary); |
| 552 } |
| 553 } |
| 554 for (ImportElement import in library.implementation.imports) { |
| 555 if (seen.add(import.importedLibrary)) { |
| 556 processLater(import.importedLibrary); |
| 557 } |
| 558 } |
| 559 for (ExportElement export in library.implementation.exports) { |
| 560 if (seen.add(export.exportedLibrary)) { |
| 561 processLater(export.exportedLibrary); |
| 562 } |
| 563 } |
| 564 if (irLibrary != null) { |
| 565 result.add(irLibrary); |
| 566 } |
| 567 } |
| 568 processWorkQueue(); |
| 569 return result; |
| 570 } |
| 571 |
508 /// Returns true if [element] is synthesized to recover or represent a | 572 /// Returns true if [element] is synthesized to recover or represent a |
509 /// semantic error, for example, missing, duplicated, or ambiguous elements. | 573 /// semantic error, for example, missing, duplicated, or ambiguous elements. |
510 /// However, returns false for elements that have an unrecoverable syntax | 574 /// However, returns false for elements that have an unrecoverable syntax |
511 /// error. Both kinds of element will return true from [Element.isMalformed], | 575 /// error. Both kinds of element will return true from [Element.isMalformed], |
512 /// but they must be handled differently. For example, a static call to | 576 /// but they must be handled differently. For example, a static call to |
513 /// synthetic error element should be compiled to [ir.InvalidExpression], | 577 /// synthetic error element should be compiled to [ir.InvalidExpression], |
514 /// whereas a static call to a method which has a syntax error should be | 578 /// whereas a static call to a method which has a syntax error should be |
515 /// compiled to a static call to the method. The method itself will have a | 579 /// compiled to a static call to the method. The method itself will have a |
516 /// method body that is [ir.InvalidStatement]. | 580 /// method body that is [ir.InvalidStatement]. |
517 bool isSyntheticError(Element element) { | 581 bool isSyntheticError(Element element) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 } | 648 } |
585 | 649 |
586 class ConstructorTarget { | 650 class ConstructorTarget { |
587 final ConstructorElement element; | 651 final ConstructorElement element; |
588 final DartType type; | 652 final DartType type; |
589 | 653 |
590 ConstructorTarget(this.element, this.type); | 654 ConstructorTarget(this.element, this.type); |
591 | 655 |
592 String toString() => "ConstructorTarget($element, $type)"; | 656 String toString() => "ConstructorTarget($element, $type)"; |
593 } | 657 } |
OLD | NEW |