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 e33d173ccb97ded0c4851088818920af0d53d7ba..eb5f364188e21a6cd654cc8ea8a9bbfde5b78dc4 100644 |
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart |
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart |
@@ -171,7 +171,9 @@ class UnionType implements ConcreteType { |
ClassElement getUniqueType() { |
if (baseTypes.length == 1) { |
- BaseType uniqueBaseType = baseTypes.iterator().next(); |
+ var iterator = baseTypes.iterator; |
+ iterator.moveNext(); |
+ BaseType uniqueBaseType = iterator.current; |
if (uniqueBaseType.isClass()) { |
ClassBaseType uniqueClassType = uniqueBaseType; |
return uniqueClassType.element; |
@@ -190,14 +192,14 @@ class UnionType implements ConcreteType { |
* [: (A, D) :], [: (B, C) :] and finally [: (B, D) :]. |
*/ |
class ConcreteTypeCartesianProduct |
- implements Iterable<ConcreteTypesEnvironment> { |
+ extends Iterable<ConcreteTypesEnvironment> { |
final ConcreteTypesInferrer inferrer; |
final BaseType baseTypeOfThis; |
final Map<Element, ConcreteType> concreteTypes; |
ConcreteTypeCartesianProduct(this.inferrer, this.baseTypeOfThis, |
this.concreteTypes); |
- Iterator iterator() => concreteTypes.isEmpty |
- ? [new ConcreteTypesEnvironment(inferrer, baseTypeOfThis)].iterator() |
+ Iterator get iterator => concreteTypes.isEmpty |
+ ? [new ConcreteTypesEnvironment(inferrer, baseTypeOfThis)].iterator |
: new ConcreteTypeCartesianProductIterator(inferrer, baseTypeOfThis, |
concreteTypes); |
String toString() { |
@@ -210,7 +212,8 @@ class ConcreteTypeCartesianProduct |
/** |
* An helper class for [ConcreteTypeCartesianProduct]. |
*/ |
-class ConcreteTypeCartesianProductIterator implements Iterator { |
+class ConcreteTypeCartesianProductIterator |
+ implements Iterator<ConcreteTypesEnvironment> { |
final ConcreteTypesInferrer inferrer; |
final BaseType baseTypeOfThis; |
final Map<Element, ConcreteType> concreteTypes; |
@@ -218,6 +221,7 @@ class ConcreteTypeCartesianProductIterator implements Iterator { |
final Map<Element, Iterator> state; |
int size = 1; |
int counter = 0; |
+ ConcreteTypesEnvironment _current; |
ConcreteTypeCartesianProductIterator(this.inferrer, this.baseTypeOfThis, |
Map<Element, ConcreteType> concreteTypes) |
@@ -234,9 +238,7 @@ class ConcreteTypeCartesianProductIterator implements Iterator { |
} |
} |
- bool get hasNext { |
- return counter < size; |
- } |
+ ConcreteTypesEnvironment get current => _current; |
ConcreteTypesEnvironment takeSnapshot() { |
Map<Element, ConcreteType> result = new Map<Element, ConcreteType>(); |
@@ -246,21 +248,26 @@ class ConcreteTypeCartesianProductIterator implements Iterator { |
return new ConcreteTypesEnvironment.of(inferrer, result, baseTypeOfThis); |
} |
- ConcreteTypesEnvironment next() { |
- if (!hasNext) throw new StateError("No more elements"); |
+ bool moveNext() { |
+ if (counter >= size) { |
+ _current = null; |
+ return false; |
+ } |
Element keyToIncrement = null; |
for (final key in concreteTypes.keys) { |
final iterator = state[key]; |
- if (iterator != null && iterator.hasNext) { |
- nextValues[key] = state[key].next(); |
+ if (iterator != null && iterator.moveNext()) { |
+ nextValues[key] = state[key].current; |
break; |
} |
- Iterator newIterator = concreteTypes[key].baseTypes.iterator(); |
+ Iterator newIterator = concreteTypes[key].baseTypes.iterator; |
state[key] = newIterator; |
- nextValues[key] = newIterator.next(); |
+ newIterator.moveNext(); |
+ nextValues[key] = newIterator.current; |
} |
counter++; |
- return takeSnapshot(); |
+ _current = takeSnapshot(); |
+ return true; |
} |
} |
@@ -676,8 +683,8 @@ class ConcreteTypesInferrer { |
if (argumentsTypes.positional.length < signature.requiredParameterCount) { |
return null; |
} |
- final Iterator<ConcreteType> remainingPositionalArguments = |
- argumentsTypes.positional.iterator(); |
+ final HasNextIterator<ConcreteType> remainingPositionalArguments = |
+ new HasNextIterator<ConcreteType>(argumentsTypes.positional.iterator); |
// we attach each positional parameter to its corresponding positional |
// argument |
for (Link<Element> requiredParameters = signature.requiredParameters; |