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);