| 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 b07171b08dbdb27cccef4af41cf94b380064df1e..d5d9db95bf105200b13f3d7312020e2b70872278 100644
|
| --- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
|
| @@ -14,7 +14,7 @@ import '../elements/elements.dart'
|
| show ConstructorElement, LocalElement, MemberElement;
|
| import '../elements/entities.dart';
|
| import '../elements/types.dart';
|
| -import '../tree/tree.dart' as ast show Node, Send;
|
| +import '../tree/tree.dart' as ast show Node;
|
| import '../types/masks.dart'
|
| show
|
| CommonMasks,
|
| @@ -327,7 +327,7 @@ class ParameterAssignments extends IterableBase<TypeInformation> {
|
| * Note that a few elements of these kinds must be treated specially,
|
| * and they are dealt in [ElementTypeInformation.handleSpecialCases]:
|
| *
|
| - * - Parameters of closures, [noSuchMethod] and [call] instance
|
| + * - Parameters of closures, `noSuchMethod` and `call` instance
|
| * methods: we currently do not infer types for those.
|
| *
|
| * - Fields and parameters being assigned by synthesized calls done by
|
| @@ -757,8 +757,8 @@ class ParameterTypeInformation extends ElementTypeInformation {
|
| (_method.name == Identifiers.noSuchMethod_ ||
|
| (_method.name == Identifiers.call &&
|
| disableInferenceForClosures))) {
|
| - // Do not infer types for parameters of [noSuchMethod] and
|
| - // [call] instance methods.
|
| + // Do not infer types for parameters of [noSuchMethod] and [call] instance
|
| + // methods.
|
| giveUp(inferrer);
|
| return safeType(inferrer);
|
| }
|
| @@ -828,7 +828,7 @@ class ParameterTypeInformation extends ElementTypeInformation {
|
| /**
|
| * A [CallSiteTypeInformation] is a call found in the AST, or a
|
| * synthesized call for implicit calls in Dart (such as forwarding
|
| - * factories). The [call] field is a [ast.Node] for the former, and an
|
| + * factories). The [_call] field is a [ast.Node] for the former, and an
|
| * [Element] for the latter.
|
| *
|
| * In the inferrer graph, [CallSiteTypeInformation] nodes do not have
|
| @@ -837,33 +837,35 @@ class ParameterTypeInformation extends ElementTypeInformation {
|
| */
|
| abstract class CallSiteTypeInformation extends TypeInformation
|
| with ApplyableTypeInformation {
|
| - final Spannable call;
|
| + final Spannable _call;
|
| final MemberEntity caller;
|
| final Selector selector;
|
| final TypeMask mask;
|
| final ArgumentsTypes arguments;
|
| final bool inLoop;
|
|
|
| - CallSiteTypeInformation(MemberTypeInformation context, this.call, this.caller,
|
| - this.selector, this.mask, this.arguments, this.inLoop)
|
| + CallSiteTypeInformation(MemberTypeInformation context, this._call,
|
| + this.caller, this.selector, this.mask, this.arguments, this.inLoop)
|
| : super.noAssignments(context) {
|
| assert(_checkCaller(caller));
|
| - // [call] is either an AST node or a constructor element in case of a
|
| - // a forwarding constructor call.
|
| - assert(call is ast.Node || call is ConstructorElement);
|
| + // [_call] is either an AST node or a constructor element in case of a
|
| + // a forwarding constructor _call.
|
| + assert(_call is ast.Node || _call is ConstructorElement);
|
| }
|
|
|
| bool _checkCaller(MemberEntity caller) {
|
| return !(caller is MemberElement && !caller.isDeclaration);
|
| }
|
|
|
| - String toString() => 'Call site $call $type';
|
| + String toString() => 'Call site $debugName $type';
|
|
|
| /// Add [this] to the graph being computed by [engine].
|
| void addToGraph(InferrerEngine engine);
|
|
|
| /// Return an iterable over the targets of this call.
|
| Iterable<MemberEntity> get callees;
|
| +
|
| + String get debugName => '$_call';
|
| }
|
|
|
| class StaticCallSiteTypeInformation extends CallSiteTypeInformation {
|
| @@ -892,7 +894,7 @@ class StaticCallSiteTypeInformation extends CallSiteTypeInformation {
|
|
|
| void addToGraph(InferrerEngine inferrer) {
|
| MemberTypeInformation callee = _getCalledTypeInfo(inferrer);
|
| - callee.addCall(caller, call);
|
| + callee.addCall(caller, _call);
|
| callee.addUser(this);
|
| if (arguments != null) {
|
| arguments.forEach((info) => info.addUser(this));
|
| @@ -948,6 +950,7 @@ class StaticCallSiteTypeInformation extends CallSiteTypeInformation {
|
|
|
| class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| final TypeInformation receiver;
|
| + final bool isConditional;
|
|
|
| /// Cached targets of this call.
|
| Iterable<MemberEntity> targets;
|
| @@ -960,7 +963,8 @@ class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| TypeMask mask,
|
| this.receiver,
|
| ArgumentsTypes arguments,
|
| - bool inLoop)
|
| + bool inLoop,
|
| + this.isConditional)
|
| : super(context, call, enclosing, selector, mask, arguments, inLoop);
|
|
|
| void addToGraph(InferrerEngine inferrer) {
|
| @@ -974,7 +978,7 @@ class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| for (MemberEntity element in targets) {
|
| MemberTypeInformation callee =
|
| inferrer.types.getInferredTypeOfMember(element);
|
| - callee.addCall(caller, call);
|
| + callee.addCall(caller, _call);
|
| callee.addUser(this);
|
| inferrer.updateParameterAssignments(
|
| this, element, arguments, selector, typeMask,
|
| @@ -1114,7 +1118,7 @@ class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| TypeMask computeType(InferrerEngine inferrer) {
|
| Iterable<MemberEntity> oldTargets = targets;
|
| TypeMask typeMask = computeTypedSelector(inferrer);
|
| - inferrer.updateSelectorInMember(caller, call, selector, typeMask);
|
| + inferrer.updateSelectorInMember(caller, _call, selector, typeMask);
|
|
|
| TypeMask maskToUse =
|
| inferrer.closedWorld.extendMaskIfReachesAll(selector, typeMask);
|
| @@ -1138,7 +1142,7 @@ class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| .forEach((MemberEntity element) {
|
| MemberTypeInformation callee =
|
| inferrer.types.getInferredTypeOfMember(element);
|
| - callee.addCall(caller, call);
|
| + callee.addCall(caller, _call);
|
| callee.addUser(this);
|
| inferrer.updateParameterAssignments(
|
| this, element, arguments, selector, typeMask,
|
| @@ -1151,7 +1155,7 @@ class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| .forEach((MemberEntity element) {
|
| MemberTypeInformation callee =
|
| inferrer.types.getInferredTypeOfMember(element);
|
| - callee.removeCall(caller, call);
|
| + callee.removeCall(caller, _call);
|
| callee.removeUser(this);
|
| inferrer.updateParameterAssignments(
|
| this, element, arguments, selector, typeMask,
|
| @@ -1209,26 +1213,24 @@ class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| }
|
| }));
|
|
|
| - if (call is ast.Send) {
|
| - ast.Send send = call;
|
| - if (send.isConditional && receiver.type.isNullable) {
|
| - // Conditional sends (e.g. `a?.b`) may be null if the receiver is null.
|
| - result = result.nullable();
|
| - }
|
| + if (isConditional && receiver.type.isNullable) {
|
| + // Conditional call sites (e.g. `a?.b`) may be null if the receiver is
|
| + // null.
|
| + result = result.nullable();
|
| }
|
| return result;
|
| }
|
|
|
| void giveUp(InferrerEngine inferrer, {bool clearAssignments: true}) {
|
| if (!abandonInferencing) {
|
| - inferrer.updateSelectorInMember(caller, call, selector, mask);
|
| + inferrer.updateSelectorInMember(caller, _call, selector, mask);
|
| Iterable<MemberEntity> oldTargets = targets;
|
| targets = inferrer.closedWorld.locateMembers(selector, mask);
|
| for (MemberEntity element in targets) {
|
| if (!oldTargets.contains(element)) {
|
| MemberTypeInformation callee =
|
| inferrer.types.getInferredTypeOfMember(element);
|
| - callee.addCall(caller, call);
|
| + callee.addCall(caller, _call);
|
| inferrer.updateParameterAssignments(
|
| this, element, arguments, selector, mask,
|
| remove: false, addToQueue: true);
|
| @@ -1250,7 +1252,7 @@ class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
|
| super.removeAndClearReferences(inferrer);
|
| }
|
|
|
| - String toString() => 'Call site $call on ${receiver.type} $type';
|
| + String toString() => 'Call site $debugName on ${receiver.type} $type';
|
|
|
| accept(TypeInformationVisitor visitor) {
|
| return visitor.visitDynamicCallSiteTypeInformation(this);
|
| @@ -1291,7 +1293,7 @@ class ClosureCallSiteTypeInformation extends CallSiteTypeInformation {
|
| throw new UnsupportedError("Cannot compute callees of a closure call.");
|
| }
|
|
|
| - String toString() => 'Closure call $call on $closure';
|
| + String toString() => 'Closure call $debugName on $closure';
|
|
|
| accept(TypeInformationVisitor visitor) {
|
| return visitor.visitClosureCallSiteTypeInformation(this);
|
| @@ -1776,11 +1778,9 @@ class PhiElementTypeInformation extends TypeInformation {
|
|
|
| class ClosureTypeInformation extends TypeInformation
|
| with ApplyableTypeInformation {
|
| - final ast.Node node;
|
| final FunctionEntity _element;
|
|
|
| - ClosureTypeInformation(
|
| - MemberTypeInformation context, this.node, this._element)
|
| + ClosureTypeInformation(MemberTypeInformation context, this._element)
|
| : super(context);
|
|
|
| FunctionEntity get closure => _element;
|
| @@ -1843,14 +1843,16 @@ abstract class TracedTypeInformation implements TypeInformation {
|
| }
|
|
|
| class AwaitTypeInformation extends TypeInformation {
|
| - final ast.Node node;
|
| + final ast.Node _node;
|
|
|
| - AwaitTypeInformation(MemberTypeInformation context, this.node)
|
| + AwaitTypeInformation(MemberTypeInformation context, this._node)
|
| : super(context);
|
|
|
| // TODO(22894): Compute a better type here.
|
| TypeMask computeType(InferrerEngine inferrer) => safeType(inferrer);
|
|
|
| + String get debugName => '$_node';
|
| +
|
| String toString() => 'Await';
|
|
|
| accept(TypeInformationVisitor visitor) {
|
| @@ -1859,13 +1861,15 @@ class AwaitTypeInformation extends TypeInformation {
|
| }
|
|
|
| class YieldTypeInformation extends TypeInformation {
|
| - final ast.Node node;
|
| + final ast.Node _node;
|
|
|
| - YieldTypeInformation(MemberTypeInformation context, this.node)
|
| + YieldTypeInformation(MemberTypeInformation context, this._node)
|
| : super(context);
|
|
|
| TypeMask computeType(InferrerEngine inferrer) => safeType(inferrer);
|
|
|
| + String get debugName => '$_node';
|
| +
|
| String toString() => 'Yield';
|
|
|
| accept(TypeInformationVisitor visitor) {
|
|
|