Handle unevaluated constants in annotations

Change-Id: Icbcdac10ea5aabedbeebd7953134d297ab6c1d32
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/104561
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/compiler/lib/src/ir/annotations.dart b/pkg/compiler/lib/src/ir/annotations.dart
index ae07571..4e10bf8 100644
--- a/pkg/compiler/lib/src/ir/annotations.dart
+++ b/pkg/compiler/lib/src/ir/annotations.dart
@@ -4,6 +4,7 @@
 
 import 'package:kernel/ast.dart' as ir;
 import '../common/names.dart';
+import 'modular.dart';
 
 class IrAnnotationData {
   Map<ir.Class, String> _nativeClassNames = {};
@@ -119,7 +120,8 @@
   }
 }
 
-IrAnnotationData processAnnotations(ir.Component component) {
+IrAnnotationData processAnnotations(ModularCore modularCore) {
+  ir.Component component = modularCore.component;
   IrAnnotationData data = new IrAnnotationData();
 
   void processMember(ir.Member member) {
@@ -128,7 +130,8 @@
     List<String> returnsAnnotations;
     for (ir.Expression annotation in member.annotations) {
       if (annotation is ir.ConstantExpression) {
-        ir.Constant constant = annotation.constant;
+        ir.Constant constant =
+            modularCore.constantEvaluator.evaluate(annotation);
 
         String jsName = _getJsInteropName(constant);
         if (jsName != null) {
@@ -175,7 +178,8 @@
   for (ir.Library library in component.libraries) {
     for (ir.Expression annotation in library.annotations) {
       if (annotation is ir.ConstantExpression) {
-        ir.Constant constant = annotation.constant;
+        ir.Constant constant =
+            modularCore.constantEvaluator.evaluate(annotation);
 
         String jsName = _getJsInteropName(constant);
         if (jsName != null) {
@@ -186,7 +190,8 @@
     for (ir.Class cls in library.classes) {
       for (ir.Expression annotation in cls.annotations) {
         if (annotation is ir.ConstantExpression) {
-          ir.Constant constant = annotation.constant;
+          ir.Constant constant =
+              modularCore.constantEvaluator.evaluate(annotation);
 
           String nativeClassName = _getNativeClassName(constant);
           if (nativeClassName != null) {
@@ -357,6 +362,8 @@
     if (metadata is! ir.ConstantExpression) continue;
     ir.ConstantExpression constantExpression = metadata;
     ir.Constant constant = constantExpression.constant;
+    assert(constant is! ir.UnevaluatedConstant,
+        "Unexpected unevaluated constant on $member: $metadata");
     PragmaAnnotationData data = _getPragmaAnnotation(constant);
     if (data != null) {
       annotations.add(data);
diff --git a/pkg/compiler/lib/src/ir/modular.dart b/pkg/compiler/lib/src/ir/modular.dart
index 9d7ea73..37eb213 100644
--- a/pkg/compiler/lib/src/ir/modular.dart
+++ b/pkg/compiler/lib/src/ir/modular.dart
@@ -11,9 +11,17 @@
 import '../js_backend/annotations.dart';
 import '../util/enumset.dart';
 import 'annotations.dart';
+import 'constants.dart';
 import 'impact.dart';
 import 'scope.dart';
 
+class ModularCore {
+  final ir.Component component;
+  final Dart2jsConstantEvaluator constantEvaluator;
+
+  ModularCore(this.component, this.constantEvaluator);
+}
+
 class ModularMemberData {
   final ScopeModel scopeModel;
   final ImpactBuilderData impactBuilderData;
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 1559108..c93e50f 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -71,7 +71,8 @@
   void registerLoadedLibraries(KernelResult kernelResult) {
     _elementMap.addComponent(kernelResult.component);
     if (_options.useCFEConstants) {
-      _irAnnotationData = processAnnotations(kernelResult.component);
+      _irAnnotationData = processAnnotations(new ModularCore(
+          kernelResult.component, _elementMap.constantEvaluator));
     }
     _annotationProcessor = new KernelAnnotationProcessor(
         elementMap, nativeBasicDataBuilder, _irAnnotationData);
diff --git a/tests/compiler/dart2js/model/cfe_annotations_test.dart b/tests/compiler/dart2js/model/cfe_annotations_test.dart
index d1ea655..d5b0e0f 100644
--- a/tests/compiler/dart2js/model/cfe_annotations_test.dart
+++ b/tests/compiler/dart2js/model/cfe_annotations_test.dart
@@ -36,7 +36,7 @@
 @noInline
 method2() {}
 
-@pragma('dart2js:tryInline')
+@pragma(const String.fromEnvironment('foo', defaultValue: 'dart2js:tryInline'))
 method3() {}
 
 @tryInline