| Index: pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
|
| diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
|
| index 30f94ef503965a9cdef0324d3cc88777b65e5f35..2ca54a6bb5130b0d911e65d5ca7b08cfd4126e8f 100644
|
| --- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
|
| @@ -340,15 +340,13 @@ class ParameterAssignments extends IterableBase<TypeInformation> {
|
| *
|
| */
|
| abstract class ElementTypeInformation extends TypeInformation {
|
| - final Element _element;
|
| -
|
| /// Marker to disable inference for closures in [handleSpecialCases].
|
| bool disableInferenceForClosures = true;
|
|
|
| - ElementTypeInformation._internal(MemberTypeInformation context, this._element)
|
| + ElementTypeInformation._internal(MemberTypeInformation context)
|
| : super(context);
|
| - ElementTypeInformation._withAssignments(MemberTypeInformation context,
|
| - this._element, ParameterAssignments assignments)
|
| + ElementTypeInformation._withAssignments(
|
| + MemberTypeInformation context, ParameterAssignments assignments)
|
| : super.withAssignments(context, assignments);
|
|
|
| String getInferredSignature(TypeSystem types);
|
| @@ -369,7 +367,7 @@ abstract class ElementTypeInformation extends TypeInformation {
|
| */
|
| abstract class MemberTypeInformation extends ElementTypeInformation
|
| with ApplyableTypeInformation {
|
| - MemberElement get _member => super._element;
|
| + final MemberEntity _member;
|
|
|
| /**
|
| * If [element] is a function, [closurizedCount] is the number of
|
| @@ -393,10 +391,9 @@ abstract class MemberTypeInformation extends ElementTypeInformation
|
| */
|
| Map<MemberElement, Setlet<Spannable>> _callers;
|
|
|
| - MemberTypeInformation._internal(MemberElement element)
|
| - : super._internal(null, element);
|
| + MemberTypeInformation._internal(this._member) : super._internal(null);
|
|
|
| - MemberElement get member => _element;
|
| + MemberElement get member => _member;
|
|
|
| String get debugName => '$member';
|
|
|
| @@ -474,7 +471,7 @@ abstract class MemberTypeInformation extends ElementTypeInformation
|
| Compiler compiler = inferrer.compiler;
|
| if (!compiler.options.trustTypeAnnotations &&
|
| !compiler.options.enableTypeAssertions &&
|
| - !inferrer.trustTypeAnnotations(_member)) {
|
| + !inferrer.optimizerHints.trustTypeAnnotations(_member)) {
|
| return mask;
|
| }
|
| return _potentiallyNarrowType(mask, inferrer);
|
| @@ -514,14 +511,16 @@ abstract class MemberTypeInformation extends ElementTypeInformation
|
| }
|
|
|
| class FieldTypeInformation extends MemberTypeInformation {
|
| - FieldElement get _field => _member;
|
| + FieldEntity get _field => _member;
|
| + final DartType _type;
|
|
|
| - FieldTypeInformation(FieldElement element) : super._internal(element);
|
| + FieldTypeInformation(FieldEntity element, this._type)
|
| + : super._internal(element);
|
|
|
| TypeMask handleSpecialCases(InferrerEngine inferrer) {
|
| if (!inferrer.backend.canFieldBeUsedForGlobalOptimizations(
|
| _field, inferrer.closedWorld) ||
|
| - inferrer.assumeDynamic(_field)) {
|
| + inferrer.optimizerHints.assumeDynamic(_field)) {
|
| // Do not infer types for fields that have a corresponding annotation or
|
| // are assigned by synthesized calls
|
|
|
| @@ -542,13 +541,13 @@ class FieldTypeInformation extends MemberTypeInformation {
|
| }
|
|
|
| TypeMask _potentiallyNarrowType(TypeMask mask, InferrerEngine inferrer) {
|
| - return _narrowType(inferrer.closedWorld, mask, _field.type);
|
| + return _narrowType(inferrer.closedWorld, mask, _type);
|
| }
|
|
|
| bool hasStableType(InferrerEngine inferrer) {
|
| // The number of assignments of non-final fields is
|
| // not stable. Therefore such a field cannot be stable.
|
| - if (!(_field.isConst || _field.isFinal)) {
|
| + if (!_field.isAssignable) {
|
| return false;
|
| }
|
| return super.hasStableType(inferrer);
|
| @@ -556,17 +555,18 @@ class FieldTypeInformation extends MemberTypeInformation {
|
| }
|
|
|
| class GetterTypeInformation extends MemberTypeInformation {
|
| - GetterElement get _getter => _member;
|
| + FunctionEntity get _getter => _member;
|
| + final FunctionType _type;
|
|
|
| - GetterTypeInformation(GetterElement element) : super._internal(element);
|
| + GetterTypeInformation(FunctionEntity element, this._type)
|
| + : super._internal(element);
|
|
|
| TypeMask handleSpecialCases(InferrerEngine inferrer) {
|
| return _handleFunctionCase(_getter, inferrer);
|
| }
|
|
|
| TypeMask _potentiallyNarrowType(TypeMask mask, InferrerEngine inferrer) {
|
| - FunctionType type = _getter.type;
|
| - return _narrowType(inferrer.closedWorld, mask, type.returnType);
|
| + return _narrowType(inferrer.closedWorld, mask, _type.returnType);
|
| }
|
|
|
| bool hasStableType(InferrerEngine inferrer) {
|
| @@ -575,9 +575,9 @@ class GetterTypeInformation extends MemberTypeInformation {
|
| }
|
|
|
| class SetterTypeInformation extends MemberTypeInformation {
|
| - SetterElement get _setter => _member;
|
| + FunctionEntity get _setter => _member;
|
|
|
| - SetterTypeInformation(SetterElement element) : super._internal(element);
|
| + SetterTypeInformation(FunctionEntity element) : super._internal(element);
|
|
|
| TypeMask handleSpecialCases(InferrerEngine inferrer) {
|
| return _handleFunctionCase(_setter, inferrer);
|
| @@ -593,17 +593,18 @@ class SetterTypeInformation extends MemberTypeInformation {
|
| }
|
|
|
| class MethodTypeInformation extends MemberTypeInformation {
|
| - MethodElement get _method => _member;
|
| + FunctionEntity get _method => _member;
|
| + final FunctionType _type;
|
|
|
| - MethodTypeInformation(MethodElement element) : super._internal(element);
|
| + MethodTypeInformation(FunctionEntity element, this._type)
|
| + : super._internal(element);
|
|
|
| TypeMask handleSpecialCases(InferrerEngine inferrer) {
|
| return _handleFunctionCase(_method, inferrer);
|
| }
|
|
|
| TypeMask _potentiallyNarrowType(TypeMask mask, InferrerEngine inferrer) {
|
| - FunctionType type = _method.type;
|
| - return _narrowType(inferrer.closedWorld, mask, type.returnType);
|
| + return _narrowType(inferrer.closedWorld, mask, _type.returnType);
|
| }
|
|
|
| bool hasStableType(InferrerEngine inferrer) {
|
| @@ -612,29 +613,33 @@ class MethodTypeInformation extends MemberTypeInformation {
|
| }
|
|
|
| class FactoryConstructorTypeInformation extends MemberTypeInformation {
|
| - ConstructorElement get _constructor => _member;
|
| + ConstructorEntity get _constructor => _member;
|
| + final FunctionType _type;
|
|
|
| - FactoryConstructorTypeInformation(ConstructorElement element)
|
| + FactoryConstructorTypeInformation(ConstructorEntity element, this._type)
|
| : super._internal(element);
|
|
|
| TypeMask handleSpecialCases(InferrerEngine inferrer) {
|
| CommonMasks commonMasks = inferrer.commonMasks;
|
| - if (_constructor.isIntFromEnvironmentConstructor) {
|
| - giveUp(inferrer);
|
| - return commonMasks.intType.nullable();
|
| - } else if (_constructor.isBoolFromEnvironmentConstructor) {
|
| - giveUp(inferrer);
|
| - return commonMasks.boolType.nullable();
|
| - } else if (_constructor.isStringFromEnvironmentConstructor) {
|
| - giveUp(inferrer);
|
| - return commonMasks.stringType.nullable();
|
| + if (_constructor.isFromEnvironmentConstructor) {
|
| + if (_constructor.enclosingClass == inferrer.commonElements.intClass) {
|
| + giveUp(inferrer);
|
| + return commonMasks.intType.nullable();
|
| + } else if (_constructor.enclosingClass ==
|
| + inferrer.commonElements.boolClass) {
|
| + giveUp(inferrer);
|
| + return commonMasks.boolType.nullable();
|
| + } else if (_constructor.enclosingClass ==
|
| + inferrer.commonElements.stringClass) {
|
| + giveUp(inferrer);
|
| + return commonMasks.stringType.nullable();
|
| + }
|
| }
|
| return _handleFunctionCase(_constructor, inferrer);
|
| }
|
|
|
| TypeMask _potentiallyNarrowType(TypeMask mask, InferrerEngine inferrer) {
|
| - FunctionType type = _constructor.type;
|
| - return _narrowType(inferrer.closedWorld, mask, type.returnType);
|
| + return _narrowType(inferrer.closedWorld, mask, _type.returnType);
|
| }
|
|
|
| bool hasStableType(InferrerEngine inferrer) {
|
| @@ -643,7 +648,7 @@ class FactoryConstructorTypeInformation extends MemberTypeInformation {
|
| }
|
|
|
| class GenerativeConstructorTypeInformation extends MemberTypeInformation {
|
| - ConstructorElement get _constructor => _member;
|
| + ConstructorEntity get _constructor => _member;
|
|
|
| GenerativeConstructorTypeInformation(ConstructorElement element)
|
| : super._internal(element);
|
| @@ -671,32 +676,29 @@ class GenerativeConstructorTypeInformation extends MemberTypeInformation {
|
| * the [ElementTypeInformation] factory.
|
| */
|
| class ParameterTypeInformation extends ElementTypeInformation {
|
| - ParameterElement get _parameter => super._element;
|
| + final ParameterElement _parameter;
|
| final MethodElement _method;
|
| bool _isInstanceMemberParameter;
|
| bool _isClosureParameter;
|
| bool _isTearOffClosureParameter = false;
|
|
|
| ParameterTypeInformation.localFunction(
|
| - MemberTypeInformation context, ParameterElement parameter, this._method)
|
| + MemberTypeInformation context, this._parameter, this._method)
|
| : _isInstanceMemberParameter = false,
|
| _isClosureParameter = true,
|
| - super._internal(context, parameter);
|
| + super._internal(context);
|
|
|
| ParameterTypeInformation.static(
|
| - MemberTypeInformation context, ParameterElement parameter, this._method)
|
| + MemberTypeInformation context, this._parameter, this._method)
|
| : _isInstanceMemberParameter = false,
|
| _isClosureParameter = false,
|
| - super._internal(context, parameter);
|
| + super._internal(context);
|
|
|
| - ParameterTypeInformation.instanceMember(
|
| - MemberTypeInformation context,
|
| - ParameterElement parameter,
|
| - this._method,
|
| - ParameterAssignments assignments)
|
| + ParameterTypeInformation.instanceMember(MemberTypeInformation context,
|
| + this._parameter, this._method, ParameterAssignments assignments)
|
| : _isInstanceMemberParameter = true,
|
| _isClosureParameter = false,
|
| - super._withAssignments(context, parameter, assignments);
|
| + super._withAssignments(context, assignments);
|
|
|
| MethodElement get method => _method;
|
|
|
| @@ -718,7 +720,7 @@ class ParameterTypeInformation extends ElementTypeInformation {
|
| TypeMask handleSpecialCases(InferrerEngine inferrer) {
|
| if (!inferrer.backend.canFunctionParametersBeUsedForGlobalOptimizations(
|
| _method, inferrer.closedWorld) ||
|
| - inferrer.assumeDynamic(_method)) {
|
| + inferrer.optimizerHints.assumeDynamic(_method)) {
|
| // Do not infer types for parameters that have a corresponding annotation
|
| // or that are assigned by synthesized calls.
|
| giveUp(inferrer);
|
| @@ -767,7 +769,7 @@ class ParameterTypeInformation extends ElementTypeInformation {
|
| TypeMask potentiallyNarrowType(TypeMask mask, InferrerEngine inferrer) {
|
| Compiler compiler = inferrer.compiler;
|
| if (!compiler.options.trustTypeAnnotations &&
|
| - !inferrer.trustTypeAnnotations(_method)) {
|
| + !inferrer.optimizerHints.trustTypeAnnotations(_method)) {
|
| return mask;
|
| }
|
| // When type assertions are enabled (aka checked mode), we have to always
|
|
|