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