Index: sdk/lib/internal/iterable.dart |
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart |
index 4ad6d14e3669120d89cb2081808f2a93153f0e8a..6149cb9f265fe1546fde7a8dadac023a00608526 100644 |
--- a/sdk/lib/internal/iterable.dart |
+++ b/sdk/lib/internal/iterable.dart |
@@ -46,18 +46,18 @@ abstract class ListIterable<E> extends IterableBase<E> |
bool get isEmpty => length == 0; |
E get first { |
- if (length == 0) throw new StateError("No elements"); |
+ if (length == 0) throw IterableElementError.noElement(); |
return elementAt(0); |
} |
E get last { |
- if (length == 0) throw new StateError("No elements"); |
+ if (length == 0) throw IterableElementError.noElement(); |
return elementAt(length - 1); |
} |
E get single { |
- if (length == 0) throw new StateError("No elements"); |
- if (length > 1) throw new StateError("Too many elements"); |
+ if (length == 0) throw IterableElementError.noElement(); |
+ if (length > 1) throw IterableElementError.tooMany(); |
return elementAt(0); |
} |
@@ -104,7 +104,7 @@ abstract class ListIterable<E> extends IterableBase<E> |
} |
} |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
dynamic lastWhere(bool test(E element), { Object orElse() }) { |
@@ -117,7 +117,7 @@ abstract class ListIterable<E> extends IterableBase<E> |
} |
} |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
E singleWhere(bool test(E element)) { |
@@ -128,7 +128,7 @@ abstract class ListIterable<E> extends IterableBase<E> |
E element = elementAt(i); |
if (test(element)) { |
if (matchFound) { |
- throw new StateError("More than one matching element"); |
+ throw IterableElementError.tooMany(); |
} |
matchFound = true; |
match = element; |
@@ -138,7 +138,7 @@ abstract class ListIterable<E> extends IterableBase<E> |
} |
} |
if (matchFound) return match; |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
String join([String separator = ""]) { |
@@ -175,7 +175,7 @@ abstract class ListIterable<E> extends IterableBase<E> |
Iterable map(f(E element)) => new MappedListIterable(this, f); |
E reduce(E combine(var value, E element)) { |
- if (length == 0) throw new StateError("No elements"); |
+ if (length == 0) throw IterableElementError.noElement(); |
E value = elementAt(0); |
for (int i = 1; i < length; i++) { |
value = combine(value, elementAt(i)); |
@@ -661,11 +661,11 @@ class EmptyIterable<E> extends IterableBase<E> implements EfficientLength { |
int get length => 0; |
- E get first { throw new StateError("No elements"); } |
+ E get first { throw IterableElementError.noElement(); } |
- E get last { throw new StateError("No elements"); } |
+ E get last { throw IterableElementError.noElement(); } |
- E get single { throw new StateError("No elements"); } |
+ E get single { throw IterableElementError.noElement(); } |
E elementAt(int index) { throw new RangeError.value(index); } |
@@ -677,17 +677,17 @@ class EmptyIterable<E> extends IterableBase<E> implements EfficientLength { |
E firstWhere(bool test(E element), { E orElse() }) { |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
E lastWhere(bool test(E element), { E orElse() }) { |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
E singleWhere(bool test(E element), { E orElse() }) { |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
String join([String separator = ""]) => ""; |
@@ -697,7 +697,7 @@ class EmptyIterable<E> extends IterableBase<E> implements EfficientLength { |
Iterable map(f(E element)) => const EmptyIterable(); |
E reduce(E combine(E value, E element)) { |
- throw new StateError("No elements"); |
+ throw IterableElementError.noElement(); |
} |
fold(var initialValue, combine(var previousValue, E element)) { |
@@ -774,7 +774,7 @@ class IterableMixinWorkaround { |
static dynamic reduce(Iterable iterable, |
dynamic combine(previousValue, element)) { |
Iterator iterator = iterable.iterator; |
- if (!iterator.moveNext()) throw new StateError("No elements"); |
+ if (!iterator.moveNext()) throw IterableElementError.noElement(); |
var value = iterator.current; |
while (iterator.moveNext()) { |
value = combine(value, iterator.current); |
@@ -824,7 +824,7 @@ class IterableMixinWorkaround { |
static dynamic first(Iterable iterable) { |
Iterator it = iterable.iterator; |
if (!it.moveNext()) { |
- throw new StateError("No elements"); |
+ throw IterableElementError.noElement(); |
} |
return it.current; |
} |
@@ -832,7 +832,7 @@ class IterableMixinWorkaround { |
static dynamic last(Iterable iterable) { |
Iterator it = iterable.iterator; |
if (!it.moveNext()) { |
- throw new StateError("No elements"); |
+ throw IterableElementError.noElement(); |
} |
dynamic result; |
do { |
@@ -843,9 +843,9 @@ class IterableMixinWorkaround { |
static dynamic single(Iterable iterable) { |
Iterator it = iterable.iterator; |
- if (!it.moveNext()) throw new StateError("No elements"); |
+ if (!it.moveNext()) throw IterableElementError.noElement(); |
dynamic result = it.current; |
- if (it.moveNext()) throw new StateError("More than one element"); |
+ if (it.moveNext()) throw IterableElementError.tooMany(); |
return result; |
} |
@@ -856,7 +856,7 @@ class IterableMixinWorkaround { |
if (test(element)) return element; |
} |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
static dynamic lastWhere(Iterable iterable, |
@@ -872,7 +872,7 @@ class IterableMixinWorkaround { |
} |
if (foundMatching) return result; |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
static dynamic lastWhereList(List list, |
@@ -884,7 +884,7 @@ class IterableMixinWorkaround { |
if (test(element)) return element; |
} |
if (orElse != null) return orElse(); |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
static dynamic singleWhere(Iterable iterable, bool test(dynamic value)) { |
@@ -893,14 +893,14 @@ class IterableMixinWorkaround { |
for (dynamic element in iterable) { |
if (test(element)) { |
if (foundMatching) { |
- throw new StateError("More than one matching element"); |
+ throw IterableElementError.tooMany(); |
} |
result = element; |
foundMatching = true; |
} |
} |
if (foundMatching) return result; |
- throw new StateError("No matching element"); |
+ throw IterableElementError.noElement(); |
} |
static dynamic elementAt(Iterable iterable, int index) { |
@@ -1058,7 +1058,7 @@ class IterableMixinWorkaround { |
otherStart = 0; |
} |
if (otherStart + length > otherList.length) { |
- throw new StateError("Not enough elements"); |
+ throw IterableElementError.tooFew(); |
} |
Lists.copy(otherList, otherStart, list, start, length); |
} |
@@ -1165,3 +1165,15 @@ class IterableMixinWorkaround { |
return result; |
} |
} |
+ |
+/** |
+ * Creates errors throw by [Iterable] when the element count is wrong. |
+ */ |
+abstract class IterableElementError { |
+ /** Error thrown thrown by, e.g., [Iterable.first] when there is no result. */ |
+ static StateError noElement() => new StateError("No element"); |
+ /** Error thrown by, e.g., [Iterable.single] if there are too many results. */ |
+ static StateError tooMany() => new StateError("Too many elements"); |
+ /** Error thrown by, e.g., [List.setRange] if there are too few elements. */ |
+ static StateError tooFew() => new StateError("Too few elements"); |
+} |