| Index: pkg/compiler/lib/src/inferrer/builder.dart
|
| diff --git a/pkg/compiler/lib/src/inferrer/builder.dart b/pkg/compiler/lib/src/inferrer/builder.dart
|
| index 7e7a8c15188d3f5556a0164fa7f280122d570e98..7be5c044fd24075a5c7382605ac74b8b54f9ded5 100644
|
| --- a/pkg/compiler/lib/src/inferrer/builder.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/builder.dart
|
| @@ -971,6 +971,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
|
| }
|
|
|
| if (analyzedElement.isGenerativeConstructor) {
|
| + ConstructorElement analyzedConstructor = analyzedElement;
|
| isThisExposed = false;
|
| signature.forEachParameter((FormalElement _element) {
|
| ParameterElement element = _element;
|
| @@ -988,12 +989,12 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
|
| }
|
| locals.update(element, parameterType, node);
|
| });
|
| - ClassElement cls = analyzedElement.enclosingClass;
|
| + ClassElement cls = analyzedConstructor.enclosingClass;
|
| Spannable spannable = node;
|
| - if (analyzedElement.isSynthesized) {
|
| - spannable = analyzedElement;
|
| - ConstructorElement constructor = analyzedElement;
|
| - synthesizeForwardingCall(spannable, constructor.definingConstructor);
|
| + if (analyzedConstructor.isSynthesized) {
|
| + spannable = analyzedConstructor;
|
| + synthesizeForwardingCall(
|
| + spannable, analyzedConstructor.definingConstructor);
|
| } else {
|
| visitingInitializers = true;
|
| if (node.initializers != null) {
|
| @@ -1019,10 +1020,10 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
|
| ArgumentsTypes arguments = new ArgumentsTypes([], {});
|
| analyzeSuperConstructorCall(target, arguments);
|
| inferrer.registerCalledMember(node, null, null, outermostElement,
|
| - target.implementation, arguments, sideEffects, inLoop);
|
| + target, arguments, sideEffects, inLoop);
|
| }
|
| visit(node.body);
|
| - inferrer.recordExposesThis(analyzedElement, isThisExposed);
|
| + inferrer.recordExposesThis(analyzedConstructor, isThisExposed);
|
| }
|
| if (!isConstructorRedirect) {
|
| // Iterate over all instance fields, and give a null type to
|
| @@ -1206,18 +1207,19 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
|
|
|
| void checkIfExposesThis(Selector selector, TypeMask mask) {
|
| if (isThisExposed) return;
|
| - inferrer.forEachElementMatching(selector, mask, (dynamic element) {
|
| + inferrer.forEachElementMatching(selector, mask, (MemberEntity element) {
|
| if (element.isField) {
|
| - ResolvedAst elementResolvedAst = element.resolvedAst;
|
| + FieldElement field = element;
|
| + ResolvedAst elementResolvedAst = field.resolvedAst;
|
| if (!selector.isSetter &&
|
| - isInClassOrSubclass(element) &&
|
| - !element.isFinal &&
|
| - locals.fieldScope.readField(element) == null &&
|
| + isInClassOrSubclass(field) &&
|
| + !field.isFinal &&
|
| + locals.fieldScope.readField(field) == null &&
|
| elementResolvedAst.body == null) {
|
| // If the field is being used before this constructor
|
| // actually had a chance to initialize it, say it can be
|
| // null.
|
| - inferrer.recordTypeOfField(element, types.nullType);
|
| + inferrer.recordTypeOfField(field, types.nullType);
|
| }
|
| // Accessing a field does not expose [:this:].
|
| return true;
|
| @@ -2001,14 +2003,15 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
|
| handleDynamicSend(
|
| node, setterSelector, setterMask, receiverType, arguments);
|
| } else if (element.isField) {
|
| - if (element.isFinal) {
|
| - inferrer.recordTypeOfField(element, rhsType);
|
| + FieldElement field = element;
|
| + if (field.isFinal) {
|
| + inferrer.recordTypeOfField(field, rhsType);
|
| } else {
|
| if (analyzedElement.isGenerativeConstructor) {
|
| - locals.updateField(element, rhsType);
|
| + locals.updateField(field, rhsType);
|
| }
|
| if (visitingInitializers) {
|
| - inferrer.recordTypeOfField(element, rhsType);
|
| + inferrer.recordTypeOfField(field, rhsType);
|
| } else {
|
| handleDynamicSend(
|
| node, setterSelector, setterMask, receiverType, arguments);
|
| @@ -2359,8 +2362,8 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
|
| } else if (Elements.isConstructorOfTypedArraySubclass(
|
| constructor, closedWorld)) {
|
| int length = findLength(node);
|
| - TypeInformation elementType =
|
| - inferrer.returnTypeOfMember(target.enclosingClass.lookupMember('[]'));
|
| + MemberElement member = target.enclosingClass.lookupMember('[]');
|
| + TypeInformation elementType = inferrer.returnTypeOfMember(member);
|
| return inferrer.concreteTypes.putIfAbsent(
|
| node,
|
| () => types.allocateList(types.nonNullExact(target.enclosingClass),
|
| @@ -2816,8 +2819,9 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
|
| }
|
|
|
| void recordReturnType(TypeInformation type) {
|
| + MethodElement analyzedMethod = analyzedElement;
|
| returnType =
|
| - inferrer.addReturnTypeForMethod(analyzedElement, returnType, type);
|
| + inferrer.addReturnTypeForMethod(analyzedMethod, returnType, type);
|
| }
|
|
|
| TypeInformation synthesizeForwardingCall(
|
|
|