[Kernel] Do not evaluate fromEnvironment constants
Instead of evaluating them to their default value, leave them
unevaluated.
Change-Id: Iefc7701b9993cae8f7f1eee37d904d21a89a1cd8
Reviewed-on: https://dart-review.googlesource.com/c/89002
Reviewed-by: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Kevin Millikin <kmillikin@google.com>
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 b7372a5..06cdc67 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
@@ -8,16 +8,20 @@
show
Constant,
DartType,
+ EnvironmentBoolConstant,
+ EnvironmentIntConstant,
+ EnvironmentStringConstant,
ListConstant,
MapConstant,
NullConstant,
StaticInvocation,
+ StringConstant,
TreeNode;
import 'package:kernel/transformations/constants.dart'
show ConstantsBackend, ErrorReporter;
-import '../problems.dart' show unimplemented;
+import '../problems.dart' show unexpected, unimplemented;
class KernelConstantsBackend extends ConstantsBackend {
@override
@@ -40,7 +44,24 @@
if (nativeName == 'Bool_fromEnvironment' ||
nativeName == 'Integer_fromEnvironment' ||
nativeName == 'String_fromEnvironment') {
- return namedArguments['defaultValue'] ?? new NullConstant();
+ if (positionalArguments.length == 1 &&
+ positionalArguments.first is StringConstant &&
+ (namedArguments.length == 0 ||
+ (namedArguments.length == 1 &&
+ namedArguments.containsKey('defaultValue')))) {
+ StringConstant name = positionalArguments.first;
+ Constant defaultValue =
+ namedArguments['defaultValue'] ?? new NullConstant();
+ if (nativeName == 'Bool_fromEnvironment') {
+ return new EnvironmentBoolConstant(name.value, defaultValue);
+ }
+ if (nativeName == 'Integer_fromEnvironment') {
+ return new EnvironmentIntConstant(name.value, defaultValue);
+ }
+ return new EnvironmentStringConstant(name.value, defaultValue);
+ }
+ return unexpected('valid constructor invocation', node.toString(),
+ node.fileOffset, node.location.file);
}
return unimplemented('constant evaluation of ${nativeName}',
node.fileOffset, node.location.file);
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index ce6319f..2bddaf9 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5471,7 +5471,7 @@
return v.visitEnvironmentIntConstantReference(this);
}
- DartType getType(TypeEnvironment types) => types.boolType;
+ DartType getType(TypeEnvironment types) => types.intType;
}
class EnvironmentStringConstant extends EnvironmentConstant {
@@ -5483,7 +5483,7 @@
return v.visitEnvironmentStringConstantReference(this);
}
- DartType getType(TypeEnvironment types) => types.boolType;
+ DartType getType(TypeEnvironment types) => types.stringType;
}
class UnevaluatedConstant extends Constant {