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 ffe037b850d738b5ae80a580717ce40fd32a1bae..711b190856b63bc873630bf643b401ce93b74da7 100644 |
--- a/pkg/compiler/lib/src/inferrer/builder.dart |
+++ b/pkg/compiler/lib/src/inferrer/builder.dart |
@@ -56,7 +56,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
SetBulkMixin<TypeInformation, dynamic> |
implements SemanticSendVisitor<TypeInformation, dynamic> { |
final Compiler compiler; |
- final AstElement analyzedElement; |
+ final ExecutableElement analyzedElement; |
final ResolvedAst resolvedAst; |
final TypeSystem types; |
final Map<JumpTarget, List<LocalsHandler>> breaksFor = |
@@ -72,13 +72,13 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
bool isConstructorRedirect = false; |
bool seenSuperConstructorCall = false; |
SideEffects sideEffects = new SideEffects.empty(); |
- final Element outermostElement; |
+ final MemberElement outermostElement; |
final InferrerEngine inferrer; |
final Setlet<Entity> capturedVariables = new Setlet<Entity>(); |
- final GlobalTypeInferenceElementData inTreeData; |
+ final GlobalTypeInferenceElementData memberData; |
ElementGraphBuilder.internal( |
- AstElement analyzedElement, |
+ ExecutableElement analyzedElement, |
this.resolvedAst, |
this.outermostElement, |
InferrerEngine inferrer, |
@@ -87,9 +87,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
: this.analyzedElement = analyzedElement, |
this.inferrer = inferrer, |
this.types = inferrer.types, |
- this.inTreeData = analyzedElement.isLocal |
- ? inferrer.dataOfLocalFunction(analyzedElement) |
- : inferrer.dataOfMember(analyzedElement) { |
+ this.memberData = inferrer.dataOfMember(analyzedElement.memberContext) { |
assert(outermostElement != null); |
if (locals != null) return; |
ast.Node node; |
@@ -104,15 +102,10 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
new LocalsHandler(inferrer, types, compiler.options, node, fieldScope); |
} |
- ElementGraphBuilder(AstElement element, ResolvedAst resolvedAst, |
+ ElementGraphBuilder(ExecutableElement element, ResolvedAst resolvedAst, |
Compiler compiler, InferrerEngine inferrer, [LocalsHandler handler]) |
- : this.internal( |
- element, |
- resolvedAst, |
- element.outermostEnclosingMemberOrTopLevel.implementation, |
- inferrer, |
- compiler, |
- handler); |
+ : this.internal(element, resolvedAst, element.memberContext, inferrer, |
+ compiler, handler); |
TreeElements get elements => resolvedAst.elements; |
@@ -1238,10 +1231,10 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
} |
Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node); |
- TypeMask getterMask = inTreeData.typeOfGetter(node); |
- TypeMask operatorMask = inTreeData.typeOfOperator(node); |
+ TypeMask getterMask = memberData.typeOfGetter(node); |
+ TypeMask operatorMask = memberData.typeOfOperator(node); |
Selector setterSelector = elements.getSelector(node); |
- TypeMask setterMask = inTreeData.typeOfSend(node); |
+ TypeMask setterMask = memberData.typeOfSend(node); |
String op = node.assignmentOperator.source; |
bool isIncrementOrDecrement = op == '++' || op == '--'; |
@@ -1355,12 +1348,12 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation rhsType) { |
Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node); |
- TypeMask getterMask = inTreeData.typeOfGetter(node); |
+ TypeMask getterMask = memberData.typeOfGetter(node); |
Selector operatorSelector = |
elements.getOperatorSelectorInComplexSendSet(node); |
- TypeMask operatorMask = inTreeData.typeOfOperator(node); |
+ TypeMask operatorMask = memberData.typeOfOperator(node); |
Selector setterSelector = elements.getSelector(node); |
- TypeMask setterMask = inTreeData.typeOfSend(node); |
+ TypeMask setterMask = memberData.typeOfSend(node); |
TypeInformation getterType = handleDynamicSend(node, getterSelector, |
getterMask, receiverType, new ArgumentsTypes([indexType], null)); |
@@ -1457,9 +1450,9 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
Element setter, TypeInformation indexType, TypeInformation rhsType) { |
Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node); |
- TypeMask getterMask = inTreeData.typeOfGetter(node); |
+ TypeMask getterMask = memberData.typeOfGetter(node); |
Selector setterSelector = elements.getSelector(node); |
- TypeMask setterMask = inTreeData.typeOfSend(node); |
+ TypeMask setterMask = memberData.typeOfSend(node); |
TypeInformation getterType = handleSuperSend(node, getterSelector, |
getterMask, getter, new ArgumentsTypes([indexType], null)); |
@@ -1470,7 +1463,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
} else { |
Selector operatorSelector = |
elements.getOperatorSelectorInComplexSendSet(node); |
- TypeMask operatorMask = inTreeData.typeOfOperator(node); |
+ TypeMask operatorMask = memberData.typeOfOperator(node); |
returnType = handleDynamicSend(node, operatorSelector, operatorMask, |
getterType, new ArgumentsTypes([rhsType], null)); |
} |
@@ -1893,9 +1886,9 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation _handleSuperCompound(ast.SendSet node, Element getter, |
Element setter, TypeInformation rhsType) { |
Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node); |
- TypeMask getterMask = inTreeData.typeOfGetter(node); |
+ TypeMask getterMask = memberData.typeOfGetter(node); |
Selector setterSelector = elements.getSelector(node); |
- TypeMask setterMask = inTreeData.typeOfSend(node); |
+ TypeMask setterMask = memberData.typeOfSend(node); |
TypeInformation getterType = |
handleSuperSend(node, getterSelector, getterMask, getter, null); |
@@ -1906,7 +1899,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
} else { |
Selector operatorSelector = |
elements.getOperatorSelectorInComplexSendSet(node); |
- TypeMask operatorMask = inTreeData.typeOfOperator(node); |
+ TypeMask operatorMask = memberData.typeOfOperator(node); |
returnType = handleDynamicSend(node, operatorSelector, operatorMask, |
getterType, new ArgumentsTypes([rhsType], null)); |
} |
@@ -1920,7 +1913,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation handleIndexSet(ast.SendSet node, TypeInformation receiverType, |
TypeInformation indexType, TypeInformation rhsType) { |
Selector setterSelector = elements.getSelector(node); |
- TypeMask setterMask = inTreeData.typeOfSend(node); |
+ TypeMask setterMask = memberData.typeOfSend(node); |
handleDynamicSend(node, setterSelector, setterMask, receiverType, |
new ArgumentsTypes([indexType, rhsType], null)); |
return rhsType; |
@@ -1941,7 +1934,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation indexType = visit(index); |
TypeInformation rhsType = visit(rhs); |
Selector setterSelector = elements.getSelector(node); |
- TypeMask setterMask = inTreeData.typeOfSend(node); |
+ TypeMask setterMask = memberData.typeOfSend(node); |
handleStaticSend(node, setterSelector, setterMask, element, |
new ArgumentsTypes([indexType, rhsType], null)); |
return rhsType; |
@@ -2016,7 +2009,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
ArgumentsTypes arguments = |
node.isPropertyAccess ? null : analyzeArguments(node.arguments); |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
// TODO(herhut): We could do better here if we knew what we |
// are calling does not expose this. |
// TODO(johnniwinther): Do we still need this when calling directly? |
@@ -2043,7 +2036,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
ast.Send node, MemberElement element, ast.NodeList arguments) { |
ArgumentsTypes argumentTypes = analyzeArguments(arguments.nodes); |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
// TODO(herhut): We could do better here if we knew what we |
// are calling does not expose this. |
isThisExposed = true; |
@@ -2065,7 +2058,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
// are calling does not expose this. |
isThisExposed = true; |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
return handleStaticSend(node, selector, mask, method, arguments); |
} |
@@ -2075,7 +2068,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
// are calling does not expose this. |
isThisExposed = true; |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
return handleStaticSend(node, selector, mask, element, null); |
} |
@@ -2086,7 +2079,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
// are calling does not expose this. |
isThisExposed = true; |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
handleStaticSend( |
node, selector, mask, element, new ArgumentsTypes([rhsType], null)); |
return rhsType; |
@@ -2316,7 +2309,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
} |
Selector selector = elements.getSelector(node); |
CallStructure callStructure = selector.callStructure; |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
// In erroneous code the number of arguments in the selector might not |
// match the function element. |
// TODO(polux): return nonNullEmpty and check it doesn'TypeInformation break anything |
@@ -2383,7 +2376,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
ast.Send node, MemberElement element) { |
ArgumentsTypes arguments = analyzeArguments(node.arguments); |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
handleStaticSend(node, selector, mask, element, arguments); |
return inferrer.registerCalledClosure( |
node, |
@@ -2404,7 +2397,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
} |
ArgumentsTypes arguments = analyzeArguments(node.arguments); |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
return handleStaticSend(node, selector, mask, function, arguments); |
} |
@@ -2500,7 +2493,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation handleForeignSend(ast.Send node, Element element) { |
ArgumentsTypes arguments = analyzeArguments(node.arguments); |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
String name = element.name; |
handleStaticSend(node, selector, mask, element, arguments); |
if (name == JavaScriptBackend.JS || |
@@ -2545,14 +2538,14 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
/// Read a static or top level field. |
TypeInformation handleStaticFieldGet(ast.Send node, FieldElement field) { |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
return handleStaticSend(node, selector, mask, field, null); |
} |
/// Invoke a static or top level getter. |
TypeInformation handleStaticGetterGet(ast.Send node, GetterElement getter) { |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
return handleStaticSend(node, selector, mask, getter, null); |
} |
@@ -2560,7 +2553,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation handleStaticFunctionGet( |
ast.Send node, MethodElement function) { |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
return handleStaticSend(node, selector, mask, function, null); |
} |
@@ -2652,7 +2645,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation handleCallInvoke(ast.Send node, TypeInformation closure) { |
ArgumentsTypes arguments = analyzeArguments(node.arguments); |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
return inferrer.registerCalledClosure(node, selector, mask, closure, |
outermostElement, arguments, sideEffects, inLoop); |
} |
@@ -2698,7 +2691,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
_) { |
ArgumentsTypes argumentTypes = analyzeArguments(node.arguments); |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
// This only works for function statements. We need a |
// more sophisticated type system with function types to support |
// more. |
@@ -2737,12 +2730,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
mask = receiverType == types.dynamicType |
? null |
: types.newTypedSelector(receiverType, mask); |
- if (analyzedElement.isLocal) { |
- inferrer.updateSelectorInLocalFunction( |
- analyzedElement, node, selector, mask); |
- } else { |
- inferrer.updateSelectorInMember(analyzedElement, node, selector, mask); |
- } |
+ inferrer.updateSelectorInMember(outermostElement, node, selector, mask); |
} |
// If the receiver of the call is a local, we may know more about |
@@ -2789,7 +2777,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
} |
Selector selector = elements.getSelector(node); |
- TypeMask mask = inTreeData.typeOfSend(node); |
+ TypeMask mask = memberData.typeOfSend(node); |
if (!isThisExposed && isCallOnThis) { |
checkIfExposesThis(selector, types.newTypedSelector(receiverType, mask)); |
} |
@@ -2901,7 +2889,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
ast.Node identifier = node.declaredIdentifier; |
Element element = elements.getForInVariable(node); |
Selector selector = elements.getSelector(identifier); |
- TypeMask mask = inTreeData.typeOfSend(identifier.asSend()); |
+ TypeMask mask = memberData.typeOfSend(identifier.asSend()); |
TypeInformation receiverType; |
if (element != null && element.isInstanceMember) { |
@@ -2921,9 +2909,9 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation expressionType = visit(node.expression); |
Selector currentSelector = Selectors.current; |
- TypeMask currentMask = inTreeData.typeOfIteratorCurrent(node); |
+ TypeMask currentMask = memberData.typeOfIteratorCurrent(node); |
Selector moveNextSelector = Selectors.moveNext; |
- TypeMask moveNextMask = inTreeData.typeOfIteratorMoveNext(node); |
+ TypeMask moveNextMask = memberData.typeOfIteratorMoveNext(node); |
ConstructorElement ctor = |
closedWorld.commonElements.streamIteratorConstructor; |
@@ -2939,11 +2927,11 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation> |
TypeInformation visitSyncForIn(ast.SyncForIn node) { |
TypeInformation expressionType = visit(node.expression); |
Selector iteratorSelector = Selectors.iterator; |
- TypeMask iteratorMask = inTreeData.typeOfIterator(node); |
+ TypeMask iteratorMask = memberData.typeOfIterator(node); |
Selector currentSelector = Selectors.current; |
- TypeMask currentMask = inTreeData.typeOfIteratorCurrent(node); |
+ TypeMask currentMask = memberData.typeOfIteratorCurrent(node); |
Selector moveNextSelector = Selectors.moveNext; |
- TypeMask moveNextMask = inTreeData.typeOfIteratorMoveNext(node); |
+ TypeMask moveNextMask = memberData.typeOfIteratorMoveNext(node); |
TypeInformation iteratorType = handleDynamicSend(node, iteratorSelector, |
iteratorMask, expressionType, new ArgumentsTypes.empty()); |