[CFE] Move constant evaluator to Fasta.

This is in preparation for recognizing Fasta-specific nodes in the
constant evaluator, and for using the Fasta diagnostics framework.

Change-Id: I8535fbb68e622f1814a1d577c348d87e573b6b34
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/96081
Reviewed-by: Kevin Millikin <kmillikin@google.com>
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 0debe8b..c942dcc 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -10,8 +10,7 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/constants.dart'
-    show ConstantsBackend, NumberSemantics;
+import 'package:kernel/transformations/constants.dart' show NumberSemantics;
 import 'invocation_mirror_constants.dart';
 
 const Iterable<String> _allowedDartSchemePaths = const <String>[
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 5f1e815..d9817e3 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -2,9 +2,14 @@
 // 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.
 
+// TODO(askesc): We should not need to call the constant evaluator
+// explicitly once constant-update-2018 is shipped.
+import 'package:front_end/src/api_prototype/constant_evaluator.dart'
+    show ConstantEvaluator, SimpleErrorReporter;
+
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
-import 'package:kernel/transformations/constants.dart';
+import 'package:kernel/target/targets.dart';
 import 'package:kernel/type_environment.dart';
 import 'kernel_helpers.dart';
 
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index db69224..4b08093 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -8,7 +8,6 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/constants.dart' show ConstantsBackend;
 import 'constants.dart' show DevCompilerConstantsBackend;
 import 'kernel_helpers.dart';
 
diff --git a/pkg/front_end/lib/src/api_prototype/constant_evaluator.dart b/pkg/front_end/lib/src/api_prototype/constant_evaluator.dart
new file mode 100644
index 0000000..5eeb2a6
--- /dev/null
+++ b/pkg/front_end/lib/src/api_prototype/constant_evaluator.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, 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 front_end.constant_evaluator;
+
+export '../fasta/kernel/constant_evaluator.dart'
+    show
+        ConstantEvaluator,
+        ConstantsTransformer,
+        ErrorReporter,
+        EvaluationEnvironment,
+        SimpleErrorReporter,
+        transformComponent,
+        transformLibraries;
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
similarity index 97%
rename from pkg/kernel/lib/transformations/constants.dart
rename to pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index e7c77df..ba99185 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -16,17 +16,21 @@
 /// Furthermore due to the lowering of certain constructs in the front-end
 /// (e.g. '??') we need to support a super-set of the normal constant expression
 /// language.  Issue(http://dartbug.com/31799)
-library kernel.transformations.constants;
+library fasta.constant_evaluator;
+
+import 'dart:core' hide MapEntry;
 
 import 'dart:io' as io;
 
-import '../ast.dart';
-import '../class_hierarchy.dart';
-import '../clone.dart';
-import '../core_types.dart';
-import '../kernel.dart';
-import '../type_algebra.dart';
-import '../type_environment.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/clone.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/type_algebra.dart';
+import 'package:kernel/type_environment.dart';
+
+import 'package:kernel/target/targets.dart';
 
 Component transformComponent(Component component, ConstantsBackend backend,
     Map<String, String> environmentDefines, ErrorReporter errorReporter,
@@ -370,7 +374,7 @@
   }
 }
 
