Index: sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart |
index eb5f364188e21a6cd654cc8ea8a9bbfde5b78dc4..41cfacf219c910923459c40db5be960eb1e0bdb6 100644 |
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart |
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart |
@@ -32,6 +32,7 @@ class ClassBaseType implements BaseType { |
final ClassElement element; |
ClassBaseType(this.element); |
+ |
bool operator ==(BaseType other) { |
if (identical(this, other)) return true; |
if (other is! ClassBaseType) return false; |
@@ -194,14 +195,15 @@ class UnionType implements ConcreteType { |
class ConcreteTypeCartesianProduct |
extends Iterable<ConcreteTypesEnvironment> { |
final ConcreteTypesInferrer inferrer; |
- final BaseType baseTypeOfThis; |
+ final ClassElement typeOfThis; |
final Map<Element, ConcreteType> concreteTypes; |
- ConcreteTypeCartesianProduct(this.inferrer, this.baseTypeOfThis, |
+ ConcreteTypeCartesianProduct(this.inferrer, this.typeOfThis, |
this.concreteTypes); |
Iterator get iterator => concreteTypes.isEmpty |
- ? [new ConcreteTypesEnvironment(inferrer, baseTypeOfThis)].iterator |
- : new ConcreteTypeCartesianProductIterator(inferrer, baseTypeOfThis, |
- concreteTypes); |
+ ? [new ConcreteTypesEnvironment(inferrer, new ClassBaseType(typeOfThis))] |
+ .iterator |
+ : new ConcreteTypeCartesianProductIterator(inferrer, |
+ new ClassBaseType(typeOfThis), concreteTypes); |
String toString() { |
List<ConcreteTypesEnvironment> cartesianProduct = |
new List<ConcreteTypesEnvironment>.from(this); |
@@ -647,7 +649,7 @@ class ConcreteTypesInferrer { |
* of [receiverType]. |
*/ |
ConcreteType getSendReturnType(FunctionElement function, |
- BaseType receiverType, |
+ ClassElement receiverType, |
ArgumentsTypes argumentsTypes) { |
ConcreteType result = emptyConcreteType; |
Map<Element, ConcreteType> argumentMap = |
@@ -656,6 +658,7 @@ class ConcreteTypesInferrer { |
if (argumentMap == null) { |
return emptyConcreteType; |
} |
+ |
argumentMap.forEach(augmentParameterType); |
ConcreteTypeCartesianProduct product = |
new ConcreteTypeCartesianProduct(this, receiverType, argumentMap); |
@@ -815,7 +818,7 @@ class ConcreteTypesInferrer { |
new Selector.callDefaultConstructor(enclosingClass.getLibrary())); |
final superClassConcreteType = singletonConcreteType( |
new ClassBaseType(enclosingClass)); |
- getSendReturnType(target, new ClassBaseType(enclosingClass), |
+ getSendReturnType(target, enclosingClass, |
new ArgumentsTypes(new List(), new Map())); |
} |
} |
@@ -1051,8 +1054,7 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
// exceptions for instance, we need to do it by uncommenting the following |
// line. |
// inferrer.addCaller(setter, currentMethod); |
- BaseType baseReceiverType = new ClassBaseType(receiver.enclosingElement); |
- inferrer.getSendReturnType(setter, baseReceiverType, |
+ inferrer.getSendReturnType(setter, receiver.enclosingElement, |
new ArgumentsTypes([argumentType], new Map())); |
} |
return argumentType; |
@@ -1062,7 +1064,7 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
SourceString name) { |
ConcreteType receiverType = analyze(receiver); |
- void augmentField(BaseType baseReceiverType, Element member) { |
+ void augmentField(ClassElement receiverType, Element member) { |
if (member.isField()) { |
inferrer.augmentFieldType(member, argumentType); |
} else if (member.isAbstractField()){ |
@@ -1074,7 +1076,7 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
// exceptions for instance, we need to do it by uncommenting the |
// following line. |
// inferrer.addCaller(setter, currentMethod); |
- inferrer.getSendReturnType(setter, baseReceiverType, |
+ inferrer.getSendReturnType(setter, receiverType, |
new ArgumentsTypes([argumentType], new Map())); |
} |
// since this is a sendSet we ignore non-fields |
@@ -1083,9 +1085,8 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
if (receiverType.isUnkown()) { |
for (Element member in inferrer.getMembersByName(name)) { |
if (!(member.isField() || member.isAbstractField())) continue; |
- Element classElem = member.getEnclosingClass(); |
- BaseType baseReceiverType = new ClassBaseType(classElem); |
- augmentField(baseReceiverType, member); |
+ Element cls = member.getEnclosingClass(); |
+ augmentField(cls, member); |
} |
} else { |
for (BaseType baseReceiverType in receiverType.baseTypes) { |
@@ -1093,7 +1094,7 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
ClassBaseType baseReceiverClassType = baseReceiverType; |
Element member = baseReceiverClassType.element.lookupMember(name); |
if (member != null) { |
- augmentField(baseReceiverClassType, member); |
+ augmentField(baseReceiverClassType.element, member); |
} |
} |
} |
@@ -1197,8 +1198,8 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
Element constructor = elements[node.send]; |
inferrer.addCaller(constructor, currentMethod); |
ClassElement cls = constructor.enclosingElement; |
- return inferrer.getSendReturnType(constructor, |
- new ClassBaseType(cls), analyzeArguments(node.send.arguments)); |
+ return inferrer.getSendReturnType(constructor, cls, |
+ analyzeArguments(node.send.arguments)); |
} |
ConcreteType visitLiteralList(LiteralList node) { |
@@ -1366,11 +1367,11 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
return inferrer.getFieldType(field); |
} |
- ConcreteType analyzeGetterSend(BaseType baseReceiverType, |
+ ConcreteType analyzeGetterSend(ClassElement receiverType, |
FunctionElement getter) { |
inferrer.addCaller(getter, currentMethod); |
return inferrer.getSendReturnType(getter, |
- baseReceiverType, |
+ receiverType, |
new ArgumentsTypes([], new Map())); |
} |
@@ -1388,9 +1389,8 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
return analyzeFieldRead(element); |
} else { |
assert(element.isGetter()); |
- ClassBaseType baseReceiverType = |
- new ClassBaseType(element.enclosingElement); |
- return analyzeGetterSend(baseReceiverType, element); |
+ ClassElement receiverType = element.enclosingElement; |
+ return analyzeGetterSend(receiverType, element); |
} |
} |
} else { |
@@ -1398,7 +1398,7 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
assert(node.receiver != null); |
ConcreteType result = inferrer.emptyConcreteType; |
- void augmentResult(BaseType baseReceiverType, Element member) { |
+ void augmentResult(ClassElement baseReceiverType, Element member) { |
if (member.isField()) { |
result = inferrer.union(result, analyzeFieldRead(member)); |
} else if (member.isAbstractField()){ |
@@ -1417,18 +1417,18 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
inferrer.getMembersByName(node.selector.asIdentifier().source); |
for (Element member in members) { |
if (!(member.isField() || member.isAbstractField())) continue; |
- Element classElement = member.getEnclosingClass(); |
- ClassBaseType baseReceiverType = new ClassBaseType(classElement); |
- augmentResult(baseReceiverType, member); |
+ Element cls = member.getEnclosingClass(); |
+ augmentResult(cls, member); |
} |
} else { |
for (BaseType baseReceiverType in receiverType.baseTypes) { |
if (!baseReceiverType.isNull()) { |
ClassBaseType classBaseType = baseReceiverType; |
- Element getterOrField = classBaseType.element |
- .lookupMember(node.selector.asIdentifier().source); |
+ ClassElement cls = classBaseType.element; |
+ Element getterOrField = |
+ cls.lookupMember(node.selector.asIdentifier().source); |
if (getterOrField != null) { |
- augmentResult(baseReceiverType, getterOrField); |
+ augmentResult(cls, getterOrField); |
} |
} |
} |
@@ -1455,26 +1455,23 @@ class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> { |
if (!element.isFunction()) continue; |
FunctionElement method = element; |
inferrer.addCaller(method, currentMethod); |
- Element classElem = method.enclosingElement; |
- ClassBaseType baseReceiverType = new ClassBaseType(classElem); |
+ Element cls = method.enclosingElement; |
result = inferrer.union( |
result, |
- inferrer.getSendReturnType(method,baseReceiverType, |
- argumentsTypes)); |
+ inferrer.getSendReturnType(method, cls, argumentsTypes)); |
} |
} else { |
for (BaseType baseReceiverType in receiverType.baseTypes) { |
if (!baseReceiverType.isNull()) { |
ClassBaseType classBaseReceiverType = baseReceiverType; |
- FunctionElement method = classBaseReceiverType.element.lookupMember( |
- canonicalizedMethodName); |
+ ClassElement cls = classBaseReceiverType.element; |
+ FunctionElement method = cls.lookupMember(canonicalizedMethodName); |
if (method != null) { |
inferrer.addCaller(method, currentMethod); |
result = inferrer.union( |
result, |
- inferrer.getSendReturnType(method, baseReceiverType, |
- argumentsTypes)); |
+ inferrer.getSendReturnType(method, cls, argumentsTypes)); |
} |
} |
} |