Index: pkg/front_end/lib/src/incremental/kernel_driver.dart |
diff --git a/pkg/front_end/lib/src/incremental/kernel_driver.dart b/pkg/front_end/lib/src/incremental/kernel_driver.dart |
index 60984505d48cbf7838c97c7823ef1902ee358d8c..d940c842e4027f6cb68919bddc695568b2da5fc3 100644 |
--- a/pkg/front_end/lib/src/incremental/kernel_driver.dart |
+++ b/pkg/front_end/lib/src/incremental/kernel_driver.dart |
@@ -51,6 +51,10 @@ class KernelDriver { |
/// Options used by the kernel compiler. |
final ProcessedOptions _options; |
+ /// The optional SDK outline as a serialized program. |
+ /// If provided, the driver will not attempt to read SDK files. |
+ final List<int> _sdkOutlineBytes; |
+ |
/// The logger to report compilation progress. |
final PerformanceLog _logger; |
@@ -68,6 +72,10 @@ class KernelDriver { |
/// reading the file contents. |
final KernelDriverFileAddedFn _fileAddedFn; |
+ /// The optional SDK outline loaded from [_sdkOutlineBytes]. |
+ /// Might be `null` if the bytes are not provided, or if not loaded yet. |
+ Program _sdkOutline; |
+ |
/// The salt to mix into all hashes used as keys for serialized data. |
List<int> _salt; |
@@ -82,10 +90,11 @@ class KernelDriver { |
final _TestView _testView = new _TestView(); |
KernelDriver(this._options, this._uriTranslator, |
- {KernelDriverFileAddedFn fileAddedFn}) |
+ {List<int> sdkOutlineBytes, KernelDriverFileAddedFn fileAddedFn}) |
: _logger = _options.logger, |
_fileSystem = _options.fileSystem, |
_byteStore = _options.byteStore, |
+ _sdkOutlineBytes = sdkOutlineBytes, |
_fileAddedFn = fileAddedFn { |
_computeSalt(); |
@@ -122,6 +131,10 @@ class KernelDriver { |
return await runWithFrontEndContext('Compute delta', () async { |
await _refreshInvalidatedFiles(); |
+ // Load the SDK outline before building the graph, so that the file |
+ // system state is configured to skip SDK libraries. |
+ await _loadSdkOutline(); |
+ |
// Ensure that the graph starting at the entry point is ready. |
FileState entryLibrary = |
await _logger.runAsync('Build graph of files', () async { |
@@ -138,6 +151,12 @@ class KernelDriver { |
DillTarget dillTarget = new DillTarget( |
new Ticker(isVerbose: false), _uriTranslator, _options.target); |
+ // If there is SDK outline, load it. |
+ if (_sdkOutline != null) { |
+ dillTarget.loader.appendLibraries(_sdkOutline); |
+ await dillTarget.buildOutlines(); |
+ } |
+ |
List<LibraryCycleResult> results = []; |
_testView.compiledCycles.clear(); |
await _logger.runAsync('Compute results for cycles', () async { |
@@ -297,6 +316,9 @@ class KernelDriver { |
var saltBuilder = new ApiSignature(); |
saltBuilder.addInt(DATA_VERSION); |
saltBuilder.addBool(_options.strongMode); |
+ if (_sdkOutlineBytes != null) { |
+ saltBuilder.addBytes(_sdkOutlineBytes); |
+ } |
_salt = saltBuilder.toByteList(); |
} |
@@ -335,6 +357,23 @@ class KernelDriver { |
return signatureBuilder.toHex(); |
} |
+ /// Load the SDK outline if its bytes are provided, and configure the file |
+ /// system state to skip SDK library files. |
+ Future<Null> _loadSdkOutline() async { |
+ if (_sdkOutlineBytes != null) { |
+ if (_sdkOutline == null) { |
+ await _logger.runAsync('Load SDK outline from bytes.', () async { |
+ _sdkOutline = new Program(); |
+ new BinaryBuilder(_sdkOutlineBytes).readProgram(_sdkOutline); |
+ // Configure the file system state to skip the outline libraries. |
+ for (var outlineLibrary in _sdkOutline.libraries) { |
+ _fsState.skipSdkLibraries.add(outlineLibrary.importUri); |
+ } |
+ }); |
+ } |
+ } |
+ } |
+ |
/// Refresh all the invalidated files and update dependencies. |
Future<Null> _refreshInvalidatedFiles() async { |
await _logger.runAsync('Refresh invalidated files', () async { |