Introduce `--preview-dart-2` option to run new frontend compiler in flutter tools. (#11741) This adds --preview-dart-2 flag that enables use of Dart 2.0 Frontend in Flutter tools.
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index 9cdd234..c6afb1a 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:meta/meta.dart'; + import 'base/context.dart'; import 'base/file_system.dart'; import 'base/platform.dart'; @@ -16,7 +18,12 @@ snapshotDart, flutterFramework, vmSnapshotData, - isolateSnapshotData + isolateSnapshotData, + platformKernelDill, + platformLibrariesJson, + flutterPatchedSdkPath, + frontendServerSnapshotForEngineDartSdk, + engineDartSdkPath, } String _artifactToFileName(Artifact artifact) { @@ -37,17 +44,37 @@ return 'vm_isolate_snapshot.bin'; case Artifact.isolateSnapshotData: return 'isolate_snapshot.bin'; + case Artifact.platformKernelDill: + return 'platform.dill'; + case Artifact.platformLibrariesJson: + return 'libraries.json'; + case Artifact.flutterPatchedSdkPath: + assert(false, 'No filename for sdk path, should not be invoked'); + return null; + case Artifact.engineDartSdkPath: + return 'dart-sdk'; + case Artifact.frontendServerSnapshotForEngineDartSdk: + return 'frontend_server.dart.snapshot'; } assert(false, 'Invalid artifact $artifact.'); return null; } +class EngineBuildPaths { + const EngineBuildPaths({ @required this.targetEngine, @required this.hostEngine }): + assert(targetEngine != null), + assert(hostEngine != null); + + final String targetEngine; + final String hostEngine; +} + // Manages the engine artifacts of Flutter. abstract class Artifacts { static Artifacts get instance => context[Artifacts]; - static void useLocalEngine(String engineSrcPath, String engineOutPath) { - context.setVariable(Artifacts, new LocalEngineArtifacts(engineSrcPath, engineOutPath)); + static void useLocalEngine(String engineSrcPath, EngineBuildPaths engineBuildPaths) { + context.setVariable(Artifacts, new LocalEngineArtifacts(engineSrcPath, engineBuildPaths.targetEngine, engineBuildPaths.hostEngine)); } // Returns the requested [artifact] for the [platform] and [mode] combination. @@ -91,6 +118,7 @@ switch (artifact) { case Artifact.dartIoEntriesTxt: case Artifact.dartVmEntryPointsTxt: + case Artifact.frontendServerSnapshotForEngineDartSdk: assert(mode != BuildMode.debug, 'Artifact $artifact only available in non-debug mode.'); return fs.path.join(engineDir, _artifactToFileName(artifact)); case Artifact.genSnapshot: @@ -111,6 +139,7 @@ case Artifact.genSnapshot: case Artifact.snapshotDart: case Artifact.flutterFramework: + case Artifact.frontendServerSnapshotForEngineDartSdk: return fs.path.join(engineDir, _artifactToFileName(artifact)); default: assert(false, 'Artifact $artifact not available for platform $platform.'); @@ -118,6 +147,11 @@ } } + String _getFlutterPatchedSdkPath() { + final String engineArtifactsPath = cache.getArtifactDirectory('engine').path; + return fs.path.join(engineArtifactsPath, 'common', 'flutter_patched_sdk'); + } + String _getHostArtifactPath(Artifact artifact, TargetPlatform platform) { switch (artifact) { case Artifact.genSnapshot: @@ -131,9 +165,17 @@ fallThrough: case Artifact.vmSnapshotData: case Artifact.isolateSnapshotData: + case Artifact.frontendServerSnapshotForEngineDartSdk: + case Artifact.engineDartSdkPath: final String engineArtifactsPath = cache.getArtifactDirectory('engine').path; final String platformDirName = getNameForTargetPlatform(platform); return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact)); + case Artifact.platformKernelDill: + return fs.path.join(_getFlutterPatchedSdkPath(), _artifactToFileName(artifact)); + case Artifact.platformLibrariesJson: + return fs.path.join(_getFlutterPatchedSdkPath(), 'lib', _artifactToFileName(artifact)); + case Artifact.flutterPatchedSdkPath: + return _getFlutterPatchedSdkPath(); default: assert(false, 'Artifact $artifact not available for platform $platform.'); return null; @@ -179,8 +221,9 @@ class LocalEngineArtifacts extends Artifacts { final String _engineSrcPath; final String engineOutPath; // TODO(goderbauer): This should be private. + String _hostEngineOutPath; - LocalEngineArtifacts(this._engineSrcPath, this.engineOutPath); + LocalEngineArtifacts(this._engineSrcPath, this.engineOutPath, this._hostEngineOutPath); @override String getArtifactPath(Artifact artifact, [TargetPlatform platform, BuildMode mode]) { @@ -198,8 +241,18 @@ case Artifact.isolateSnapshotData: case Artifact.vmSnapshotData: return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact)); + case Artifact.platformKernelDill: + return fs.path.join(_getFlutterPatchedSdkPath(), _artifactToFileName(artifact)); + case Artifact.platformLibrariesJson: + return fs.path.join(_getFlutterPatchedSdkPath(), 'lib', _artifactToFileName(artifact)); case Artifact.flutterFramework: return fs.path.join(engineOutPath, _artifactToFileName(artifact)); + case Artifact.flutterPatchedSdkPath: + return _getFlutterPatchedSdkPath(); + case Artifact.frontendServerSnapshotForEngineDartSdk: + return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact)); + case Artifact.engineDartSdkPath: + return fs.path.join(_hostEngineOutPath, 'dart-sdk'); } assert(false, 'Invalid artifact $artifact.'); return null; @@ -210,6 +263,10 @@ return fs.path.basename(engineOutPath); } + String _getFlutterPatchedSdkPath() { + return fs.path.join(engineOutPath, 'flutter_patched_sdk'); + } + String _genSnapshotPath() { const List<String> clangDirs = const <String>['clang_x86', 'clang_x64', 'clang_i386']; final String genSnapshotName = _artifactToFileName(Artifact.genSnapshot);