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

Unified Diff: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart

Issue 2651803003: Introduce KernelWorldBuilder (Closed)
Patch Set: dartfmt 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/ssa/builder_kernel.dart ('k') | pkg/compiler/lib/src/ssa/kernel_impact.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index be03a4d8a36e29b5ef7ddaf3ccbde76737a66bdc..099c4d6dca4117ae4aefa9358cb1eb145e3139ff 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -12,8 +12,9 @@ import '../constants/expressions.dart';
import '../constants/values.dart';
import '../elements/resolution_types.dart';
import '../elements/elements.dart';
-import '../elements/entities.dart' show MemberEntity;
+import '../elements/entities.dart';
import '../elements/modelx.dart';
+import '../elements/types.dart';
import '../js/js.dart' as js;
import '../js_backend/backend_helpers.dart';
import '../js_backend/js_backend.dart';
@@ -33,10 +34,92 @@ import 'jump_handler.dart' show SwitchCaseJumpHandler;
import 'locals_handler.dart';
import 'types.dart';
+/// Interface that translates between Kernel IR nodes and entities.
Siggi Cherem (dart-lang) 2017/01/24 21:16:21 is the idea that this will be used to actually bui
Johnni Winther 2017/01/25 09:08:56 In time the implementation of this interface will
+abstract class KernelWorldBuilder {
+ /// Returns the [DartType] corresponding to [type].
+ DartType getDartType(ir.DartType type);
+
+ /// Returns the list of [DartType]s corresponding to [types].
+ List<DartType> getDartTypes(List<ir.DartType> types);
+
+ /// Returns the [InterfaceType] corresponding to [type].
+ InterfaceType getInterfaceType(ir.InterfaceType type);
+
+ /// Return the [InterfaceType] corresponding to the [cls] with the given
+ /// [typeArguments].
+ InterfaceType createInterfaceType(
+ ir.Class cls, List<ir.DartType> typeArguments);
+
+ /// Returns the [CallStructure] corresponding to the [arguments].
+ CallStructure getCallStructure(ir.Arguments arguments);
+
+ /// Returns the [Selector] corresponding to the invocation or getter/setter
+ /// access of [node].
+ Selector getSelector(ir.Expression node);
+
+ /// Returns the [FunctionEntity] corresponding to the generative or factory
+ /// constructor [node].
+ FunctionEntity getConstructor(ir.Member node);
+
+ /// Returns the [MemberEntity] corresponding to the member [node].
+ MemberEntity getMember(ir.Member node);
+
+ /// Returns the [FunctionEntity] corresponding to the procedure [node].
+ FunctionEntity getMethod(ir.Procedure node);
+
+ /// Returns the [FieldEntity] corresponding to the field [node].
+ FieldEntity getField(ir.Field node);
+
+ /// Returns the [ClassEntity] corresponding to the class [node].
+ ClassEntity getClass(ir.Class node);
+
+ /// Returns the [Local] corresponding to the [node]. The node must be either
+ /// a [ir.FunctionDeclaration] or [ir.FunctionExpression].
+ Local getLocalFunction(ir.Node node);
+
+ /// Returns the [Name] corresponding to [name].
+ Name getName(ir.Name name);
+
+ /// Returns `true` is [node] has a `@Native(...)` annotation.
+ bool isNativeClass(ir.Class node);
+
+ /// Return `true` if [node] is the `dart:_foreign_helper` library.
+ bool isForeignLibrary(ir.Library node);
+
+ /// Computes the native behavior for reading the native [field].
+ native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field);
+
+ /// Computes the native behavior for writing to the native [field].
+ native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field);
+
+ /// Computes the native behavior for calling [procedure].
+ native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure);
+
+ /// Computes the [native.NativeBehavior] for a call to the [JS] function.
+ native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
+
+ /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN]
+ /// function.
+ native.NativeBehavior getNativeBehaviorForJsBuiltinCall(
+ ir.StaticInvocation node);
+
+ /// Computes the [native.NativeBehavior] for a call to the
+ /// [JS_EMBEDDED_GLOBAL] function.
+ native.NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+ ir.StaticInvocation node);
+
+ /// Compute the kind of foreign helper function called by [node], if any.
+ ForeignKind getForeignKind(ir.StaticInvocation node);
+
+ /// Computes the [InterfaceType] referenced by a call to the
+ /// [JS_INTERCEPTOR_CONSTANT] function, if any.
+ InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node);
+}
+
/// A helper class that abstracts all accesses of the AST from Kernel nodes.
///
/// The goal is to remove all need for the AST from the Kernel SSA builder.
-class KernelAstAdapter {
+class KernelAstAdapter implements KernelWorldBuilder {
final Kernel kernel;
final JavaScriptBackend _backend;
final Map<ir.Node, ast.Node> _nodeToAst;
@@ -127,16 +210,18 @@ class KernelAstAdapter {
return result;
}
- ConstructorElement getConstructor(ir.Node node) =>
+ ConstructorElement getConstructor(ir.Member node) =>
getElement(node).declaration;
- MemberElement getMember(ir.Node node) => getElement(node).declaration;
+ MemberElement getMember(ir.Member node) => getElement(node).declaration;
+
+ MethodElement getMethod(ir.Procedure node) => getElement(node).declaration;
- MethodElement getMethod(ir.Node node) => getElement(node).declaration;
+ FieldElement getField(ir.Field node) => getElement(node).declaration;
- FieldElement getField(ir.Node node) => getElement(node).declaration;
+ ClassElement getClass(ir.Class node) => getElement(node).declaration;
- ClassElement getClass(ir.Node node) => getElement(node).declaration;
+ LocalFunctionElement getLocalFunction(ir.Node node) => getElement(node);
ast.Node getNode(ir.Node node) {
ast.Node result = _nodeToAst[node];
@@ -597,12 +682,13 @@ class KernelAstAdapter {
optionalParameterTypes, namedParameters, namedParameterTypes);
}
- ResolutionInterfaceType getInterfaceType(ir.DartType type) =>
+ ResolutionInterfaceType getInterfaceType(ir.InterfaceType type) =>
getDartType(type);
ResolutionInterfaceType createInterfaceType(
- ClassElement cls, List<ResolutionDartType> typeArguments) {
- return new ResolutionInterfaceType(cls, typeArguments);
+ ir.Class cls, List<ir.DartType> typeArguments) {
+ return new ResolutionInterfaceType(
+ getClass(cls), getDartTypes(typeArguments));
}
/// Converts [annotations] into a list of [ConstantExpression]s.
@@ -773,9 +859,24 @@ class KernelAstAdapter {
_compiler.commonElements);
}
+ /// Computes the [InterfaceType] referenced by a call to the
+ /// [JS_INTERCEPTOR_CONSTANT] function, if any.
+ InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node) {
+ if (node.arguments.positional.length != 1 ||
+ node.arguments.named.isNotEmpty) {
+ reporter.reportErrorMessage(CURRENT_ELEMENT_SPANNABLE,
+ MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
+ }
+ ir.Node argument = node.arguments.positional.first;
+ if (argument is ir.TypeLiteral && argument.type is ir.InterfaceType) {
+ return getInterfaceType(argument.type);
+ }
+ return null;
+ }
+
/// Returns `true` is [node] has a `@Native(...)` annotation.
// TODO(johnniwinther): Cache this for later use.
- bool isNative(ir.Class node) {
+ bool isNativeClass(ir.Class node) {
for (ir.Expression annotation in node.annotations) {
if (annotation is ir.ConstructorInvocation) {
ConstructorElement target = getElement(annotation.target).declaration;
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder_kernel.dart ('k') | pkg/compiler/lib/src/ssa/kernel_impact.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698