Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(471)

Unified Diff: pkg/front_end/lib/src/incremental_kernel_generator_impl.dart

Issue 2886563002: Compute export namespaces for DILL libraries. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
diff --git a/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart b/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
index ad86ecad33a76270ed55117786b3ca8a4e3f4f45..03a56b0e6439ac8eb11039958cf48b4c244994f4 100644
--- a/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
@@ -11,6 +11,7 @@ import 'package:front_end/incremental_resolved_ast_generator.dart';
import 'package:front_end/src/base/api_signature.dart';
import 'package:front_end/src/base/performace_logger.dart';
import 'package:front_end/src/base/processed_options.dart';
+import 'package:front_end/src/fasta/dill/dill_library_builder.dart';
import 'package:front_end/src/fasta/dill/dill_target.dart';
import 'package:front_end/src/fasta/kernel/kernel_target.dart';
import 'package:front_end/src/fasta/ticker.dart';
@@ -147,8 +148,11 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
/// We need kernel libraries for these URIs.
Set<Uri> libraryUris = new Set<Uri>();
+ Map<Uri, FileState> libraryUriToFile = {};
for (FileState library in cycle.libraries) {
- libraryUris.add(library.uri);
+ Uri uri = library.uri;
+ libraryUris.add(uri);
+ libraryUriToFile[uri] = library;
}
/// Check if there is already a bundle with these libraries.
@@ -158,8 +162,11 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
var program = new Program(nameRoot: nameRoot);
var reader = new BinaryBuilder(bytes);
reader.readProgram(program);
- dillTarget.loader
+
+ List<DillLibraryBuilder> libraryBuilders = dillTarget.loader
.appendLibraries(program, (uri) => libraryUris.contains(uri));
+ _computeExportScopes(dillTarget, libraryUriToFile, libraryBuilders);
+
return new _LibraryCycleResult(cycle, signature, program.libraries);
});
}
@@ -185,8 +192,9 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
List<Library> kernelLibraries = program.libraries
.where((library) => libraryUris.contains(library.importUri))
.toList();
- dillTarget.loader
+ List<DillLibraryBuilder> libraryBuilders = dillTarget.loader
.appendLibraries(program, (uri) => libraryUris.contains(uri));
+ _computeExportScopes(dillTarget, libraryUriToFile, libraryBuilders);
_logger.run('Serialize ${kernelLibraries.length} libraries', () {
program.unbindCanonicalNames();
@@ -199,6 +207,33 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
});
}
+ /// Compute exports scopes for a new strongly connected cycle of [libraries].
+ /// The [dillTarget] can be used to access libraries from previous cycles.
Paul Berry 2017/05/15 21:53:48 How much of this code is working around the fact t
scheglov 2017/05/16 17:02:44 Done.
+ void _computeExportScopes(DillTarget dillTarget,
+ Map<Uri, FileState> uriToFile, List<DillLibraryBuilder> libraries) {
+ bool wasChanged = false;
+ do {
+ wasChanged = false;
+ for (DillLibraryBuilder library in libraries) {
+ FileState file = uriToFile[library.uri];
+ for (NamespaceExport export in file.exports) {
+ DillLibraryBuilder exportedLibrary =
+ dillTarget.loader.read(export.library.uri);
+ if (exportedLibrary != null) {
+ exportedLibrary.exports.forEach((name, member) {
+ if (export.filter(name) &&
+ library.addToExportScope(name, member)) {
+ wasChanged = true;
+ }
+ });
+ } else {
+ // TODO(scheglov) How to handle this?
+ }
+ }
+ }
+ } while (wasChanged);
+ }
+
/// Refresh all the invalidated files and update dependencies.
Future<Null> _refreshInvalidatedFiles() async {
await _logger.runAsync('Refresh invalidated files', () async {

Powered by Google App Engine
This is Rietveld 408576698