| // Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| library fasta.library_graph; |
| |
| import 'package:kernel/kernel.dart' |
| show Library, LibraryDependency, LibraryPart; |
| |
| import 'package:kernel/util/graph.dart' show Graph; |
| |
| import 'incremental_compiler.dart' show getPartUri; |
| |
| class LibraryGraph implements Graph<Uri> { |
| final Map<Uri, Library> libraries; |
| |
| LibraryGraph(this.libraries); |
| |
| Iterable<Uri> get vertices => libraries.keys; |
| |
| Iterable<Uri> neighborsOf(Uri vertex) sync* { |
| Library? library = libraries[vertex]; |
| if (library == null) { |
| throw "Library not found: $vertex"; |
| } |
| |
| // Imports and exports. |
| for (LibraryDependency dependency in library.dependencies) { |
| Uri uri1 = dependency.targetLibrary.importUri; |
| Uri uri2 = dependency.targetLibrary.fileUri; |
| if (libraries.containsKey(uri1)) { |
| yield uri1; |
| // ignore: unnecessary_null_comparison |
| } else if (uri2 != null) { |
| if (libraries.containsKey(uri2)) { |
| yield uri2; |
| } |
| } |
| } |
| |
| // Parts. |
| // Normally there won't be libraries for these, but if, for instance, |
| // the part didn't exist there will be a synthetic library. |
| for (LibraryPart part in library.parts) { |
| Uri partUri = getPartUri(library.importUri, part); |
| Uri fileUri = getPartUri(library.fileUri, part); |
| if (libraries.containsKey(partUri)) { |
| yield partUri; |
| } else if (fileUri != partUri && libraries.containsKey(fileUri)) { |
| yield fileUri; |
| } |
| } |
| } |
| } |