Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1060)

Unified Diff: pkg/compiler/lib/src/kernel/element_adapter.dart

Issue 2669703003: Refactor ConstantExpression/ConstantConstructor to use entities. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/kernel/constant_visitor.dart ('k') | pkg/compiler/lib/src/resolution/members.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/element_adapter.dart
diff --git a/pkg/compiler/lib/src/kernel/element_adapter.dart b/pkg/compiler/lib/src/kernel/element_adapter.dart
index 11dae99f78e8010e6121e5b8c51400552ad10393..448bd65bf8628b2da0a5db4eba99ed516bf60d6f 100644
--- a/pkg/compiler/lib/src/kernel/element_adapter.dart
+++ b/pkg/compiler/lib/src/kernel/element_adapter.dart
@@ -6,6 +6,7 @@ import 'package:kernel/ast.dart' as ir;
import '../common.dart';
import '../common/names.dart';
+import '../constants/expressions.dart';
import '../core_types.dart';
import '../elements/elements.dart';
import '../elements/entities.dart';
@@ -14,6 +15,7 @@ import '../js_backend/backend_helpers.dart';
import '../native/native.dart' as native;
import '../universe/call_structure.dart';
import '../universe/selector.dart';
+import 'kernel_debug.dart';
/// Interface that translates between Kernel IR nodes and entities.
abstract class KernelElementAdapter {
@@ -182,6 +184,20 @@ abstract class KernelElementAdapterMixin implements KernelElementAdapter {
return new Selector.setter(name);
}
+ /// Converts [annotations] into a list of [ConstantExpression]s.
+ List<ConstantExpression> getMetadata(List<ir.Expression> annotations) {
+ List<ConstantExpression> metadata = <ConstantExpression>[];
+ annotations.forEach((ir.Expression node) {
+ ConstantExpression constant = node.accept(new Constantifier(this));
+ if (constant == null) {
+ throw new UnsupportedError(
+ 'No constant for ${DebugPrinter.prettyPrint(node)}');
+ }
+ metadata.add(constant);
+ });
+ return metadata;
+ }
+
/// Returns `true` is [node] has a `@Native(...)` annotation.
// TODO(johnniwinther): Cache this for later use.
bool isNativeClass(ir.Class node) {
@@ -382,3 +398,46 @@ class Stringifier extends ir.ExpressionVisitor<String> {
return sb.toString();
}
}
+
+/// Visitor that converts a kernel constant expression into a
+/// [ConstantExpression].
+class Constantifier extends ir.ExpressionVisitor<ConstantExpression> {
+ final KernelElementAdapter elementAdapter;
+
+ Constantifier(this.elementAdapter);
+
+ @override
+ ConstantExpression visitConstructorInvocation(ir.ConstructorInvocation node) {
+ List<ConstantExpression> arguments = <ConstantExpression>[];
+ List<String> argumentNames = <String>[];
+ for (ir.Expression argument in node.arguments.positional) {
+ ConstantExpression constant = argument.accept(this);
+ if (constant == null) return null;
+ arguments.add(constant);
+ }
+ for (ir.NamedExpression argument in node.arguments.named) {
+ argumentNames.add(argument.name);
+ ConstantExpression constant = argument.value.accept(this);
+ if (constant == null) return null;
+ arguments.add(constant);
+ }
+ return new ConstructedConstantExpression(
+ elementAdapter.createInterfaceType(
+ node.target.enclosingClass, node.arguments.types),
+ elementAdapter.getConstructor(node.target),
+ new CallStructure(
+ node.arguments.positional.length + argumentNames.length,
+ argumentNames),
+ arguments);
+ }
+
+ @override
+ ConstantExpression visitStaticGet(ir.StaticGet node) {
+ return new FieldConstantExpression(elementAdapter.getField(node.target));
+ }
+
+ @override
+ ConstantExpression visitStringLiteral(ir.StringLiteral node) {
+ return new StringConstantExpression(node.value);
+ }
+}
« no previous file with comments | « pkg/compiler/lib/src/kernel/constant_visitor.dart ('k') | pkg/compiler/lib/src/resolution/members.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698