[kernel] Add target for Flutter on Fuchsia.

Change-Id: I7ab8e989e1e2038565e1d04a1c8f8ce880328ed8
Reviewed-on: https://dart-review.googlesource.com/47500
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
diff --git a/pkg/front_end/lib/src/base/libraries_specification.dart b/pkg/front_end/lib/src/base/libraries_specification.dart
index 6ddc5c5..28c95fe 100644
--- a/pkg/front_end/lib/src/base/libraries_specification.dart
+++ b/pkg/front_end/lib/src/base/libraries_specification.dart
@@ -106,10 +106,16 @@
   const LibrariesSpecification(
       [this._targets = const <String, TargetLibrariesSpecification>{}]);
 
-  /// The library specification for a given [target], or null if none is
+  /// The library specification for a given [target], or throws if none is
   /// available.
-  TargetLibrariesSpecification specificationFor(String target) =>
-      _targets[target];
+  TargetLibrariesSpecification specificationFor(String target) {
+    var targetSpec = _targets[target];
+    if (targetSpec == null) {
+      throw new LibrariesSpecificationException(
+        'No library specification for target "$target"');
+    }
+    return targetSpec;
+  }
 
   /// Parse the given [json] as a library specification, resolving any relative
   /// paths from [baseUri].
diff --git a/pkg/front_end/tool/_fasta/compile_platform.dart b/pkg/front_end/tool/_fasta/compile_platform.dart
index 5629776..d541fd7 100644
--- a/pkg/front_end/tool/_fasta/compile_platform.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform.dart
@@ -9,7 +9,10 @@
 import 'dart:io' show File, Platform, exitCode;
 
 import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
-import 'package:vm/target/runner.dart' show RunnerTarget;
+
+import 'package:vm/target/dart_runner.dart' show DartRunnerTarget;
+
+import 'package:vm/target/flutter_runner.dart' show FlutterRunnerTarget;
 
 import 'package:kernel/target/targets.dart' show TargetFlags, targets;
 
@@ -36,7 +39,9 @@
 
 Future main(List<String> arguments) async {
   targets["dart2js"] = (TargetFlags flags) => new Dart2jsTarget(flags);
-  targets["runner"] = (TargetFlags flags) => new RunnerTarget(flags);
+  targets["dart_runner"] = (TargetFlags flags) => new DartRunnerTarget(flags);
+  targets["flutter_runner"] =
+      (TargetFlags flags) => new FlutterRunnerTarget(flags);
   for (int i = 0; i < iterations; i++) {
     if (i > 0) {
       print("\n");
diff --git a/pkg/vm/lib/target/runner.dart b/pkg/vm/lib/target/dart_runner.dart
similarity index 83%
rename from pkg/vm/lib/target/runner.dart
rename to pkg/vm/lib/target/dart_runner.dart
index 3b7ce0c..fe75c94 100644
--- a/pkg/vm/lib/target/runner.dart
+++ b/pkg/vm/lib/target/dart_runner.dart
@@ -1,16 +1,19 @@
 // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-library kernel.target.runner;
+library kernel.target.dart_runner;
 
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/target/vm.dart' show VmTarget;
 
-class RunnerTarget extends VmTarget {
-  RunnerTarget(TargetFlags flags) : super(flags);
+class DartRunnerTarget extends VmTarget {
+  DartRunnerTarget(TargetFlags flags) : super(flags);
 
   @override
-  String get name => 'runner';
+  String get name => 'dart_runner';
+
+  @override
+  bool get enableSuperMixins => true;
 
   // This is the order that bootstrap libraries are loaded according to
   // `runtime/vm/object_store.h`.
diff --git a/pkg/vm/lib/target/runner.dart b/pkg/vm/lib/target/flutter_runner.dart
similarity index 76%
copy from pkg/vm/lib/target/runner.dart
copy to pkg/vm/lib/target/flutter_runner.dart
index 3b7ce0c..8878c01 100644
--- a/pkg/vm/lib/target/runner.dart
+++ b/pkg/vm/lib/target/flutter_runner.dart
@@ -1,16 +1,19 @@
 // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-library kernel.target.runner;
+library kernel.target.flutter_runner;
 
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/target/vm.dart' show VmTarget;
 
-class RunnerTarget extends VmTarget {
-  RunnerTarget(TargetFlags flags) : super(flags);
+class FlutterRunnerTarget extends VmTarget {
+  FlutterRunnerTarget(TargetFlags flags) : super(flags);
 
   @override
-  String get name => 'runner';
+  String get name => 'flutter_runner';
+
+  @override
+  bool get enableSuperMixins => true;
 
   // This is the order that bootstrap libraries are loaded according to
   // `runtime/vm/object_store.h`.
@@ -33,10 +36,12 @@
         'dart:nativewrappers',
         'dart:io',
 
-        // Required for dart_runner.
+        // Required for flutter_runner.
         'dart:fuchsia.builtin',
         'dart:zircon',
         'dart:fuchsia',
         'dart:vmservice_io',
+        'dart:ui',
+        'dart:mozart.internal',
       ];
 }
diff --git a/tools/copy_tree.py b/tools/copy_tree.py
index a9925b4..5d72750 100755
--- a/tools/copy_tree.py
+++ b/tools/copy_tree.py
@@ -82,7 +82,7 @@
       errors.append((srcname, dstname, str(why)))
     # catch the Error from the recursive CopyTree so that we can
     # continue with other files
-    except Error as err:
+    except Exception as err:
       errors.extend(err.args[0])
   try:
     shutil.copystat(src, dst)
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index 9dac1deb..5d1cf86 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -29,7 +29,6 @@
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/target/vm.dart' show VmTarget;
 import 'package:kernel/target/flutter.dart' show FlutterTarget;
-import 'package:vm/target/runner.dart' show RunnerTarget;
 import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
 
 /// Set of input files that were read by this script to generate patched SDK.
@@ -134,10 +133,6 @@
       target = new VmTarget(flags);
       break;
 
-    case 'runner':
-      target = new RunnerTarget(flags);
-      break;
-
     case 'flutter':
     case 'flutter_release':
       target = new FlutterTarget(flags);