Add methods where needed for Dart 2.0 core lib changes. (#65)

Add methods where needed for Dart 2.0 core lib changes.

Right now, all of the implementations throw (except in trivial cases, like the
EmptyUnmodifiable* classes). They can be updated, typically to call `super` or
reference a wrapped object, once the new methods have been released as part of a
Dart 2.0 release, and this pubspec.yaml updates to guarantee that those
implementations exist.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8ece77f..519256a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 1.14.4
+
+* Add implementation stubs of upcoming Dart 2.0 core library methods, namely
+  new methods for classes that implement Iterable, List, Map, Queue, and Set.
+
+## 1.14.3
+
+* Fix MapKeySet.lookup to be a valid override in strong mode.
+
+## 1.14.2
+
+* Add type arguments to SyntheticInvocation.
+
 ## 1.14.1
 
 * Make `Equality` implementations accept `null` as argument to `hash`.
diff --git a/lib/src/canonicalized_map.dart b/lib/src/canonicalized_map.dart
index a8af43a..122bb35 100644
--- a/lib/src/canonicalized_map.dart
+++ b/lib/src/canonicalized_map.dart
@@ -69,6 +69,18 @@
     other.forEach((key, value) => this[key] = value);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('addEntries');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _base.clear();
   }
@@ -81,6 +93,13 @@
   bool containsValue(Object value) =>
       _base.values.any((pair) => pair.last == value);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('entries');
+  }
+
   void forEach(void f(K key, V value)) {
     _base.forEach((key, pair) => f(pair.first, pair.last));
   }
@@ -93,6 +112,13 @@
 
   int get length => _base.length;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('map');
+  }
+
   V putIfAbsent(K key, V ifAbsent()) {
     return _base
         .putIfAbsent(_canonicalize(key), () => new Pair(key, ifAbsent()))
@@ -105,6 +131,26 @@
     return pair == null ? null : pair.last;
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError('removeWhere');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError('retype');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError('update');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError('updateAll');
+  }
+
   Iterable<V> get values => _base.values.map((pair) => pair.last);
 
   String toString() => Maps.mapToString(this);
diff --git a/lib/src/empty_unmodifiable_set.dart b/lib/src/empty_unmodifiable_set.dart
index ea00959..b3d29ec 100644
--- a/lib/src/empty_unmodifiable_set.dart
+++ b/lib/src/empty_unmodifiable_set.dart
@@ -20,9 +20,14 @@
 
   const EmptyUnmodifiableSet();
 
+  EmptyUnmodifiableSet<T> cast<T>() => const EmptyUnmodifiableSet<T>();
   bool contains(Object element) => false;
   bool containsAll(Iterable<Object> other) => other.isEmpty;
+  Iterable<E> followedBy(Iterable<E> other) => new Set.from(other);
   E lookup(Object element) => null;
+  EmptyUnmodifiableSet<T> retype<T>() => const EmptyUnmodifiableSet<T>();
+  E singleWhere(bool test(E element), {E orElse()}) => super.singleWhere(test);
+  Iterable<T> whereType<T>() => const EmptyUnmodifiableSet<T>();
   Set<E> toSet() => new Set();
   Set<E> union(Set<E> other) => new Set.from(other);
   Set<E> intersection(Set<Object> other) => new Set();
diff --git a/lib/src/queue_list.dart b/lib/src/queue_list.dart
index 7f10261..224ac86 100644
--- a/lib/src/queue_list.dart
+++ b/lib/src/queue_list.dart
@@ -80,6 +80,16 @@
     }
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  QueueList<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  QueueList<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   String toString() => IterableBase.iterableToFullString(this, "{", "}");
 
   // Queue interface.
diff --git a/lib/src/typed_wrappers.dart b/lib/src/typed_wrappers.dart
index 118a614..cef2a58 100644
--- a/lib/src/typed_wrappers.dart
+++ b/lib/src/typed_wrappers.dart
@@ -21,6 +21,11 @@
 
   bool any(bool test(E element)) => _base.any(_validate(test));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) => _base.contains(element);
 
   E elementAt(int index) => _base.elementAt(index) as E;
@@ -38,6 +43,11 @@
       _base.fold(initialValue,
           (previousValue, element) => combine(previousValue, element as E));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<E> followedBy(Iterable<E> other) {
+    throw new UnimplementedError('followedBy');
+  }
+
   void forEach(void f(E element)) => _base.forEach(_validate(f));
 
   bool get isEmpty => _base.isEmpty;
@@ -60,10 +70,17 @@
   E reduce(E combine(E value, E element)) =>
       _base.reduce((value, element) => combine(value as E, element as E)) as E;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E get single => _base.single as E;
 
