Index: pkg/compiler/lib/src/kernel/element_map_mixins.dart |
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart |
similarity index 70% |
copy from pkg/compiler/lib/src/kernel/element_map.dart |
copy to pkg/compiler/lib/src/kernel/element_map_mixins.dart |
index 6dcff310c781af918b18ba09432f2e945b255aaf..19f776edcc2ca7f2ee00c80f48182807a71ba52f 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart |
@@ -5,7 +5,6 @@ |
import 'package:js_runtime/shared/embedded_names.dart'; |
import 'package:kernel/ast.dart' as ir; |
-import '../closure.dart'; |
import '../common.dart'; |
import '../common/names.dart'; |
import '../constants/constructors.dart'; |
@@ -13,7 +12,6 @@ import '../constants/expressions.dart'; |
import '../constants/values.dart'; |
import '../common_elements.dart'; |
import '../elements/entities.dart'; |
-import '../elements/jumps.dart'; |
import '../elements/names.dart'; |
import '../elements/operators.dart'; |
import '../elements/types.dart'; |
@@ -22,185 +20,16 @@ import '../js_backend/backend.dart' show JavaScriptBackend; |
import '../js_backend/namer.dart'; |
import '../js_emitter/code_emitter_task.dart'; |
import '../native/native.dart' as native; |
-import '../types/types.dart'; |
import '../universe/call_structure.dart'; |
import '../universe/selector.dart'; |
-import '../world.dart'; |
+import 'element_map.dart'; |
import 'kernel_debug.dart'; |
-/// Interface that translates between Kernel IR nodes and entities. |
-abstract class KernelToElementMap { |
- /// Access to the commonly used elements and types. |
- CommonElements get commonElements; |
- |
- /// Returns the [DartType] corresponding to [type]. |
- DartType getDartType(ir.DartType type); |
- |
- /// Return the [InterfaceType] corresponding to the [cls] with the given |
- /// [typeArguments]. |
- InterfaceType createInterfaceType( |
- ir.Class cls, List<ir.DartType> typeArguments); |
- |
- /// Returns the [Selector] corresponding to the invocation or getter/setter |
- /// access of [node]. |
- Selector getSelector(ir.Expression 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 [ConstructorEntity] corresponding to the generative or factory |
- /// constructor [node]. |
- ConstructorEntity getConstructor(ir.Member node); |
- |
- /// Returns the [FieldEntity] corresponding to the field [node]. |
- FieldEntity getField(ir.Field node); |
- |
- /// Returns the [Local] corresponding to the [node]. The node must be either |
- /// a [ir.FunctionDeclaration] or [ir.FunctionExpression]. |
- Local getLocalFunction(ir.TreeNode node); |
- |
- /// Returns the super [MemberEntity] for a super invocation, get or set of |
- /// [name] from the member [context]. |
- /// |
- /// The IR doesn't always resolve super accesses to the corresponding |
- /// [target]. If not, the target is computed using [name] and [setter] from |
- /// the enclosing class of [context]. |
- MemberEntity getSuperMember(ir.Member context, ir.Name name, ir.Member target, |
- {bool setter: false}); |
- |
- /// Returns the [Name] corresponding to [name]. |
- Name getName(ir.Name name); |
- |
- /// Return `true` if [node] is the `dart:_foreign_helper` library. |
- bool isForeignLibrary(ir.Library node); |
- |
- /// 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); |
- |
- /// Returns the [js.Name] for the `JsGetName` [constant] value. |
- js.Name getNameForJsGetName(ConstantValue constant, Namer namer); |
- |
- /// Computes the [ConstantValue] for the constant [expression]. |
- // TODO(johnniwinther): Move to [KernelToElementMapForBuilding]. This is only |
- // used in impact builder for symbol constants. |
- ConstantValue getConstantValue(ir.Expression expression, |
- {bool requireConstant: true, bool implicitNull: false}); |
-} |
- |
-/// Interface that translates between Kernel IR nodes and entities used for |
-/// computing the [WorldImpact] for members. |
-abstract class KernelToElementMapForImpact extends KernelToElementMap { |
- /// Returns the [CallStructure] corresponding to the [arguments]. |
- CallStructure getCallStructure(ir.Arguments arguments); |
- |
- /// Returns the [ConstructorEntity] corresponding to a super initializer in |
- /// [constructor]. |
- /// |
- /// The IR resolves super initializers to a [target] up in the type hierarchy. |
- /// Most of the time, the result of this function will be the entity |
- /// corresponding to that target. In the presence of unnamed mixins, this |
- /// function returns an entity for an intermediate synthetic constructor that |
- /// kernel doesn't explicitly represent. |
- /// |
- /// For example: |
- /// class M {} |
- /// class C extends Object with M {} |
- /// |
- /// Kernel will say that C()'s super initializer resolves to Object(), but |
- /// this function will return an entity representing the unnamed mixin |
- /// application "Object+M"'s constructor. |
- ConstructorEntity getSuperConstructor( |
- ir.Constructor constructor, ir.Member target); |
- |
- /// Returns `true` is [node] has a `@Native(...)` annotation. |
- bool isNativeClass(ir.Class node); |
- |
- /// Computes the native behavior for reading the native [field]. |
- native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field, |
- {bool isJsInterop}); |
- |
- /// 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, |
- {bool isJsInterop}); |
- |
- /// 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); |
-} |
- |
-/// Interface that translates between Kernel IR nodes and entities used for |
-/// global type inference and building the SSA graph for members. |
-abstract class KernelToElementMapForBuilding implements KernelToElementMap { |
- /// [ElementEnvironment] for library, class and member lookup. |
+abstract class KernelToElementMapBaseMixin implements KernelToElementMap { |
+ DiagnosticReporter get reporter; |
ElementEnvironment get elementEnvironment; |
- |
- /// Returns the [FunctionType] of the [node]. |
- FunctionType getFunctionType(ir.FunctionNode node); |
- |
- /// 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); |
- |
- /// Returns the kernel IR node that defines the [member]. |
- ir.Node getMemberNode(covariant MemberEntity member); |
- |
- /// Returns the [ClassEntity] corresponding to the class [node]. |
- ClassEntity getClass(ir.Class node); |
- |
- /// Returns the [LibraryEntity] corresponding to the library [node]. |
LibraryEntity getLibrary(ir.Library node); |
- /// Returns the [js.Template] for the `JsBuiltin` [constant] value. |
- js.Template getJsBuiltinTemplate( |
- ConstantValue constant, CodeEmitterTask emitter); |
- |
- /// Return the [ConstantValue] the initial value of [field] or `null` if |
- /// the initializer is not a constant expression. |
- ConstantValue getFieldConstantValue(ir.Field field); |
- |
- /// Returns the `noSuchMethod` [FunctionEntity] call from a |
- /// `super.noSuchMethod` invocation within [cls]. |
- FunctionEntity getSuperNoSuchMethod(ClassEntity cls); |
- |
- /// Returns a [Spannable] for a message pointing to the IR [node] in the |
- /// context of [member]. |
- Spannable getSpannable(MemberEntity member, ir.Node node); |
-} |
- |
-/// Kinds of foreign functions. |
-enum ForeignKind { |
- JS, |
- JS_BUILTIN, |
- JS_EMBEDDED_GLOBAL, |
- JS_INTERCEPTOR_CONSTANT, |
- NONE, |
-} |
- |
-abstract class KernelToElementMapMixin |
- implements KernelToElementMapForBuilding { |
- DiagnosticReporter get reporter; |
- native.BehaviorBuilder get nativeBehaviorBuilder; |
ConstantValue computeConstantValue(ConstantExpression constant, |
{bool requireConstant: true}); |
@@ -271,70 +100,6 @@ abstract class KernelToElementMapMixin |
return new Selector.setter(name); |
} |
- ConstantValue getConstantValue(ir.Expression node, |
- {bool requireConstant: true, bool implicitNull: false}) { |
- ConstantExpression constant; |
- if (node == null) { |
- if (!implicitNull) { |
- throw new SpannableAssertionFailure( |
- CURRENT_ELEMENT_SPANNABLE, 'No expression for constant.'); |
- } |
- constant = new NullConstantExpression(); |
- } else { |
- constant = |
- new Constantifier(this, requireConstant: requireConstant).visit(node); |
- } |
- if (constant == null) { |
- if (requireConstant) { |
- throw new UnsupportedError( |
- 'No constant for ${DebugPrinter.prettyPrint(node)}'); |
- } |
- return null; |
- } |
- return computeConstantValue(constant, requireConstant: requireConstant); |
- } |
- |
- /// Converts [annotations] into a list of [ConstantValue]s. |
- List<ConstantValue> getMetadata(List<ir.Expression> annotations) { |
- if (annotations.isEmpty) return const <ConstantValue>[]; |
- List<ConstantValue> metadata = <ConstantValue>[]; |
- annotations.forEach((ir.Expression node) { |
- metadata.add(getConstantValue(node)); |
- }); |
- return metadata; |
- } |
- |
- /// Returns `true` is [node] has a `@Native(...)` annotation. |
- // TODO(johnniwinther): Cache this for later use. |
- bool isNativeClass(ir.Class node) { |
- for (ir.Expression annotation in node.annotations) { |
- if (annotation is ir.ConstructorInvocation) { |
- FunctionEntity target = getConstructor(annotation.target); |
- if (target.enclosingClass == commonElements.nativeAnnotationClass) { |
- return true; |
- } |
- } |
- } |
- return false; |
- } |
- |
- /// Compute the kind of foreign helper function called by [node], if any. |
- ForeignKind getForeignKind(ir.StaticInvocation node) { |
- if (isForeignLibrary(node.target.enclosingLibrary)) { |
- switch (node.target.name.name) { |
- case JavaScriptBackend.JS: |
- return ForeignKind.JS; |
- case JavaScriptBackend.JS_BUILTIN: |
- return ForeignKind.JS_BUILTIN; |
- case JavaScriptBackend.JS_EMBEDDED_GLOBAL: |
- return ForeignKind.JS_EMBEDDED_GLOBAL; |
- case JavaScriptBackend.JS_INTERCEPTOR_CONSTANT: |
- return ForeignKind.JS_INTERCEPTOR_CONSTANT; |
- } |
- } |
- return ForeignKind.NONE; |
- } |
- |
/// Return `true` if [node] is the `dart:_foreign_helper` library. |
bool isForeignLibrary(ir.Library node) { |
return node.importUri == Uris.dart__foreign_helper; |
@@ -487,6 +252,98 @@ abstract class KernelToElementMapMixin |
commonElements); |
} |
+ js.Name getNameForJsGetName(ConstantValue constant, Namer namer) { |
+ int index = _extractEnumIndexFromConstantValue( |
+ constant, commonElements.jsGetNameEnum); |
+ if (index == null) return null; |
+ return namer.getNameForJsGetName( |
+ CURRENT_ELEMENT_SPANNABLE, JsGetName.values[index]); |
+ } |
+ |
+ int _extractEnumIndexFromConstantValue( |
+ ConstantValue constant, ClassEntity classElement) { |
+ if (constant is ConstructedConstantValue) { |
+ if (constant.type.element == classElement) { |
+ assert(constant.fields.length == 1 || constant.fields.length == 2); |
+ ConstantValue indexConstant = constant.fields.values.first; |
+ if (indexConstant is IntConstantValue) { |
+ return indexConstant.primitiveValue; |
+ } |
+ } |
+ } |
+ return null; |
+ } |
+ |
+ ConstantValue getConstantValue(ir.Expression node, |
+ {bool requireConstant: true, bool implicitNull: false}) { |
+ ConstantExpression constant; |
+ if (node == null) { |
+ if (!implicitNull) { |
+ throw new SpannableAssertionFailure( |
+ CURRENT_ELEMENT_SPANNABLE, 'No expression for constant.'); |
+ } |
+ constant = new NullConstantExpression(); |
+ } else { |
+ constant = |
+ new Constantifier(this, requireConstant: requireConstant).visit(node); |
+ } |
+ if (constant == null) { |
+ if (requireConstant) { |
+ throw new UnsupportedError( |
+ 'No constant for ${DebugPrinter.prettyPrint(node)}'); |
+ } |
+ return null; |
+ } |
+ return computeConstantValue(constant, requireConstant: requireConstant); |
+ } |
+ |
+ /// Converts [annotations] into a list of [ConstantValue]s. |
+ List<ConstantValue> getMetadata(List<ir.Expression> annotations) { |
+ if (annotations.isEmpty) return const <ConstantValue>[]; |
+ List<ConstantValue> metadata = <ConstantValue>[]; |
+ annotations.forEach((ir.Expression node) { |
+ metadata.add(getConstantValue(node)); |
+ }); |
+ return metadata; |
+ } |
+} |
+ |
+abstract class KernelToElementMapForImpactMixin |
+ implements KernelToElementMapForImpact, KernelToElementMapBaseMixin { |
+ DiagnosticReporter get reporter; |
+ native.BehaviorBuilder get nativeBehaviorBuilder; |
+ |
+ /// Returns `true` is [node] has a `@Native(...)` annotation. |
+ // TODO(johnniwinther): Cache this for later use. |
+ bool isNativeClass(ir.Class node) { |
+ for (ir.Expression annotation in node.annotations) { |
+ if (annotation is ir.ConstructorInvocation) { |
+ FunctionEntity target = getConstructor(annotation.target); |
+ if (target.enclosingClass == commonElements.nativeAnnotationClass) { |
+ return true; |
+ } |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ /// Compute the kind of foreign helper function called by [node], if any. |
+ ForeignKind getForeignKind(ir.StaticInvocation node) { |
+ if (isForeignLibrary(node.target.enclosingLibrary)) { |
+ switch (node.target.name.name) { |
+ case JavaScriptBackend.JS: |
+ return ForeignKind.JS; |
+ case JavaScriptBackend.JS_BUILTIN: |
+ return ForeignKind.JS_BUILTIN; |
+ case JavaScriptBackend.JS_EMBEDDED_GLOBAL: |
+ return ForeignKind.JS_EMBEDDED_GLOBAL; |
+ case JavaScriptBackend.JS_INTERCEPTOR_CONSTANT: |
+ return ForeignKind.JS_INTERCEPTOR_CONSTANT; |
+ } |
+ } |
+ return ForeignKind.NONE; |
+ } |
+ |
/// Computes the [InterfaceType] referenced by a call to the |
/// [JS_INTERCEPTOR_CONSTANT] function, if any. |
InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node) { |
@@ -530,7 +387,10 @@ abstract class KernelToElementMapMixin |
type, metadata, typeLookup(resolveAsRaw: false), |
isJsInterop: isJsInterop); |
} |
+} |
+abstract class KernelToElementMapForBuildingMixin |
+ implements KernelToElementMapForBuilding, KernelToElementMapBaseMixin { |
@override |
FunctionEntity getSuperNoSuchMethod(ClassEntity cls) { |
while (cls != null) { |
@@ -556,14 +416,6 @@ abstract class KernelToElementMapMixin |
return function; |
} |
- js.Name getNameForJsGetName(ConstantValue constant, Namer namer) { |
- int index = _extractEnumIndexFromConstantValue( |
- constant, commonElements.jsGetNameEnum); |
- if (index == null) return null; |
- return namer.getNameForJsGetName( |
- CURRENT_ELEMENT_SPANNABLE, JsGetName.values[index]); |
- } |
- |
js.Template getJsBuiltinTemplate( |
ConstantValue constant, CodeEmitterTask emitter) { |
int index = _extractEnumIndexFromConstantValue( |
@@ -571,20 +423,6 @@ abstract class KernelToElementMapMixin |
if (index == null) return null; |
return emitter.builtinTemplateFor(JsBuiltin.values[index]); |
} |
- |
- int _extractEnumIndexFromConstantValue( |
- ConstantValue constant, ClassEntity classElement) { |
- if (constant is ConstructedConstantValue) { |
- if (constant.type.element == classElement) { |
- assert(constant.fields.length == 1 || constant.fields.length == 2); |
- ConstantValue indexConstant = constant.fields.values.first; |
- if (indexConstant is IntConstantValue) { |
- return indexConstant.primitiveValue; |
- } |
- } |
- } |
- return null; |
- } |
} |
/// Visitor that converts string literals and concatenations of string literals |
@@ -609,11 +447,11 @@ class Stringifier extends ir.ExpressionVisitor<String> { |
/// [ConstantExpression]. |
class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
final bool requireConstant; |
- final KernelToElementMapMixin elementAdapter; |
+ final KernelToElementMapBaseMixin elementMap; |
- Constantifier(this.elementAdapter, {this.requireConstant: true}); |
+ Constantifier(this.elementMap, {this.requireConstant: true}); |
- CommonElements get _commonElements => elementAdapter.commonElements; |
+ CommonElements get _commonElements => elementMap.commonElements; |
ConstantExpression visit(ir.Expression node) { |
ConstantExpression constant = node.accept(this); |
@@ -662,10 +500,9 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
List<ConstantExpression> expressions = _computeArguments(arguments); |
if (expressions == null) return null; |
return new ConstructedConstantExpression( |
- elementAdapter.createInterfaceType( |
- target.enclosingClass, arguments.types), |
- elementAdapter.getConstructor(target), |
- elementAdapter.getCallStructure(arguments), |
+ elementMap.createInterfaceType(target.enclosingClass, arguments.types), |
+ elementMap.getConstructor(target), |
+ elementMap.getCallStructure(arguments), |
expressions); |
} |
@@ -695,10 +532,10 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
ConstantExpression visitStaticGet(ir.StaticGet node) { |
ir.Member target = node.target; |
if (target is ir.Field && target.isConst) { |
- return new FieldConstantExpression(elementAdapter.getField(node.target)); |
+ return new FieldConstantExpression(elementMap.getField(node.target)); |
} else if (node.target is ir.Procedure) { |
- FunctionEntity function = elementAdapter.getMethod(node.target); |
- DartType type = elementAdapter.getFunctionType(node.target.function); |
+ FunctionEntity function = elementMap.getMethod(node.target); |
+ DartType type = elementMap.getFunctionType(node.target.function); |
return new FunctionConstantExpression(function, type); |
} |
return defaultExpression(node); |
@@ -746,8 +583,8 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
if (!node.isConst) { |
return defaultExpression(node); |
} |
- DartType keyType = elementAdapter.getDartType(node.keyType); |
- DartType valueType = elementAdapter.getDartType(node.valueType); |
+ DartType keyType = elementMap.getDartType(node.keyType); |
+ DartType valueType = elementMap.getDartType(node.valueType); |
List<ConstantExpression> keys = <ConstantExpression>[]; |
List<ConstantExpression> values = <ConstantExpression>[]; |
for (ir.MapEntry entry in node.entries) { |
@@ -767,7 +604,7 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
if (!node.isConst) { |
return defaultExpression(node); |
} |
- DartType elementType = elementAdapter.getDartType(node.typeArgument); |
+ DartType elementType = elementMap.getDartType(node.typeArgument); |
List<ConstantExpression> values = <ConstantExpression>[]; |
for (ir.Expression expression in node.expressions) { |
ConstantExpression value = visit(expression); |
@@ -780,7 +617,7 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
@override |
ConstantExpression visitTypeLiteral(ir.TypeLiteral node) { |
- DartType type = elementAdapter.getDartType(node.type); |
+ DartType type = elementMap.getDartType(node.type); |
String name; |
if (type.isDynamic) { |
name = 'dynamic'; |
@@ -860,7 +697,7 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
@override |
ConstantExpression visitStaticInvocation(ir.StaticInvocation node) { |
- MemberEntity member = elementAdapter.getMember(node.target); |
+ MemberEntity member = elementMap.getMember(node.target); |
if (member == _commonElements.identicalFunction) { |
if (node.arguments.positional.length == 2 && |
node.arguments.named.isEmpty) { |
@@ -944,8 +781,8 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
ConstantConstructor computeConstantConstructor(ir.Constructor node) { |
assert(node.isConst); |
ir.Class cls = node.enclosingClass; |
- InterfaceType type = elementAdapter.elementEnvironment |
- .getThisType(elementAdapter.getClass(cls)); |
+ InterfaceType type = |
+ elementMap.elementEnvironment.getThisType(elementMap.getClass(cls)); |
Map<dynamic, ConstantExpression> defaultValues = |
<dynamic, ConstantExpression>{}; |
@@ -977,7 +814,7 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
<FieldEntity, ConstantExpression>{}; |
void registerField(ir.Field field, ConstantExpression constant) { |
- fieldMap[elementAdapter.getField(field)] = constant; |
+ fieldMap[elementMap.getField(field)] = constant; |
} |
if (!isRedirecting) { |
@@ -1013,122 +850,3 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> { |
} |
} |
} |
- |
-/// Interface for type inference results for kernel IR nodes. |
-abstract class KernelToTypeInferenceMap { |
- /// Returns the inferred return type of [function]. |
- TypeMask getReturnTypeOf(FunctionEntity function); |
- |
- /// Returns the inferred receiver type of the dynamic [invocation]. |
- TypeMask typeOfInvocation( |
- ir.MethodInvocation invocation, ClosedWorld closedWorld); |
- |
- /// Returns the inferred receiver type of the dynamic [read]. |
- TypeMask typeOfGet(ir.PropertyGet read); |
- |
- /// Returns the inferred receiver type of the dynamic [write]. |
- TypeMask typeOfSet(ir.PropertySet write, ClosedWorld closedWorld); |
- |
- /// Returns the inferred type of [listLiteral]. |
- TypeMask typeOfListLiteral(covariant MemberEntity owner, |
- ir.ListLiteral listLiteral, ClosedWorld closedWorld); |
- |
- /// Returns the inferred type of iterator in [forInStatement]. |
- TypeMask typeOfIterator(ir.ForInStatement forInStatement); |
- |
- /// Returns the inferred type of `current` in [forInStatement]. |
- TypeMask typeOfIteratorCurrent(ir.ForInStatement forInStatement); |
- |
- /// Returns the inferred type of `moveNext` in [forInStatement]. |
- TypeMask typeOfIteratorMoveNext(ir.ForInStatement forInStatement); |
- |
- /// Returns `true` if [forInStatement] is inferred to be a JavaScript |
- /// indexable iterator. |
- bool isJsIndexableIterator( |
- ir.ForInStatement forInStatement, ClosedWorld closedWorld); |
- |
- /// Returns `true` if [mask] is inferred to have a JavaScript `length` |
- /// property. |
- bool isFixedLength(TypeMask mask, ClosedWorld closedWorld); |
- |
- /// Returns the inferred index type of [forInStatement]. |
- TypeMask inferredIndexType(ir.ForInStatement forInStatement); |
- |
- /// Returns the inferred type of [member]. |
- TypeMask getInferredTypeOf(MemberEntity member); |
- |
- /// Returns the inferred type of the [parameter]. |
- TypeMask getInferredTypeOfParameter(Local parameter); |
- |
- /// Returns the inferred type of a dynamic [selector] access on a receiver of |
- /// type [mask]. |
- TypeMask selectorTypeOf(Selector selector, TypeMask mask); |
- |
- /// Returns the returned type annotation in the [nativeBehavior]. |
- TypeMask typeFromNativeBehavior( |
- native.NativeBehavior nativeBehavior, ClosedWorld closedWorld); |
-} |
- |
-/// Map from kernel IR nodes to local entities. |
-abstract class KernelToLocalsMap { |
- /// The member currently being built. |
- MemberEntity get currentMember; |
- |
- // TODO(johnniwinther): Make these return the [KernelToLocalsMap] to use from |
- // now on. |
- /// Call to notify that [member] is currently being inlined. |
- void enterInlinedMember(covariant MemberEntity member); |
- |
- /// Call to notify that [member] is no longer being inlined. |
- void leaveInlinedMember(covariant MemberEntity member); |
- |
- /// Returns the [Local] for [node]. |
- Local getLocal(ir.VariableDeclaration node); |
- |
- /// Returns the [JumpTarget] for the break statement [node]. |
- JumpTarget getJumpTargetForBreak(ir.BreakStatement node); |
- |
- /// Returns `true` if [node] should generate a `continue` to its [JumpTarget]. |
- bool generateContinueForBreak(ir.BreakStatement node); |
- |
- /// Returns the [JumpTarget] defined by the labelled statement [node] or |
- /// `null` if [node] is not a jump target. |
- JumpTarget getJumpTargetForLabel(ir.LabeledStatement node); |
- |
- /// Returns the [JumpTarget] defined by the switch statement [node] or `null` |
- /// if [node] is not a jump target. |
- JumpTarget getJumpTargetForSwitch(ir.SwitchStatement node); |
- |
- /// Returns the [JumpTarget] for the continue switch statement [node]. |
- JumpTarget getJumpTargetForContinueSwitch(ir.ContinueSwitchStatement node); |
- |
- /// Returns the [JumpTarget] defined by the switch case [node] or `null` |
- /// if [node] is not a jump target. |
- JumpTarget getJumpTargetForSwitchCase(ir.SwitchCase node); |
- |
- /// Returns the [JumpTarget] defined the do statement [node] or `null` |
- /// if [node] is not a jump target. |
- JumpTarget getJumpTargetForDo(ir.DoStatement node); |
- |
- /// Returns the [JumpTarget] defined by the for statement [node] or `null` |
- /// if [node] is not a jump target. |
- JumpTarget getJumpTargetForFor(ir.ForStatement node); |
- |
- /// Returns the [JumpTarget] defined by the for-in statement [node] or `null` |
- /// if [node] is not a jump target. |
- JumpTarget getJumpTargetForForIn(ir.ForInStatement node); |
- |
- /// Returns the [JumpTarget] defined by the while statement [node] or `null` |
- /// if [node] is not a jump target. |
- JumpTarget getJumpTargetForWhile(ir.WhileStatement node); |
- |
- /// Returns the [LoopClosureScope] for the loop [node] in [closureClassMaps]. |
- LoopClosureScope getLoopClosureScope( |
- ClosureDataLookup closureLookup, ir.TreeNode node); |
-} |
- |
-/// Comparator for the canonical order or named arguments. |
-// TODO(johnniwinther): Remove this when named parameters are sorted in dill. |
-int namedOrdering(ir.VariableDeclaration a, ir.VariableDeclaration b) { |
- return a.name.compareTo(b.name); |
-} |