-class ConstantEvaluator extends RecursiveVisitor {
+class ConstantEvaluator extends RecursiveVisitor<Constant> {
   final ConstantsBackend backend;
   final NumberSemantics numberSemantics;
   Map<String, String> environmentDefines;
@@ -1239,7 +1243,7 @@
     final List<Object> concatenated = <Object>[new StringBuffer()];
     for (int i = 0; i < node.expressions.length; i++) {
       Constant constant = _evaluateSubexpression(node.expressions[i]);
-      if (constant is PrimitiveConstant) {
+      if (constant is PrimitiveConstant<Object>) {
         String value = constant.value.toString();
         Object last = concatenated.last;
         if (last is StringBuffer) {
@@ -1629,32 +1633,6 @@
   }
 }
 
-/// The different kinds of number semantics supported by the constant evaluator.
-enum NumberSemantics {
-  /// Dart VM number semantics.
-  vm,
-
-  /// JavaScript (Dart2js and DDC) number semantics.
-  js,
-}
-
-// Backend specific constant evaluation behavior
-class ConstantsBackend {
-  const ConstantsBackend();
-
-  /// Lowering of a list constant to a backend-specific representation.
-  Constant lowerListConstant(ListConstant constant) => constant;
-
-  /// Lowering of a set constant to a backend-specific representation.
-  Constant lowerSetConstant(SetConstant constant) => constant;
-
-  /// Lowering of a map constant to a backend-specific representation.
-  Constant lowerMapConstant(MapConstant constant) => constant;
-
-  /// Number semantics to use for this backend.
-  NumberSemantics get numberSemantics => NumberSemantics.vm;
-}
-
 // Used as control-flow to abort the current evaluation.
 class _AbortCurrentEvaluation {
   final String message;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
index 6cb0a71..5b40187 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
@@ -9,8 +9,6 @@
 
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
-import 'package:kernel/transformations/constants.dart' show ErrorReporter;
-
 import '../fasta_codes.dart'
     show
         Message,
@@ -34,6 +32,8 @@
 
 import '../loader.dart' show Loader;
 
+import 'constant_evaluator.dart' show ErrorReporter;
+
 class KernelConstantErrorReporter extends ErrorReporter {
   final Loader<Library> loader;
   final TypeEnvironment typeEnvironment;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index a766167..a797830 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -43,9 +43,6 @@
 
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
-import 'package:kernel/transformations/constants.dart' as constants
-    show transformLibraries;
-
 import '../../api_prototype/file_system.dart' show FileSystem;
 
 import '../compiler_context.dart' show CompilerContext;
@@ -85,6 +82,8 @@
 
 import '../uri_translator.dart' show UriTranslator;
 
+import 'constant_evaluator.dart' as constants show transformLibraries;
+
 import 'kernel_builder.dart'
     show
         ClassBuilder,
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index 5f792a5..d0019c3 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -6,6 +6,9 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:front_end/src/api_prototype/constant_evaluator.dart'
+    as constants show SimpleErrorReporter, transformComponent;
+
 import 'package:args/args.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
@@ -13,9 +16,6 @@
 import 'package:kernel/src/tool/batch_util.dart';
 import 'package:kernel/target/targets.dart';
 
-import 'package:kernel/transformations/constants.dart' as constants
-    show SimpleErrorReporter, transformComponent;
-
 import 'package:kernel/transformations/continuation.dart' as cont;
 import 'package:kernel/transformations/empty.dart' as empty;
 import 'package:kernel/transformations/method_call.dart' as method_call;
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 3472254..47521ca 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -6,7 +6,6 @@
 import '../ast.dart';
 import '../class_hierarchy.dart';
 import '../core_types.dart';
-import '../transformations/constants.dart' show ConstantsBackend;
 
 final List<String> targetNames = targets.keys.toList();
 
@@ -33,6 +32,32 @@
       {List<C> context});
 }
 
+/// The different kinds of number semantics supported by the constant evaluator.
+enum NumberSemantics {
+  /// Dart VM number semantics.
+  vm,
+
+  /// JavaScript (Dart2js and DDC) number semantics.
+  js,
+}
+
+// Backend specific constant evaluation behavior
+class ConstantsBackend {
+  const ConstantsBackend();
+
+  /// Lowering of a list constant to a backend-specific representation.
+  Constant lowerListConstant(ListConstant constant) => constant;
+
+  /// Lowering of a set constant to a backend-specific representation.
+  Constant lowerSetConstant(SetConstant constant) => constant;
+
+  /// Lowering of a map constant to a backend-specific representation.
+  Constant lowerMapConstant(MapConstant constant) => constant;
+
+  /// Number semantics to use for this backend.
+  NumberSemantics get numberSemantics => NumberSemantics.vm;
+}
+
 /// A target provides backend-specific options for generating kernel IR.
 abstract class Target {
   String get name;
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index 9a9c9c8..2dc607d 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -5,7 +5,7 @@
 library vm.constants_native_effects;
 
 import '../ast.dart';
-import '../transformations/constants.dart';
+import '../target/targets.dart';
 import '../core_types.dart';
 
 class VmConstantsBackend extends ConstantsBackend {
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index cecadf5..0dbc532 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -4,17 +4,17 @@
 
 library vm.bytecode.gen_bytecode;
 
+// TODO(askesc): We should not need to call the constant evaluator
+// explicitly once constant-update-2018 is shipped.
+import 'package:front_end/src/api_prototype/constant_evaluator.dart'
+    show ConstantEvaluator, EvaluationEnvironment, ErrorReporter;
+
 import 'package:kernel/ast.dart' hide MapEntry;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/external_name.dart' show getExternalName;
 import 'package:kernel/library_index.dart' show LibraryIndex;
-import 'package:kernel/transformations/constants.dart'
-    show
-        ConstantEvaluator,
-        ConstantsBackend,
-        EvaluationEnvironment,
-        ErrorReporter;
+import 'package:kernel/target/targets.dart' show ConstantsBackend;
 import 'package:kernel/type_algebra.dart'
     show Substitution, containsTypeVariable;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
diff --git a/pkg/vm/lib/constants_error_reporter.dart b/pkg/vm/lib/constants_error_reporter.dart
index d2fdc95..88eeeb6 100644
--- a/pkg/vm/lib/constants_error_reporter.dart
+++ b/pkg/vm/lib/constants_error_reporter.dart
@@ -6,6 +6,9 @@
 /// [constants.ErrorReporter] which uses package:front_end to report errors.
 library vm.constants_error_reporter;
 
+import 'package:front_end/src/api_prototype/constant_evaluator.dart'
+    as constants;
+
 import 'package:front_end/src/api_unstable/vm.dart'
     show CompilerContext, Severity;
 
@@ -13,7 +16,6 @@
 
 import 'package:kernel/ast.dart'
     show Constant, DartType, IntConstant, Member, TreeNode;
-import 'package:kernel/transformations/constants.dart' as constants;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
 class ForwardConstantEvaluationErrors extends constants.ErrorReporter {
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 9313820..049e7bb 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -13,6 +13,11 @@
 import 'package:build_integration/file_system/multi_root.dart'
     show MultiRootFileSystem, MultiRootFileSystemEntity;
 
+// TODO(askesc): We should not need to call the constant evaluator
+// explicitly once constant-update-2018 is shipped.
+import 'package:front_end/src/api_prototype/constant_evaluator.dart'
+    as constants;
+
 import 'package:front_end/src/api_unstable/vm.dart'
     show
         CompilerContext,
@@ -39,7 +44,6 @@
     show LimitedBinaryPrinter;
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
-import 'package:kernel/transformations/constants.dart' as constants;
 import 'package:kernel/vm/constants_native_effects.dart' as vm_constants;
 
 import 'bytecode/ast_remover.dart' show ASTRemover;
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 5af1fdd..a04416a 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -11,7 +11,6 @@
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/transformations/mixin_full_resolution.dart'
     as transformMixins show transformLibraries;
-import 'package:kernel/transformations/constants.dart' show ConstantsBackend;
 import 'package:kernel/transformations/continuation.dart' as transformAsync
     show transformLibraries, transformProcedure;
 import 'package:kernel/vm/constants_native_effects.dart'