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