[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'