-  E singleWhere(bool test(E element)) =>
-      _base.singleWhere(_validate(test)) as E;
+  E singleWhere(bool test(E element), {E orElse()}) {
+    if (orElse != null) throw new UnimplementedError('singleWhere:orElse');
+    return _base.singleWhere(_validate(test)) as E;
+  }
 
   Iterable<E> skip(int n) => new TypeSafeIterable<E>(_base.skip(n));
 
@@ -83,6 +100,11 @@
   Iterable<E> where(bool test(E element)) =>
       new TypeSafeIterable<E>(_base.where(_validate(test)));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> whereType<T>() {
+    throw new UnimplementedError('whereType');
+  }
+
   String toString() => _base.toString();
 
   /// Returns a version of [function] that asserts that its argument is an
@@ -116,6 +138,11 @@
     _listBase[index] = value;
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<E> operator +(List<E> other) {
+    throw new UnimplementedError('+');
+  }
+
   void add(E value) {
     _listBase.add(value);
   }
@@ -126,6 +153,11 @@
 
   Map<int, E> asMap() => new TypeSafeMap<int, E>(_listBase.asMap());
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _listBase.clear();
   }
@@ -134,11 +166,22 @@
     _listBase.fillRange(start, end, fillValue);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set first(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[0] = value;
+  }
+
   Iterable<E> getRange(int start, int end) =>
       new TypeSafeIterable<E>(_listBase.getRange(start, end));
 
   int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int indexWhere(bool test(E element), [int start = 0]) {
+    throw new UnimplementedError('indexWhere');
+  }
+
   void insert(int index, E element) {
     _listBase.insert(index, element);
   }
@@ -147,9 +190,20 @@
     _listBase.insertAll(index, iterable);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set last(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[this.length - 1] = value;
+  }
+
   int lastIndexOf(E element, [int start]) =>
       _listBase.lastIndexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int lastIndexWhere(bool test(E element), [int start]) {
+    throw new UnimplementedError('lastIndexWhere');
+  }
+
   set length(int newLength) {
     _listBase.length = newLength;
   }
@@ -176,6 +230,11 @@
     _listBase.retainWhere(_validate(test));
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<E> get reversed => new TypeSafeIterable<E>(_listBase.reversed);
 
   void setAll(int index, Iterable<E> iterable) {
@@ -217,6 +276,11 @@
     _setBase.addAll(elements);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _setBase.clear();
   }
@@ -249,6 +313,11 @@
     _setBase.retainWhere(_validate(test));
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   Set<E> union(Set<E> other) => new TypeSafeSet<E>(_setBase.union(other));
 }
 
@@ -278,6 +347,11 @@
     _baseQueue.addLast(value);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _baseQueue.clear();
   }
@@ -292,6 +366,11 @@
     _baseQueue.retainWhere(_validate(test));
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E removeFirst() => _baseQueue.removeFirst() as E;
 
   E removeLast() => _baseQueue.removeLast() as E;
@@ -316,6 +395,18 @@
     _base.addAll(other);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('addEntries');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _base.clear();
   }
@@ -324,6 +415,13 @@
 
   bool containsValue(Object value) => _base.containsValue(value);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('entries');
+  }
+
   void forEach(void f(K key, V value)) {
     _base.forEach((key, value) => f(key as K, value as V));
   }
@@ -336,11 +434,38 @@
 
   int get length => _base.length;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('map');
+  }
+
   V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent) as V;
 
   V remove(Object key) => _base.remove(key) as V;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError('removeWhere');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<V> get values => new TypeSafeIterable<V>(_base.values);
 
   String toString() => _base.toString();
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError('update');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError('updateAll');
+  }
 }
diff --git a/lib/src/unmodifiable_wrappers.dart b/lib/src/unmodifiable_wrappers.dart
index 070ab78..b0b5440 100644
--- a/lib/src/unmodifiable_wrappers.dart
+++ b/lib/src/unmodifiable_wrappers.dart
@@ -168,4 +168,12 @@
   /// Throws an [UnsupportedError];
   /// operations that change the map are disallowed.
   void clear() => _throw();
+
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
+  set first(_) => _throw();
+
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
+  set last(_) => _throw();
 }
diff --git a/lib/src/wrappers.dart b/lib/src/wrappers.dart
index c3f6438..1abfd45 100644
--- a/lib/src/wrappers.dart
+++ b/lib/src/wrappers.dart
@@ -21,6 +21,11 @@
 
   bool any(bool test(E element)) => _base.any(test);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) => _base.contains(element);
 
   E elementAt(int index) => _base.elementAt(index);
@@ -37,6 +42,11 @@
   T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
       _base.fold(initialValue, combine);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<E> followedBy(Iterable<E> other) {
+    throw new UnimplementedError('followedBy');
+  }
+
   void forEach(void f(E element)) => _base.forEach(f);
 
   bool get isEmpty => _base.isEmpty;
@@ -58,9 +68,17 @@
 
   E reduce(E combine(E value, E element)) => _base.reduce(combine);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E get single => _base.single;
 
