| Index: pkg/compiler/lib/src/kernel/kernel.dart
|
| diff --git a/pkg/compiler/lib/src/kernel/kernel.dart b/pkg/compiler/lib/src/kernel/kernel.dart
|
| index d5f115173f61d748e4fb666294e2a07031288f59..fa53c0e163885f446efda9e43488590bf0f6f0b3 100644
|
| --- a/pkg/compiler/lib/src/kernel/kernel.dart
|
| +++ b/pkg/compiler/lib/src/kernel/kernel.dart
|
| @@ -2,6 +2,7 @@
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE.md file.
|
|
|
| +import 'dart:async';
|
| import 'dart:collection' show Queue;
|
|
|
| import 'package:kernel/ast.dart' as ir;
|
| @@ -18,8 +19,10 @@ import '../elements/elements.dart'
|
| ClassElement,
|
| ConstructorElement,
|
| Element,
|
| + ExportElement,
|
| FieldElement,
|
| FunctionElement,
|
| + ImportElement,
|
| LibraryElement,
|
| MixinApplicationElement,
|
| TypeVariableElement;
|
| @@ -117,6 +120,10 @@ class Kernel {
|
| return new ir.Name(name, irLibrary);
|
| }
|
|
|
| + Future<ir.Library> loadLibrary(Uri uri) async {
|
| + return libraryToIr(await compiler.libraryLoader.loadLibrary(uri));
|
| + }
|
| +
|
| ir.Library libraryToIr(LibraryElement library) {
|
| library = library.declaration;
|
| return libraries.putIfAbsent(library, () {
|
| @@ -489,6 +496,10 @@ class Kernel {
|
| throw message;
|
| }
|
|
|
| + forEachLibraryElement(f(LibraryElement library)) {
|
| + return compiler.libraryLoader.libraries.forEach(f);
|
| + }
|
| +
|
| ConstructorTarget computeEffectiveTarget(
|
| ConstructorElement constructor, DartType type) {
|
| constructor = constructor.implementation;
|
| @@ -505,6 +516,59 @@ class Kernel {
|
| return new ConstructorTarget(constructor, type);
|
| }
|
|
|
| + /// Compute all the dependencies on the library with [uri] (including the
|
| + /// library itself). This is useful for creating a Kernel IR `Program`.
|
| + List<ir.Library> libraryDependencies(Uri uri) {
|
| + List<ir.Library> result = <ir.Library>[];
|
| + Queue<LibraryElement> notProcessed = new Queue<LibraryElement>();
|
| + Set<LibraryElement> seen = new Set<LibraryElement>();
|
| + LibraryElement library = compiler.libraryLoader.lookupLibrary(uri);
|
| + void processLater(LibraryElement library) {
|
| + if (library != null) {
|
| + notProcessed.addLast(library);
|
| + }
|
| + }
|
| +
|
| + processLater(library);
|
| + seen.add(library);
|
| + LibraryElement core =
|
| + compiler.libraryLoader.lookupLibrary(Uri.parse("dart:core"));
|
| + if (seen.add(core)) {
|
| + // `dart:core` is implicitly imported by most libraries, and for some
|
| + // reason not included in `library.imports` below.
|
| + processLater(core);
|
| + }
|
| + while (notProcessed.isNotEmpty) {
|
| + LibraryElement library = notProcessed.removeFirst();
|
| + ir.Library irLibrary = libraryToIr(library);
|
| + for (ImportElement import in library.imports) {
|
| + if (seen.add(import.importedLibrary)) {
|
| + processLater(import.importedLibrary);
|
| + }
|
| + }
|
| + for (ExportElement export in library.exports) {
|
| + if (seen.add(export.exportedLibrary)) {
|
| + processLater(export.exportedLibrary);
|
| + }
|
| + }
|
| + for (ImportElement import in library.implementation.imports) {
|
| + if (seen.add(import.importedLibrary)) {
|
| + processLater(import.importedLibrary);
|
| + }
|
| + }
|
| + for (ExportElement export in library.implementation.exports) {
|
| + if (seen.add(export.exportedLibrary)) {
|
| + processLater(export.exportedLibrary);
|
| + }
|
| + }
|
| + if (irLibrary != null) {
|
| + result.add(irLibrary);
|
| + }
|
| + }
|
| + processWorkQueue();
|
| + return result;
|
| + }
|
| +
|
| /// Returns true if [element] is synthesized to recover or represent a
|
| /// semantic error, for example, missing, duplicated, or ambiguous elements.
|
| /// However, returns false for elements that have an unrecoverable syntax
|
|
|