| 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 9739aa4473dbc6bc7c6ddf15c5d5c9ad2075c9ff..780852dfcb62b80e3885e65c1718588d0996fb9e 100644
|
| --- a/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
|
| +++ b/pkg/front_end/lib/src/incremental_kernel_generator_impl.dart
|
| @@ -12,7 +12,9 @@ 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';
|
| import 'package:front_end/src/fasta/translate_uri.dart';
|
| +import 'package:front_end/src/incremental/file_state.dart';
|
| import 'package:kernel/kernel.dart' hide Source;
|
| +import 'package:kernel/target/vm.dart';
|
|
|
| dynamic unimplemented() {
|
| // TODO(paulberry): get rid of this.
|
| @@ -34,9 +36,16 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
|
| /// etc.
|
| final ProcessedOptions _options;
|
|
|
| + /// The set of absolute file URIs that were reported through [invalidate]
|
| + /// and not checked for actual changes yet.
|
| + final Set<Uri> _invalidatedFiles = new Set<Uri>();
|
| +
|
| /// The object that knows how to resolve "package:" and "dart:" URIs.
|
| TranslateUri _uriTranslator;
|
|
|
| + /// The current file system state.
|
| + FileSystemState _fsState;
|
| +
|
| /// The cached SDK kernel.
|
| DillTarget _sdkDillTarget;
|
|
|
| @@ -45,13 +54,18 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
|
| @override
|
| Future<DeltaProgram> computeDelta(
|
| {Future<Null> watch(Uri uri, bool used)}) async {
|
| - _uriTranslator ??= await _options.getUriTranslator();
|
| + await _initialize();
|
| + await _ensureVmLibrariesLoaded();
|
| + await _refreshInvalidatedFiles();
|
| +
|
| + // Ensure that the graph starting at the entry point is ready.
|
| + await _fsState.getFile(_entryPoint);
|
|
|
| DillTarget sdkTarget = await _getSdkDillTarget();
|
| // TODO(scheglov) Use it to also serve other package kernels.
|
|
|
| - KernelTarget kernelTarget = new KernelTarget(_options.fileSystem, sdkTarget,
|
| - _uriTranslator, _options.strongMode, null);
|
| + KernelTarget kernelTarget = new KernelTarget(_fsState.fileSystemView,
|
| + sdkTarget, _uriTranslator, _options.strongMode, null);
|
| kernelTarget.read(_entryPoint);
|
|
|
| // TODO(scheglov) Replace with a better API.
|
| @@ -66,11 +80,25 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
|
| }
|
|
|
| @override
|
| - void invalidate(String path) => unimplemented();
|
| + void invalidate(Uri uri) {
|
| + _invalidatedFiles.add(uri);
|
| + }
|
|
|
| @override
|
| void invalidateAll() => unimplemented();
|
|
|
| + /// Fasta unconditionally loads all VM libraries. In order to be able to
|
| + /// serve them using the file system view, we need to ask [_fsState] for
|
| + /// the corresponding files.
|
| + Future<Null> _ensureVmLibrariesLoaded() async {
|
| + List<String> extraLibraries = new VmTarget(null).extraRequiredLibraries;
|
| + for (String absoluteUriStr in extraLibraries) {
|
| + Uri absoluteUri = Uri.parse(absoluteUriStr);
|
| + Uri fileUri = _uriTranslator.translate(absoluteUri);
|
| + await _fsState.getFile(fileUri);
|
| + }
|
| + }
|
| +
|
| /// Return the [DillTarget] that is used inside of [KernelTarget] to
|
| /// resynthesize SDK libraries.
|
| Future<DillTarget> _getSdkDillTarget() async {
|
| @@ -86,6 +114,24 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
|
| }
|
| return _sdkDillTarget;
|
| }
|
| +
|
| + /// Ensure that asynchronous data from options is ready.
|
| + ///
|
| + /// Ideally this data should be prepared in the constructor, but constructors
|
| + /// cannot be asynchronous.
|
| + Future<Null> _initialize() async {
|
| + _uriTranslator ??= await _options.getUriTranslator();
|
| + _fsState ??= new FileSystemState(_options.fileSystem, _uriTranslator);
|
| + }
|
| +
|
| + /// Refresh all the invalidated files and update dependencies.
|
| + Future<Null> _refreshInvalidatedFiles() async {
|
| + for (Uri fileUri in _invalidatedFiles) {
|
| + FileState file = await _fsState.getFile(fileUri);
|
| + await file.refresh();
|
| + }
|
| + _invalidatedFiles.clear();
|
| + }
|
| }
|
|
|
| ///// Clears canonical names of [NamedNode] references.
|
|
|