-  E singleWhere(bool test(E element)) => _base.singleWhere(test);
+  E singleWhere(bool test(E element), {E orElse()}) {
+    if (orElse != null) throw new UnimplementedError('singleWhere:orElse');
+    return _base.singleWhere(test);
+  }
 
   Iterable<E> skip(int n) => _base.skip(n);
 
@@ -76,6 +94,11 @@
 
   Iterable<E> where(bool test(E element)) => _base.where(test);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> whereType<T>() {
+    throw new UnimplementedError("whereType");
+  }
+
   String toString() => _base.toString();
 }
 
@@ -133,6 +156,11 @@
     _listBase[index] = value;
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<E> operator +(List<E> other) {
+    throw new UnimplementedError('+');
+  }
+
   void add(E value) {
     _listBase.add(value);
   }
@@ -143,6 +171,11 @@
 
   Map<int, E> asMap() => _listBase.asMap();
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _listBase.clear();
   }
@@ -151,10 +184,21 @@
     _listBase.fillRange(start, end, fillValue);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set first(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[0] = value;
+  }
+
   Iterable<E> getRange(int start, int end) => _listBase.getRange(start, end);
 
   int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int indexWhere(bool test(E element), [int start = 0]) {
+    throw new UnimplementedError('indexWhere');
+  }
+
   void insert(int index, E element) {
     _listBase.insert(index, element);
   }
@@ -163,9 +207,20 @@
     _listBase.insertAll(index, iterable);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set last(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[this.length - 1] = value;
+  }
+
   int lastIndexOf(E element, [int start]) =>
       _listBase.lastIndexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int lastIndexWhere(bool test(E element), [int start]) {
+    throw new UnimplementedError('lastIndexWhere');
+  }
+
   set length(int newLength) {
     _listBase.length = newLength;
   }
@@ -192,6 +247,11 @@
     _listBase.retainWhere(test);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<E> get reversed => _listBase.reversed;
 
   void setAll(int index, Iterable<E> iterable) {
@@ -242,6 +302,11 @@
     _setBase.addAll(elements);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _setBase.clear();
   }
@@ -268,6 +333,11 @@
     _setBase.retainAll(elements);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   void retainWhere(bool test(E element)) {
     _setBase.retainWhere(test);
   }
@@ -317,6 +387,11 @@
     _baseQueue.addLast(value);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _baseQueue.clear();
   }
@@ -331,6 +406,11 @@
     _baseQueue.retainWhere(test);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E removeFirst() => _baseQueue.removeFirst();
 
   E removeLast() => _baseQueue.removeLast();
@@ -370,14 +450,33 @@
     _base.addAll(other);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('addEntries');
+  }
+
   void clear() {
     _base.clear();
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool containsKey(Object key) => _base.containsKey(key);
 
   bool containsValue(Object value) => _base.containsValue(value);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('entries');
+  }
+
   void forEach(void f(K key, V value)) {
     _base.forEach(f);
   }
@@ -390,13 +489,40 @@
 
   int get length => _base.length;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('map');
+  }
+
   V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent);
 
   V remove(Object key) => _base.remove(key);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError('removeWhere');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<V> get values => _base.values;
 
   String toString() => _base.toString();
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError('update');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError('updateAll');
+  }
 }
 
 /// An unmodifiable [Set] view of the keys of a [Map].
@@ -416,6 +542,11 @@
 
   Iterable<E> get _base => _baseMap.keys;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) => _baseMap.containsKey(element);
 
   bool get isEmpty => _baseMap.isEmpty;
@@ -452,6 +583,11 @@
   E lookup(Object element) =>
       throw new UnsupportedError("MapKeySet doesn't support lookup().");
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   /// Returns a new set which contains all the elements of [this] and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] and all
@@ -498,6 +634,11 @@
 
   Iterable<V> get _base => _baseMap.values;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) {
     if (element != null && element is! V) return false;
     var key = _keyForValue(element as V);
@@ -594,6 +735,11 @@
   void retainWhere(bool test(V element)) =>
       removeWhere((element) => !test(element));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   /// Returns a new set which contains all the elements of [this] and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] and all
diff --git a/pubspec.yaml b/pubspec.yaml
index 9bf346e..b8c47e3 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: collection
-version: 1.14.4-dev
+version: 1.14.4
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: https://www.github.com/dart-lang/collection
diff --git a/test/wrapper_test.dart b/test/wrapper_test.dart
index b19b49b..95e6f36 100644
--- a/test/wrapper_test.dart
+++ b/test/wrapper_test.dart
@@ -87,6 +87,9 @@
 class IterableNSM extends NSM implements Iterable, Set, List, Queue {
   IterableNSM(action(Invocation i)) : super(action);
   toString() => super.noSuchMethod(TO_STRING_INVOCATION) as String;
+
+  Null cast<T>();
+  Null retype<T>();
 }
 
 // Expector that wraps in DelegatingIterable.