Dart 2 fixes (#113)

Fixes https://github.com/google/file.dart/issues/88
diff --git a/packages/file/CHANGELOG.md b/packages/file/CHANGELOG.md
index 0537523..b6749b7 100644
--- a/packages/file/CHANGELOG.md
+++ b/packages/file/CHANGELOG.md
@@ -1,3 +1,7 @@
+#### 5.0.5
+
+* Dart 2 fixes
+
 #### 5.0.4
 
 * Update SDK constraint to 2.0.0-dev.67.0, remove workaround in
diff --git a/packages/file/lib/src/backends/record_replay/codecs.dart b/packages/file/lib/src/backends/record_replay/codecs.dart
index 651be60..67236e7 100644
--- a/packages/file/lib/src/backends/record_replay/codecs.dart
+++ b/packages/file/lib/src/backends/record_replay/codecs.dart
@@ -549,6 +549,17 @@
   List<T> convert(List<S> input) => input.map(_delegate.convert).toList();
 }
 
+/// Converts a `List<S>` into a `List<T>` by casting it to the appropriate
+/// type. The list must contain only elements of type `T`, or a runtime error
+/// will be thrown.
+class CastList<S, T> extends Converter<List<S>, List<T>> {
+  /// Creates a new [CastList].
+  const CastList();
+
+  @override
+  List<T> convert(List<S> input) => input.cast<T>();
+}
+
 /// Converts a [List] of elements into a [Stream] of the same elements.
 class ToStream<T> extends Converter<List<T>, Stream<T>> {
   /// Creates a new [ToStream].
diff --git a/packages/file/lib/src/backends/record_replay/replay_directory.dart b/packages/file/lib/src/backends/record_replay/replay_directory.dart
index d444e8a..74473f5 100644
--- a/packages/file/lib/src/backends/record_replay/replay_directory.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_directory.dart
@@ -23,9 +23,12 @@
         reviveDirectory.fuse(const ToFuture<Directory>());
     Converter<String, FileSystemEntity> reviveEntity =
         new ReviveFileSystemEntity(fileSystem);
-    Converter<List<String>, List<FileSystemEntity>> reviveEntities =
-        new ConvertElements<String, FileSystemEntity>(reviveEntity);
-    Converter<List<String>, Stream<FileSystemEntity>> reviveEntitiesAsStream =
+    Converter<List<dynamic>, List<String>> dynamicToString =
+        const CastList<dynamic, String>();
+    Converter<List<dynamic>, List<FileSystemEntity>> reviveEntities =
+        dynamicToString.fuse<List<FileSystemEntity>>(
+            new ConvertElements<String, FileSystemEntity>(reviveEntity));
+    Converter<List<dynamic>, Stream<FileSystemEntity>> reviveEntitiesAsStream =
         reviveEntities
             .fuse<Stream<FileSystemEntity>>(const ToStream<FileSystemEntity>());
 
diff --git a/packages/file/pubspec.yaml b/packages/file/pubspec.yaml
index 2082c4d..3a9de9d 100644
--- a/packages/file/pubspec.yaml
+++ b/packages/file/pubspec.yaml
@@ -1,5 +1,5 @@
 name: file
-version: 5.0.4
+version: 5.0.5
 authors:
 - Matan Lurey <matanl@google.com>
 - Yegor Jbanov <yjbanov@google.com>
diff --git a/packages/file/test/recording_test.dart b/packages/file/test/recording_test.dart
index d485cfa..03286fe 100644
--- a/packages/file/test/recording_test.dart
+++ b/packages/file/test/recording_test.dart
@@ -545,7 +545,7 @@
               recording.events,
               contains(invokesMethod('create')
                   .on(isDirectory)
-                  .withNoNamedArguments()
+                  .withNamedArgument('recursive', false)
                   .withResult(isDirectory)));
         });
 
@@ -555,7 +555,7 @@
               recording.events,
               contains(invokesMethod('createSync')
                   .on(isDirectory)
-                  .withNoNamedArguments()
+                  .withNamedArgument('recursive', false)
                   .withResult(isNull)));
         });
 
@@ -569,7 +569,8 @@
             recording.events,
             contains(invokesMethod('list')
                 .on(isDirectory)
-                .withNoNamedArguments()
+                .withNamedArgument('recursive', false)
+                .withNamedArgument('followLinks', true)
                 .withResult(hasLength(3))),
           );
         });
@@ -612,7 +613,7 @@
               recording.events,
               contains(invokesMethod('openRead')
                   .on(isFile)
-                  .withPositionalArguments(isEmpty)
+                  .withPositionalArguments([null, null])
                   .withNoNamedArguments()
                   .withResult(isList)));
           await recording.flush();
@@ -624,7 +625,7 @@
                 containsPair('type', 'invoke'),
                 containsPair('method', 'openRead'),
                 containsPair('object', matches(r'^RecordingFile@[0-9]+$')),
-                containsPair('positionalArguments', isEmpty),
+                containsPair('positionalArguments', [null, null]),
                 containsPair('namedArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
               ));
@@ -769,7 +770,7 @@
               recording.events,
               contains(invokesMethod('readAsLines')
                   .on(isFile)
-                  .withNoNamedArguments()
+                  .withNamedArgument('encoding', utf8)
                   .withResult(<String>['Hello', 'World'])));
           await recording.flush();
           List<Map<String, dynamic>> manifest = _loadManifest(recording);
@@ -782,7 +783,7 @@
                 containsPair('object', matches(r'^RecordingFile@[0-9]+$')),
                 containsPair('positionalArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
-                containsPair('namedArguments', isEmpty),
+                containsPair('namedArguments', {'encoding': 'utf-8'}),
               ));
           File file = _getRecordingFile(recording, manifest[1]['result']);
           expect(file, exists);
@@ -797,7 +798,7 @@
               recording.events,
               contains(invokesMethod('readAsLinesSync')
                   .on(isFile)
-                  .withNoNamedArguments()
+                  .withNamedArgument('encoding', utf8)
                   .withResult(<String>['Hello', 'World'])));
           await recording.flush();
           List<Map<String, dynamic>> manifest = _loadManifest(recording);
@@ -810,7 +811,7 @@
                 containsPair('object', matches(r'^RecordingFile@[0-9]+$')),
                 containsPair('positionalArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
-                containsPair('namedArguments', isEmpty),
+                containsPair('namedArguments', {'encoding': 'utf-8'}),
               ));
           File file = _getRecordingFile(recording, manifest[1]['result']);
           expect(file, exists);