| Index: pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| index 1a2c85d81fb40486b750c41dad2f095ac286581e..5f6162e3730726c4aaaaa6f0bbd84f34b0e4e967 100644
|
| --- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| @@ -86,12 +86,12 @@ abstract class InferrerEngine {
|
| ///
|
| /// Returns the new type for [analyzedElement].
|
| TypeInformation addReturnTypeForMethod(
|
| - MethodElement element, TypeInformation unused, TypeInformation newType);
|
| + FunctionEntity element, TypeInformation unused, TypeInformation newType);
|
|
|
| /// Applies [f] to all elements in the universe that match [selector] and
|
| /// [mask]. If [f] returns false, aborts the iteration.
|
| void forEachElementMatching(
|
| - Selector selector, TypeMask mask, bool f(Element element));
|
| + Selector selector, TypeMask mask, bool f(MemberEntity element));
|
|
|
| /// Returns the [TypeInformation] node for the default value of a parameter.
|
| /// If this is queried before it is set by [setDefaultTypeOfParameter], a
|
| @@ -100,7 +100,7 @@ abstract class InferrerEngine {
|
| ///
|
| /// Invariant: After graph construction, no [PlaceholderTypeInformation] nodes
|
| /// should be present and a default type for each parameter should exist.
|
| - TypeInformation getDefaultTypeOfParameter(ParameterElement parameter);
|
| + TypeInformation getDefaultTypeOfParameter(Local parameter);
|
|
|
| /// This helper breaks abstractions but is currently required to work around
|
| /// the wrong modeling of default values of optional parameters of
|
| @@ -108,31 +108,30 @@ abstract class InferrerEngine {
|
| ///
|
| /// TODO(johnniwinther): Remove once default values of synthetic parameters
|
| /// are fixed.
|
| - bool hasAlreadyComputedTypeOfParameterDefault(ParameterElement parameter);
|
| + bool hasAlreadyComputedTypeOfParameterDefault(Local parameter);
|
|
|
| /// Sets the type of a parameter's default value to [type]. If the global
|
| /// mapping in [defaultTypeOfParameter] already contains a type, it must be
|
| /// a [PlaceholderTypeInformation], which will be replaced. All its uses are
|
| /// updated.
|
| - void setDefaultTypeOfParameter(
|
| - ParameterElement parameter, TypeInformation type);
|
| + void setDefaultTypeOfParameter(Local parameter, TypeInformation type);
|
|
|
| - Iterable<MemberEntity> getCallersOf(MemberElement element);
|
| + Iterable<MemberEntity> getCallersOf(MemberEntity element);
|
|
|
| // TODO(johnniwinther): Make this private again.
|
| - GlobalTypeInferenceElementData dataOfMember(MemberElement element);
|
| + GlobalTypeInferenceElementData dataOfMember(MemberEntity element);
|
|
|
| - GlobalTypeInferenceElementData lookupDataOfMember(MemberElement element);
|
| + GlobalTypeInferenceElementData lookupDataOfMember(MemberEntity element);
|
|
|
| - bool checkIfExposesThis(ConstructorElement element);
|
| + bool checkIfExposesThis(ConstructorEntity element);
|
|
|
| - void recordExposesThis(ConstructorElement element, bool exposesThis);
|
| + void recordExposesThis(ConstructorEntity element, bool exposesThis);
|
|
|
| /// Records that the return type [element] is of type [type].
|
| - void recordReturnType(MethodElement element, TypeInformation type);
|
| + void recordReturnType(FunctionEntity element, TypeInformation type);
|
|
|
| /// Records that [element] is of type [type].
|
| - void recordTypeOfField(FieldElement element, TypeInformation type);
|
| + void recordTypeOfField(FieldEntity element, TypeInformation type);
|
|
|
| /// Registers a call to await with an expression of type [argumentType] as
|
| /// argument.
|
| @@ -153,7 +152,7 @@ abstract class InferrerEngine {
|
| Selector selector,
|
| TypeMask mask,
|
| TypeInformation closure,
|
| - MemberElement caller,
|
| + MemberEntity caller,
|
| ArgumentsTypes arguments,
|
| SideEffects sideEffects,
|
| bool inLoop);
|
| @@ -169,8 +168,8 @@ abstract class InferrerEngine {
|
| Spannable node,
|
| Selector selector,
|
| TypeMask mask,
|
| - MemberElement caller,
|
| - MemberElement callee,
|
| + MemberEntity caller,
|
| + MemberEntity callee,
|
| ArgumentsTypes arguments,
|
| SideEffects sideEffects,
|
| bool inLoop);
|
| @@ -187,7 +186,7 @@ abstract class InferrerEngine {
|
| Selector selector,
|
| TypeMask mask,
|
| TypeInformation receiverType,
|
| - MemberElement caller,
|
| + MemberEntity caller,
|
| ArgumentsTypes arguments,
|
| SideEffects sideEffects,
|
| bool inLoop,
|
| @@ -201,20 +200,20 @@ abstract class InferrerEngine {
|
| {bool remove, bool addToQueue: true});
|
|
|
| void updateSelectorInMember(
|
| - MemberElement owner, Spannable node, Selector selector, TypeMask mask);
|
| + MemberEntity owner, ast.Node node, Selector selector, TypeMask mask);
|
|
|
| /// Returns the return type of [element].
|
| - TypeInformation returnTypeOfMember(MemberElement element);
|
| + TypeInformation returnTypeOfMember(MemberEntity element);
|
|
|
| /// Returns the type of [element] when being called with [selector].
|
| TypeInformation typeOfMemberWithSelector(
|
| - MemberElement element, Selector selector);
|
| + MemberEntity element, Selector selector);
|
|
|
| /// Returns the type of [element].
|
| - TypeInformation typeOfMember(MemberElement element);
|
| + TypeInformation typeOfMember(MemberEntity element);
|
|
|
| /// Returns the type of [element].
|
| - TypeInformation typeOfParameter(ParameterElement element);
|
| + TypeInformation typeOfParameter(Local element);
|
|
|
| /// Returns the type for [nativeBehavior]. See documentation on
|
| /// [native.NativeBehavior].
|
| @@ -254,8 +253,8 @@ class InferrerEngineImpl extends InferrerEngine {
|
|
|
| final Map<ir.Node, TypeInformation> concreteKernelTypes =
|
| new Map<ir.Node, TypeInformation>();
|
| - final Set<ConstructorElement> generativeConstructorsExposingThis =
|
| - new Set<ConstructorElement>();
|
| + final Set<ConstructorEntity> generativeConstructorsExposingThis =
|
| + new Set<ConstructorEntity>();
|
|
|
| /// Data computed internally within elements, like the type-mask of a send a
|
| /// list allocation, or a for-in loop.
|
| @@ -269,19 +268,19 @@ class InferrerEngineImpl extends InferrerEngine {
|
| this.closedWorld = closedWorld;
|
|
|
| void forEachElementMatching(
|
| - Selector selector, TypeMask mask, bool f(Element element)) {
|
| + Selector selector, TypeMask mask, bool f(MemberEntity element)) {
|
| Iterable<MemberEntity> elements = closedWorld.locateMembers(selector, mask);
|
| for (MemberElement e in elements) {
|
| - if (!f(e.implementation)) return;
|
| + if (!f(e)) return;
|
| }
|
| }
|
|
|
| // TODO(johnniwinther): Make this private again.
|
| - GlobalTypeInferenceElementData dataOfMember(MemberElement element) =>
|
| + GlobalTypeInferenceElementData dataOfMember(MemberEntity element) =>
|
| _memberData.putIfAbsent(
|
| element, () => new GlobalTypeInferenceElementData());
|
|
|
| - GlobalTypeInferenceElementData lookupDataOfMember(MemberElement element) =>
|
| + GlobalTypeInferenceElementData lookupDataOfMember(MemberEntity element) =>
|
| _memberData[element];
|
|
|
| /**
|
| @@ -358,10 +357,9 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
|
|
| void updateSelectorInMember(
|
| - MemberElement owner, Spannable node, Selector selector, TypeMask mask) {
|
| + MemberEntity owner, ast.Node node, Selector selector, TypeMask mask) {
|
| GlobalTypeInferenceElementData data = dataOfMember(owner);
|
| - ast.Node astNode = node;
|
| - if (astNode.asSendSet() != null) {
|
| + if (node.asSendSet() != null) {
|
| if (selector.isSetter || selector.isIndexSet) {
|
| data.setTypeMask(node, mask);
|
| } else if (selector.isGetter || selector.isIndex) {
|
| @@ -370,10 +368,10 @@ class InferrerEngineImpl extends InferrerEngine {
|
| assert(selector.isOperator);
|
| data.setOperatorTypeMaskInComplexSendSet(node, mask);
|
| }
|
| - } else if (astNode.asSend() != null) {
|
| + } else if (node.asSend() != null) {
|
| data.setTypeMask(node, mask);
|
| } else {
|
| - assert(astNode.asForIn() != null);
|
| + assert(node.asForIn() != null);
|
| if (selector == Selectors.iterator) {
|
| data.setIteratorTypeMask(node, mask);
|
| } else if (selector == Selectors.current) {
|
| @@ -385,13 +383,13 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
| }
|
|
|
| - bool checkIfExposesThis(ConstructorElement element) {
|
| - element = element.implementation;
|
| + bool checkIfExposesThis(ConstructorEntity element) {
|
| + assert(!(element is ConstructorElement && !element.isDeclaration));
|
| return generativeConstructorsExposingThis.contains(element);
|
| }
|
|
|
| - void recordExposesThis(ConstructorElement element, bool exposesThis) {
|
| - element = element.implementation;
|
| + void recordExposesThis(ConstructorEntity element, bool exposesThis) {
|
| + assert(!(element is ConstructorElement && !element.isDeclaration));
|
| if (exposesThis) {
|
| generativeConstructorsExposingThis.add(element);
|
| }
|
| @@ -658,16 +656,16 @@ class InferrerEngineImpl extends InferrerEngine {
|
| addedInGraph++;
|
|
|
| if (element.isField) {
|
| - FieldElement fieldElement = element;
|
| + FieldElement field = element;
|
| ast.Node initializer = resolvedAst.body;
|
| - if (element.isFinal || element.isConst) {
|
| + if (field.isFinal || field.isConst) {
|
| // If [element] is final and has an initializer, we record
|
| // the inferred type.
|
| if (resolvedAst.body != null) {
|
| if (type is! ListTypeInformation && type is! MapTypeInformation) {
|
| // For non-container types, the constant handler does
|
| // constant folding that could give more precise results.
|
| - ConstantExpression constant = fieldElement.constant;
|
| + ConstantExpression constant = field.constant;
|
| if (constant != null) {
|
| ConstantValue value =
|
| compiler.backend.constants.getConstantValue(constant);
|
| @@ -687,30 +685,30 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
| } else {
|
| assert(
|
| - fieldElement.isInstanceMember ||
|
| + field.isInstanceMember ||
|
| constant.isImplicit ||
|
| constant.isPotential,
|
| failedAt(
|
| - fieldElement,
|
| + field,
|
| "Constant expression without value: "
|
| "${constant.toStructuredText()}."));
|
| }
|
| }
|
| }
|
| - recordTypeOfField(element, type);
|
| + recordTypeOfField(field, type);
|
| } else if (!element.isInstanceMember) {
|
| - recordTypeOfField(element, types.nullType);
|
| + recordTypeOfField(field, types.nullType);
|
| }
|
| } else if (initializer == null) {
|
| // Only update types of static fields if there is no
|
| // assignment. Instance fields are dealt with in the constructor.
|
| if (Elements.isStaticOrTopLevelField(element)) {
|
| - recordTypeOfField(element, type);
|
| + recordTypeOfField(field, type);
|
| }
|
| } else {
|
| - recordTypeOfField(element, type);
|
| + recordTypeOfField(field, type);
|
| }
|
| - if (Elements.isStaticOrTopLevelField(element) &&
|
| + if (Elements.isStaticOrTopLevelField(field) &&
|
| resolvedAst.body != null &&
|
| !element.isConst) {
|
| dynamic argument = resolvedAst.body;
|
| @@ -718,11 +716,12 @@ class InferrerEngineImpl extends InferrerEngine {
|
| // constant handler to figure out if it's a lazy field or not.
|
| if (argument.asSend() != null ||
|
| (argument.asNewExpression() != null && !argument.isConst)) {
|
| - recordTypeOfField(element, types.nullType);
|
| + recordTypeOfField(field, types.nullType);
|
| }
|
| }
|
| } else {
|
| - recordReturnType(element, type);
|
| + MethodElement method = element;
|
| + recordReturnType(method, type);
|
| }
|
| }
|
|
|
| @@ -857,7 +856,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
|
|
| void setDefaultTypeOfParameter(
|
| - ParameterElement parameter, TypeInformation type) {
|
| + covariant ParameterElement parameter, TypeInformation type) {
|
| assert(parameter.functionDeclaration.isImplementation);
|
| TypeInformation existing = defaultTypeOfParameter[parameter];
|
| defaultTypeOfParameter[parameter] = type;
|
| @@ -882,36 +881,36 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
| }
|
|
|
| - TypeInformation getDefaultTypeOfParameter(ParameterElement parameter) {
|
| + TypeInformation getDefaultTypeOfParameter(Local parameter) {
|
| return defaultTypeOfParameter.putIfAbsent(parameter, () {
|
| return new PlaceholderTypeInformation(types.currentMember);
|
| });
|
| }
|
|
|
| - bool hasAlreadyComputedTypeOfParameterDefault(ParameterElement parameter) {
|
| + bool hasAlreadyComputedTypeOfParameterDefault(Local parameter) {
|
| TypeInformation seen = defaultTypeOfParameter[parameter];
|
| return (seen != null && seen is! PlaceholderTypeInformation);
|
| }
|
|
|
| - TypeInformation typeOfParameter(ParameterElement element) {
|
| + TypeInformation typeOfParameter(Local element) {
|
| return types.getInferredTypeOfParameter(element);
|
| }
|
|
|
| - TypeInformation typeOfMember(MemberElement element) {
|
| - if (element is MethodElement) return types.functionType;
|
| + TypeInformation typeOfMember(MemberEntity element) {
|
| + if (element is FunctionEntity) return types.functionType;
|
| return types.getInferredTypeOfMember(element);
|
| }
|
|
|
| - TypeInformation returnTypeOfMember(MemberElement element) {
|
| - if (element is! MethodElement) return types.dynamicType;
|
| + TypeInformation returnTypeOfMember(MemberEntity element) {
|
| + if (element is! FunctionEntity) return types.dynamicType;
|
| return types.getInferredTypeOfMember(element);
|
| }
|
|
|
| - void recordTypeOfField(FieldElement element, TypeInformation type) {
|
| + void recordTypeOfField(FieldEntity element, TypeInformation type) {
|
| types.getInferredTypeOfMember(element).addAssignment(type);
|
| }
|
|
|
| - void recordReturnType(MethodElement element, TypeInformation type) {
|
| + void recordReturnType(FunctionEntity element, TypeInformation type) {
|
| TypeInformation info = types.getInferredTypeOfMember(element);
|
| if (element.name == '==') {
|
| // Even if x.== doesn't return a bool, 'x == null' evaluates to 'false'.
|
| @@ -923,8 +922,8 @@ class InferrerEngineImpl extends InferrerEngine {
|
| if (info.assignments.isEmpty) info.addAssignment(type);
|
| }
|
|
|
| - TypeInformation addReturnTypeForMethod(
|
| - MethodElement element, TypeInformation unused, TypeInformation newType) {
|
| + TypeInformation addReturnTypeForMethod(covariant MethodElement element,
|
| + TypeInformation unused, TypeInformation newType) {
|
| TypeInformation type = types.getInferredTypeOfMember(element);
|
| // TODO(ngeoffray): Clean up. We do this check because
|
| // [SimpleTypesInferrer] deals with two different inferrers.
|
| @@ -937,8 +936,8 @@ class InferrerEngineImpl extends InferrerEngine {
|
| Spannable node,
|
| Selector selector,
|
| TypeMask mask,
|
| - MemberElement caller,
|
| - MemberElement callee,
|
| + MemberEntity caller,
|
| + covariant MemberElement callee,
|
| ArgumentsTypes arguments,
|
| SideEffects sideEffects,
|
| bool inLoop) {
|
| @@ -973,7 +972,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| Selector selector,
|
| TypeMask mask,
|
| TypeInformation receiverType,
|
| - MemberElement caller,
|
| + MemberEntity caller,
|
| ArgumentsTypes arguments,
|
| SideEffects sideEffects,
|
| bool inLoop,
|
| @@ -1025,7 +1024,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| Selector selector,
|
| TypeMask mask,
|
| TypeInformation closure,
|
| - MemberElement caller,
|
| + MemberEntity caller,
|
| ArgumentsTypes arguments,
|
| SideEffects sideEffects,
|
| bool inLoop) {
|
| @@ -1111,7 +1110,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| types.allocatedLists.values.forEach(cleanup);
|
| }
|
|
|
| - Iterable<MemberEntity> getCallersOf(MemberElement element) {
|
| + Iterable<MemberEntity> getCallersOf(MemberEntity element) {
|
| if (compiler.disableTypeInference) {
|
| throw new UnsupportedError(
|
| "Cannot query the type inferrer when type inference is disabled.");
|
| @@ -1121,7 +1120,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
|
|
| TypeInformation typeOfMemberWithSelector(
|
| - MemberElement element, Selector selector) {
|
| + covariant MemberElement element, Selector selector) {
|
| if (element.name == Identifiers.noSuchMethod_ &&
|
| selector.name != element.name) {
|
| // An invocation can resolve to a [noSuchMethod], in which case
|
|
|