[null-safety] remove implicit-dynamic, intl in preparation for null-safety (#160)

- Implicit dynamic is removed, which will make it easier to migrate to null-safety where it is not supported.
- Intl dependency is removed, since this will block null safety despite being used in only a single place.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index da09e33..c6d2ad9 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,5 +1,6 @@
 analyzer:
   strong-mode:
+    implicit-casts: false
     implicit-dynamic: false
   errors:
     # treat missing required parameters as a warning (not a hint)
@@ -8,10 +9,6 @@
     missing_return: warning
     # allow having TODOs in the code
     todo: ignore
-    # Ignore analyzer hints for updating pubspecs when using Future or
-    # Stream and not importing dart:async
-    # Please see https://github.com/flutter/flutter/pull/24528 for details.
-    sdk_version_async_exported_from_core: ignore
 
 linter:
   rules:
diff --git a/packages/file/CHANGELOG.md b/packages/file/CHANGELOG.md
index 22c292c..61d3529 100644
--- a/packages/file/CHANGELOG.md
+++ b/packages/file/CHANGELOG.md
@@ -6,6 +6,8 @@
 * Fixed more test flakiness.
 * Enabled more tests.
 * Internal cleanup.
+* Remove implicit dynamic in preparation for null safety.
+* Remove dependency on Intl
 
 #### 5.2.1
 
diff --git a/packages/file/lib/src/backends/chroot/chroot_directory.dart b/packages/file/lib/src/backends/chroot/chroot_directory.dart
index e2daa90..8fec7b1 100644
--- a/packages/file/lib/src/backends/chroot/chroot_directory.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_directory.dart
@@ -137,7 +137,7 @@
     bool recursive = false,
     bool followLinks = true,
   }) {
-    Directory delegate = this.delegate;
+    Directory delegate = this.delegate as Directory;
     String dirname = delegate.path;
     return delegate
         .list(recursive: recursive, followLinks: followLinks)
@@ -149,7 +149,7 @@
     bool recursive = false,
     bool followLinks = true,
   }) {
-    Directory delegate = this.delegate;
+    Directory delegate = this.delegate as Directory;
     String dirname = delegate.path;
     return delegate
         .listSync(recursive: recursive, followLinks: followLinks)
diff --git a/packages/file/lib/src/backends/chroot/chroot_file.dart b/packages/file/lib/src/backends/chroot/chroot_file.dart
index 9d6c5ef..60bda56 100644
--- a/packages/file/lib/src/backends/chroot/chroot_file.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_file.dart
@@ -252,7 +252,7 @@
 
   @override
   Stream<Uint8List> openRead([int start, int end]) =>
-      getDelegate(followLinks: true).openRead(start, end);
+      getDelegate(followLinks: true).openRead(start, end).cast<Uint8List>();
 
   @override
   IOSink openWrite({
diff --git a/packages/file/lib/src/backends/chroot/chroot_file_system.dart b/packages/file/lib/src/backends/chroot/chroot_file_system.dart
index 0baec9b..5e383bd 100644
--- a/packages/file/lib/src/backends/chroot/chroot_file_system.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_file_system.dart
@@ -112,9 +112,9 @@
       case FileSystemEntityType.directory:
         break;
       case FileSystemEntityType.notFound:
-        throw common.noSuchFileOrDirectory(path);
+        throw common.noSuchFileOrDirectory(path as String);
       default:
-        throw common.notADirectory(path);
+        throw common.notADirectory(path as String);
     }
     assert(() {
       p.Context ctx = delegate.path;
diff --git a/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart b/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
index f16e67f..8e859ac 100644
--- a/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
@@ -52,7 +52,8 @@
 
   @override
   Directory wrapDirectory(io.Directory delegate) =>
-      _ChrootDirectory.wrapped(fileSystem, delegate, relative: !isAbsolute);
+      _ChrootDirectory.wrapped(fileSystem, delegate as Directory,
+          relative: !isAbsolute);
 
   @override
   File wrapFile(io.File delegate) =>
diff --git a/packages/file/lib/src/backends/memory/common.dart b/packages/file/lib/src/backends/memory/common.dart
index 1c8b4fd..d9d8f5c 100644
--- a/packages/file/lib/src/backends/memory/common.dart
+++ b/packages/file/lib/src/backends/memory/common.dart
@@ -10,6 +10,6 @@
 /// Throws a `FileSystemException` if [object] is null.
 void checkExists(Object object, PathGenerator path) {
   if (object == null) {
-    throw common.noSuchFileOrDirectory(path());
+    throw common.noSuchFileOrDirectory(path() as String);
   }
 }
diff --git a/packages/file/lib/src/backends/memory/memory_directory.dart b/packages/file/lib/src/backends/memory/memory_directory.dart
index 4e2bbd3..688e0df 100644
--- a/packages/file/lib/src/backends/memory/memory_directory.dart
+++ b/packages/file/lib/src/backends/memory/memory_directory.dart
@@ -74,7 +74,7 @@
     String fullPath = fileSystem.path.join(path, prefix);
     String dirname = fileSystem.path.dirname(fullPath);
     String basename = fileSystem.path.basename(fullPath);
-    DirectoryNode node = fileSystem.findNode(dirname);
+    DirectoryNode node = fileSystem.findNode(dirname) as DirectoryNode;
     checkExists(node, () => dirname);
     utils.checkIsDir(node, () => dirname);
     int _tempCounter = _systemTempCounter[fileSystem] ?? 0;
@@ -99,14 +99,14 @@
             throw common.directoryNotEmpty(newPath);
           }
         },
-      );
+      ) as Directory;
 
   @override
   Directory get parent =>
       (backingOrNull?.isRoot ?? false) ? this : super.parent;
 
   @override
-  Directory get absolute => super.absolute;
+  Directory get absolute => super.absolute as Directory;
 
   @override
   Stream<FileSystemEntity> list({
@@ -123,7 +123,7 @@
     bool recursive = false,
     bool followLinks = true,
   }) {
-    DirectoryNode node = backing;
+    DirectoryNode node = backing as DirectoryNode;
     List<FileSystemEntity> listing = <FileSystemEntity>[];
     List<_PendingListTask> tasks = <_PendingListTask>[
       _PendingListTask(
@@ -139,7 +139,9 @@
       task.dir.children.forEach((String name, Node child) {
         Set<LinkNode> breadcrumbs = Set<LinkNode>.from(task.breadcrumbs);
         String childPath = fileSystem.path.join(task.path, name);
-        while (followLinks && utils.isLink(child) && breadcrumbs.add(child)) {
+        while (followLinks &&
+            utils.isLink(child) &&
+            breadcrumbs.add(child as LinkNode)) {
           Node referent = (child as LinkNode).referentOrNull;
           if (referent != null) {
             child = referent;
@@ -148,7 +150,8 @@
         if (utils.isDirectory(child)) {
           listing.add(MemoryDirectory(fileSystem, childPath));
           if (recursive) {
-            tasks.add(_PendingListTask(child, childPath, breadcrumbs));
+            tasks.add(_PendingListTask(
+                child as DirectoryNode, childPath, breadcrumbs));
           }
         } else if (utils.isLink(child)) {
           listing.add(MemoryLink(fileSystem, childPath));
diff --git a/packages/file/lib/src/backends/memory/memory_file.dart b/packages/file/lib/src/backends/memory/memory_file.dart
index bda9ae9..3d7b8b3 100644
--- a/packages/file/lib/src/backends/memory/memory_file.dart
+++ b/packages/file/lib/src/backends/memory/memory_file.dart
@@ -29,10 +29,12 @@
     if (node == null) {
       node = _doCreate();
     } else {
-      node = utils.isLink(node) ? utils.resolveLinks(node, () => path) : node;
+      node = utils.isLink(node)
+          ? utils.resolveLinks(node as LinkNode, () => path)
+          : node;
       utils.checkType(expectedType, node.type, () => path);
     }
-    return node;
+    return node as FileNode;
   }
 
   @override
@@ -87,14 +89,14 @@
                 : common.isADirectory(path);
           }
         },
-      );
+      ) as File;
 
   @override
   Future<File> copy(String newPath) async => copySync(newPath);
 
   @override
   File copySync(String newPath) {
-    FileNode sourceNode = resolvedBacking;
+    FileNode sourceNode = resolvedBacking as FileNode;
     fileSystem.findNode(
       newPath,
       segmentVisitor: (
@@ -108,7 +110,8 @@
           if (child != null) {
             if (utils.isLink(child)) {
               List<String> ledger = <String>[];
-              child = utils.resolveLinks(child, () => newPath, ledger: ledger);
+              child = utils.resolveLinks(child as LinkNode, () => newPath,
+                  ledger: ledger);
               checkExists(child, () => newPath);
               parent = child.parent;
               childName = ledger.last;
@@ -134,7 +137,7 @@
   int lengthSync() => (resolvedBacking as FileNode).size;
 
   @override
-  File get absolute => super.absolute;
+  File get absolute => super.absolute as File;
 
   @override
   Future<DateTime> lastAccessed() async => lastAccessedSync();
@@ -148,7 +151,7 @@
 
   @override
   void setLastAccessedSync(DateTime time) {
-    FileNode node = resolvedBacking;
+    FileNode node = resolvedBacking as FileNode;
     node.accessed = time.millisecondsSinceEpoch;
   }
 
@@ -164,7 +167,7 @@
 
   @override
   void setLastModifiedSync(DateTime time) {
-    FileNode node = resolvedBacking;
+    FileNode node = resolvedBacking as FileNode;
     node.modified = time.millisecondsSinceEpoch;
   }
 
@@ -187,7 +190,7 @@
   @override
   Stream<Uint8List> openRead([int start, int end]) {
     try {
-      FileNode node = resolvedBacking;
+      FileNode node = resolvedBacking as FileNode;
       Uint8List content = node.content;
       if (start != null) {
         content = end == null
diff --git a/packages/file/lib/src/backends/memory/memory_file_system.dart b/packages/file/lib/src/backends/memory/memory_file_system.dart
index 38f818e..0451326 100644
--- a/packages/file/lib/src/backends/memory/memory_file_system.dart
+++ b/packages/file/lib/src/backends/memory/memory_file_system.dart
@@ -192,7 +192,7 @@
   /// Gets the node backing for the current working directory. Note that this
   /// can return null if the directory has been deleted or moved from under our
   /// feet.
-  DirectoryNode get _current => findNode(cwd);
+  DirectoryNode get _current => findNode(cwd) as DirectoryNode;
 
   @override
   Node findNode(
@@ -248,10 +248,11 @@
           if (segmentVisitor != null) {
             child = segmentVisitor(directory, basename, child, i, finalSegment);
           }
-          child = utils.resolveLinks(child, subpath, ledger: pathWithSymlinks);
+          child = utils.resolveLinks(child as LinkNode, subpath,
+              ledger: pathWithSymlinks);
         } else {
           child = utils.resolveLinks(
-            child,
+            child as LinkNode,
             subpath,
             ledger: pathWithSymlinks,
             tailVisitor: (DirectoryNode parent, String childName, Node child) {
@@ -266,7 +267,7 @@
       if (i < finalSegment) {
         checkExists(child, subpath);
         utils.checkIsDir(child, subpath);
-        directory = child;
+        directory = child as DirectoryNode;
       }
     }
     return child;
diff --git a/packages/file/lib/src/backends/memory/memory_file_system_entity.dart b/packages/file/lib/src/backends/memory/memory_file_system_entity.dart
index 32a7e2c..3ff5ba9 100644
--- a/packages/file/lib/src/backends/memory/memory_file_system_entity.dart
+++ b/packages/file/lib/src/backends/memory/memory_file_system_entity.dart
@@ -73,7 +73,9 @@
   @protected
   Node get resolvedBacking {
     Node node = backing;
-    node = utils.isLink(node) ? utils.resolveLinks(node, () => path) : node;
+    node = utils.isLink(node)
+        ? utils.resolveLinks(node as LinkNode, () => path)
+        : node;
     utils.checkType(expectedType, node.type, () => path);
     return node;
   }
@@ -262,7 +264,7 @@
               utils.checkType(expectedType, child.type, () => newPath);
             }
             if (validateOverwriteExistingEntity != null) {
-              validateOverwriteExistingEntity(child);
+              validateOverwriteExistingEntity(child as T);
             }
             parent.children.remove(childName);
           }
diff --git a/packages/file/lib/src/backends/memory/memory_link.dart b/packages/file/lib/src/backends/memory/memory_link.dart
index f7c7fd2..b22e2fd 100644
--- a/packages/file/lib/src/backends/memory/memory_link.dart
+++ b/packages/file/lib/src/backends/memory/memory_link.dart
@@ -38,7 +38,7 @@
                 : common.invalidArgument(newPath);
           }
         },
-      );
+      ) as Link;
 
   @override
   Future<Link> create(String target, {bool recursive = false}) async {
@@ -99,7 +99,7 @@
   }
 
   @override
-  Link get absolute => super.absolute;
+  Link get absolute => super.absolute as Link;
 
   @override
   @protected
diff --git a/packages/file/lib/src/backends/memory/utils.dart b/packages/file/lib/src/backends/memory/utils.dart
index a3d7786..de1b6ae 100644
--- a/packages/file/lib/src/backends/memory/utils.dart
+++ b/packages/file/lib/src/backends/memory/utils.dart
@@ -25,7 +25,7 @@
 /// Throws a [io.FileSystemException] if [node] is not a directory.
 void checkIsDir(Node node, PathGenerator path) {
   if (!isDirectory(node)) {
-    throw common.notADirectory(path());
+    throw common.notADirectory(path() as String);
   }
 }
 
@@ -39,12 +39,12 @@
   if (expectedType != actualType) {
     switch (expectedType) {
       case FileSystemEntityType.directory:
-        throw common.notADirectory(path());
+        throw common.notADirectory(path() as String);
       case FileSystemEntityType.file:
         assert(actualType == FileSystemEntityType.directory);
-        throw common.isADirectory(path());
+        throw common.isADirectory(path() as String);
       case FileSystemEntityType.link:
-        throw common.invalidArgument(path());
+        throw common.invalidArgument(path() as String);
       default:
         // Should not happen
         throw AssertionError();
@@ -89,9 +89,9 @@
 
   Node node = link;
   while (isLink(node)) {
-    link = node;
-    if (!breadcrumbs.add(node)) {
-      throw common.tooManyLevelsOfSymbolicLinks(path());
+    link = node as LinkNode;
+    if (!breadcrumbs.add(link)) {
+      throw common.tooManyLevelsOfSymbolicLinks(path() as String);
     }
     if (ledger != null) {
       if (link.fs.path.isAbsolute(link.target)) {
diff --git a/packages/file/lib/src/backends/record_replay/codecs.dart b/packages/file/lib/src/backends/record_replay/codecs.dart
index 1febe07..01f4abe 100644
--- a/packages/file/lib/src/backends/record_replay/codecs.dart
+++ b/packages/file/lib/src/backends/record_replay/codecs.dart
@@ -147,7 +147,7 @@
     _GenericEncoder generic = const _GenericEncoder();
     Map<String, dynamic> encoded = <String, dynamic>{};
     for (dynamic key in input.keys) {
-      String encodedKey = generic.convert(key);
+      String encodedKey = generic.convert(key) as String;
       encoded[encodedKey] = generic.convert(input[key]);
     }
     return encoded;
@@ -212,11 +212,11 @@
 }
 
 /// A [PathContextCodec] serializes and deserializes [path.Context] instances.
-class PathContextCodec extends Codec<path.Context, Map<String, String>> {
+class PathContextCodec extends Codec<path.Context, Map<String, dynamic>> {
   /// Creates a new [PathContextCodec].
   const PathContextCodec();
 
-  static Map<String, String> _encode(path.Context input) {
+  static Map<String, dynamic> _encode(path.Context input) {
     return <String, String>{
       'style': input.style.name,
       'cwd': input.current,
@@ -230,23 +230,23 @@
         'windows': path.Style.windows,
         'url': path.Style.url,
       }[input['style']],
-      current: input['cwd'],
+      current: input['cwd'] as String,
     );
   }
 
   /// Converter that serializes [path.Context] instances.
-  static const Converter<path.Context, Map<String, String>> serialize =
-      _ForwardingConverter<path.Context, Map<String, String>>(_encode);
+  static const Converter<path.Context, Map<String, dynamic>> serialize =
+      _ForwardingConverter<path.Context, Map<String, dynamic>>(_encode);
 
   /// Converter that deserializes [path.Context] instances.
   static const Converter<Map<String, dynamic>, path.Context> deserialize =
       _ForwardingConverter<Map<String, dynamic>, path.Context>(_decode);
 
   @override
-  Converter<path.Context, Map<String, String>> get encoder => serialize;
+  Converter<path.Context, Map<String, dynamic>> get encoder => serialize;
 
   @override
-  Converter<Map<String, String>, path.Context> get decoder => deserialize;
+  Converter<Map<String, dynamic>, path.Context> get decoder => deserialize;
 }
 
 class _ResultEncoder extends Converter<ResultReference<dynamic>, Object> {
@@ -429,13 +429,13 @@
   final Map<String, Object> _data;
 
   @override
-  int get type => _data['type'];
+  int get type => _data['type'] as int;
 
   @override
-  String get path => _data['path'];
+  String get path => _data['path'] as String;
 
   @override
-  bool get isDirectory => _data['isDirectory'];
+  bool get isDirectory => _data['isDirectory'] as bool;
 }
 
 /// Converts an object into a [Future] that completes with that object.
@@ -617,7 +617,7 @@
   @override
   dynamic convert(dynamic input) {
     if (input is Map) {
-      String errorType = input[kManifestErrorTypeKey];
+      String errorType = input[kManifestErrorTypeKey] as String;
       if (_decoders.containsKey(errorType)) {
         return _decoders[errorType].convert(input);
       }
@@ -644,9 +644,9 @@
   static FileSystemException _decode(Map<String, Object> input) {
     Object osError = input['osError'];
     return FileSystemException(
-      input['message'],
-      input['path'],
-      osError == null ? null : const ToError().convert(osError),
+      input['message'] as String,
+      input['path'] as String,
+      osError == null ? null : const ToError().convert(osError) as OSError,
     );
   }
 
@@ -678,7 +678,7 @@
   }
 
   static OSError _decode(Map<String, Object> input) {
-    return OSError(input['message'], input['errorCode']);
+    return OSError(input['message'] as String, input['errorCode'] as int);
   }
 
   static const Converter<OSError, Map<String, Object>> serialize =
@@ -711,7 +711,7 @@
   static ArgumentError _decode(Map<String, Object> input) {
     dynamic message = input['message'];
     dynamic invalidValue = input['invalidValue'];
-    String name = input['name'];
+    String name = input['name'] as String;
     if (invalidValue != null) {
       return ArgumentError.value(invalidValue, name, message);
     } else if (name != null) {
@@ -748,7 +748,7 @@
   }
 
   static NoSuchMethodError _decode(Map<String, Object> input) {
-    return _NoSuchMethodError(input['toString']);
+    return _NoSuchMethodError(input['toString'] as String);
   }
 
   static const Converter<NoSuchMethodError, Map<String, Object>> serialize =
diff --git a/packages/file/lib/src/backends/record_replay/common.dart b/packages/file/lib/src/backends/record_replay/common.dart
index be610bf..8fb680c 100644
--- a/packages/file/lib/src/backends/record_replay/common.dart
+++ b/packages/file/lib/src/backends/record_replay/common.dart
@@ -135,9 +135,10 @@
   if (object1.runtimeType != object2.runtimeType) {
     return false;
   } else if (object1 is List) {
-    return _areListsEqual<dynamic>(object1, object2);
+    return _areListsEqual<dynamic>(object1, object2 as List<dynamic>);
   } else if (object1 is Map) {
-    return _areMapsEqual<dynamic, dynamic>(object1, object2);
+    return _areMapsEqual<dynamic, dynamic>(
+        object1, object2 as Map<dynamic, dynamic>);
   } else {
     return object1 == object2;
   }
diff --git a/packages/file/lib/src/backends/record_replay/events.dart b/packages/file/lib/src/backends/record_replay/events.dart
index 2a545a6..01e5ff4 100644
--- a/packages/file/lib/src/backends/record_replay/events.dart
+++ b/packages/file/lib/src/backends/record_replay/events.dart
@@ -88,10 +88,10 @@
   T get result {
     dynamic result = _result;
     while (result is ResultReference) {
-      ResultReference<dynamic> reference = result;
+      ResultReference<dynamic> reference = result as ResultReference<dynamic>;
       result = reference.recordedValue;
     }
-    return result;
+    return result as T;
   }
 
   @override
@@ -115,7 +115,7 @@
   Future<void> get done async {
     dynamic result = _result;
     while (result is ResultReference) {
-      ResultReference<dynamic> reference = result;
+      ResultReference<dynamic> reference = result as ResultReference<dynamic>;
       await reference.complete;
       result = reference.recordedValue;
     }
diff --git a/packages/file/lib/src/backends/record_replay/mutable_recording.dart b/packages/file/lib/src/backends/record_replay/mutable_recording.dart
index b6c41f6..ec30905 100644
--- a/packages/file/lib/src/backends/record_replay/mutable_recording.dart
+++ b/packages/file/lib/src/backends/record_replay/mutable_recording.dart
@@ -6,7 +6,6 @@
 import 'dart:convert';
 
 import 'package:file/file.dart';
-import 'package:intl/intl.dart';
 
 import 'codecs.dart';
 import 'common.dart';
@@ -64,7 +63,7 @@
   /// It is up to the caller to create the file - it will not exist in the
   /// file system when it is returned from this method.
   File newFile(String name) {
-    String basename = '${NumberFormat('000').format(newUid())}.$name';
+    String basename = '${newUid()}.$name';
     String dirname = destination.path;
     String path = destination.fileSystem.path.join(dirname, basename);
     return destination.fileSystem.file(path);
diff --git a/packages/file/lib/src/backends/record_replay/recording_directory.dart b/packages/file/lib/src/backends/record_replay/recording_directory.dart
index 4fa15c0..e157327 100644
--- a/packages/file/lib/src/backends/record_replay/recording_directory.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_directory.dart
@@ -16,7 +16,7 @@
     implements Directory {
   /// Creates a new `RecordingDirectory`.
   RecordingDirectory(RecordingFileSystem fileSystem, io.Directory delegate)
-      : super(fileSystem, delegate) {
+      : super(fileSystem as RecordingFileSystemImpl, delegate as Directory) {
     methods.addAll(<Symbol, Function>{
       #create: _create,
       #createSync: delegate.createSync,
diff --git a/packages/file/lib/src/backends/record_replay/recording_file.dart b/packages/file/lib/src/backends/record_replay/recording_file.dart
index 3114f1e..cc9b03e 100644
--- a/packages/file/lib/src/backends/record_replay/recording_file.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_file.dart
@@ -36,7 +36,7 @@
 class RecordingFile extends RecordingFileSystemEntity<File> implements File {
   /// Creates a new `RecordingFile`.
   RecordingFile(RecordingFileSystem fileSystem, io.File delegate)
-      : super(fileSystem, delegate) {
+      : super(fileSystem as RecordingFileSystemImpl, delegate as File) {
     methods.addAll(<Symbol, Function>{
       #create: _create,
       #createSync: delegate.createSync,
@@ -93,7 +93,7 @@
   StreamReference<Uint8List> _openRead([int start, int end]) {
     return _BlobStreamReference<Uint8List>(
       file: _newRecordingFile(),
-      stream: delegate.openRead(start, end),
+      stream: delegate.openRead(start, end).cast<Uint8List>(),
       writer: (File file, Uint8List bytes) {
         file.writeAsBytesSync(bytes, mode: FileMode.append, flush: true);
       },
diff --git a/packages/file/lib/src/backends/record_replay/recording_io_sink.dart b/packages/file/lib/src/backends/record_replay/recording_io_sink.dart
index 28ab6f8..1925018 100644
--- a/packages/file/lib/src/backends/record_replay/recording_io_sink.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_io_sink.dart
@@ -50,7 +50,7 @@
   String get identifier => '$runtimeType@$uid';
 
   @override
-  MutableRecording get recording => fileSystem.recording;
+  MutableRecording get recording => fileSystem.recording as MutableRecording;
 
   @override
   Stopwatch get stopwatch => fileSystem.stopwatch;
diff --git a/packages/file/lib/src/backends/record_replay/recording_link.dart b/packages/file/lib/src/backends/record_replay/recording_link.dart
index 14eac4d..01954b9 100644
--- a/packages/file/lib/src/backends/record_replay/recording_link.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_link.dart
@@ -15,7 +15,7 @@
 class RecordingLink extends RecordingFileSystemEntity<Link> implements Link {
   /// Creates a new `RecordingLink`.
   RecordingLink(RecordingFileSystem fileSystem, io.Link delegate)
-      : super(fileSystem, delegate) {
+      : super(fileSystem as RecordingFileSystemImpl, delegate as Link) {
     methods.addAll(<Symbol, Function>{
       #create: _create,
       #createSync: delegate.createSync,
diff --git a/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart b/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
index e5bb186..08f92da 100644
--- a/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
@@ -90,12 +90,6 @@
   @protected
   Stopwatch get stopwatch;
 
-  // This check is used in noSuchMethod to detect if this code is running in a
-  // Dart 1 runtime, or Dart 2.
-  // TODO(srawlins): Remove this after the minimum SDK constraint is such that
-  // there is no "Dart 1" runtime mode. 2.0.0 or something.
-  bool get _runningDart1Runtime => <dynamic>[] is List<String>;
-
   /// Handles invocations for which there is no concrete implementation
   /// function.
   ///
@@ -137,7 +131,7 @@
     try {
       value = Function.apply(method, args, namedArgs);
     } catch (error) {
-      recording.add(createEvent(error: error));
+      recording.add(createEvent(error: error) as LiveInvocationEvent<dynamic>);
       rethrow;
     }
 
@@ -146,45 +140,43 @@
     // We have to instantiate the correct type of StreamReference or
     // FutureReference, so that types are not lost when we unwrap the references
     // afterward.
-    if (_runningDart1Runtime && value is Stream<dynamic>) {
-      // This one is here for Dart 1 runtime mode.
-      value = StreamReference<dynamic>(value);
-    } else if (value is Stream<FileSystemEntity>) {
-      value = StreamReference<FileSystemEntity>(value);
+    if (value is Stream<FileSystemEntity>) {
+      value =
+          StreamReference<FileSystemEntity>(value as Stream<FileSystemEntity>);
     } else if (value is Stream<String>) {
-      value = StreamReference<String>(value);
+      value = StreamReference<String>(value as Stream<String>);
     } else if (value is Stream) {
       throw UnimplementedError(
           'Cannot record method with return type ${value.runtimeType}');
-    } else if (_runningDart1Runtime && value is Future<dynamic>) {
-      // This one is here for Dart 1 runtime mode.
-      value = FutureReference<dynamic>(value);
     } else if (value is Future<bool>) {
-      value = FutureReference<bool>(value);
+      value = FutureReference<bool>(value as Future<bool>);
     } else if (value is Future<Directory>) {
-      value = FutureReference<Directory>(value);
+      value = FutureReference<Directory>(value as Future<Directory>);
     } else if (value is Future<File>) {
-      value = FutureReference<File>(value);
+      value = FutureReference<File>(value as Future<File>);
     } else if (value is Future<FileNode>) {
-      value = FutureReference<FileNode>(value);
+      value = FutureReference<FileNode>(value as Future<FileNode>);
     } else if (value is Future<FileStat>) {
-      value = FutureReference<FileStat>(value);
+      value = FutureReference<FileStat>(value as Future<FileStat>);
     } else if (value is Future<Link>) {
-      value = FutureReference<Link>(value);
+      value = FutureReference<Link>(value as Future<Link>);
     } else if (value is Future<FileSystemEntity>) {
-      value = FutureReference<FileSystemEntity>(value);
+      value =
+          FutureReference<FileSystemEntity>(value as Future<FileSystemEntity>);
     } else if (value is Future<FileSystemEntityType>) {
-      value = FutureReference<FileSystemEntityType>(value);
+      value = FutureReference<FileSystemEntityType>(
+          value as Future<FileSystemEntityType>);
     } else if (value is Future<String>) {
-      value = FutureReference<String>(value);
+      value = FutureReference<String>(value as Future<String>);
     } else if (value is Future<RandomAccessFile>) {
-      value = FutureReference<RandomAccessFile>(value);
+      value =
+          FutureReference<RandomAccessFile>(value as Future<RandomAccessFile>);
     } else if (value is Future<void>) {
-      value = FutureReference<void>(value);
+      value = FutureReference<void>(value as Future<void>);
     }
 
     // Record the invocation event associated with this invocation.
-    recording.add(createEvent(result: value));
+    recording.add(createEvent(result: value) as LiveInvocationEvent<dynamic>);
 
     // Unwrap any result references before returning to the caller.
     dynamic result = value;
diff --git a/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart b/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
index f31c5a9..f5ba461 100644
--- a/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
@@ -69,7 +69,7 @@
   String get identifier => '$runtimeType@$uid';
 
   @override
-  MutableRecording get recording => fileSystem.recording;
+  MutableRecording get recording => fileSystem.recording as MutableRecording;
 
   @override
   Stopwatch get stopwatch => fileSystem.stopwatch;
diff --git a/packages/file/lib/src/backends/record_replay/replay_file_stat.dart b/packages/file/lib/src/backends/record_replay/replay_file_stat.dart
index 58d36e5..497d403 100644
--- a/packages/file/lib/src/backends/record_replay/replay_file_stat.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_file_stat.dart
@@ -16,24 +16,27 @@
   final Map<String, dynamic> _data;
 
   @override
-  DateTime get changed => DateTimeCodec.deserialize.convert(_data['changed']);
+  DateTime get changed =>
+      DateTimeCodec.deserialize.convert(_data['changed'] as int);
 
   @override
-  DateTime get modified => DateTimeCodec.deserialize.convert(_data['modified']);
+  DateTime get modified =>
+      DateTimeCodec.deserialize.convert(_data['modified'] as int);
 
   @override
-  DateTime get accessed => DateTimeCodec.deserialize.convert(_data['accessed']);
+  DateTime get accessed =>
+      DateTimeCodec.deserialize.convert(_data['accessed'] as int);
 
   @override
   FileSystemEntityType get type =>
-      EntityTypeCodec.deserialize.convert(_data['type']);
+      EntityTypeCodec.deserialize.convert(_data['type'] as String);
 
   @override
-  int get mode => _data['mode'];
+  int get mode => _data['mode'] as int;
 
   @override
-  int get size => _data['size'];
+  int get size => _data['size'] as int;
 
   @override
-  String modeString() => _data['modeString'];
+  String modeString() => _data['modeString'] as String;
 }
diff --git a/packages/file/lib/src/backends/record_replay/replay_file_system.dart b/packages/file/lib/src/backends/record_replay/replay_file_system.dart
index 1560c99..35b12c4 100644
--- a/packages/file/lib/src/backends/record_replay/replay_file_system.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_file_system.dart
@@ -75,8 +75,8 @@
     if (!manifestFile.existsSync()) {
       throw ArgumentError('Not a valid recording directory: $dirname');
     }
-    List<Map<String, dynamic>> manifest = const JsonDecoder()
-        .convert(manifestFile.readAsStringSync())
+    List<Map<String, dynamic>> manifest = (const JsonDecoder()
+            .convert(manifestFile.readAsStringSync()) as List<dynamic>)
         .cast<Map<String, dynamic>>();
     return ReplayFileSystemImpl(recording, manifest);
   }
diff --git a/packages/file/lib/src/backends/record_replay/replay_io_sink.dart b/packages/file/lib/src/backends/record_replay/replay_io_sink.dart
index f222ae4..4dbbd4d 100644
--- a/packages/file/lib/src/backends/record_replay/replay_io_sink.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_io_sink.dart
@@ -46,8 +46,9 @@
   @override
   dynamic onResult(Invocation invocation, dynamic result) {
     if (invocation.memberName == #addStream) {
-      Stream<List<int>> stream = invocation.positionalArguments.first;
-      Future<dynamic> future = result;
+      Stream<List<int>> stream =
+          invocation.positionalArguments.first as Stream<List<int>>;
+      Future<dynamic> future = result as Future<dynamic>;
       return future.then<void>(stream.drain);
     }
     return result;
diff --git a/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart b/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
index 70bd44e..d501ab3 100644
--- a/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
@@ -146,8 +146,10 @@
 
   _InvocationMatcher _getMatcher(Invocation invocation) {
     String name = getSymbolName(invocation.memberName);
-    List<dynamic> args = encode(invocation.positionalArguments);
-    Map<String, dynamic> namedArgs = encode(invocation.namedArguments);
+    List<dynamic> args =
+        encode(invocation.positionalArguments) as List<dynamic>;
+    Map<String, dynamic> namedArgs =
+        encode(invocation.namedArguments) as Map<String, dynamic>;
 
     if (invocation.isGetter) {
       return (Map<String, dynamic> entry) =>
@@ -165,7 +167,9 @@
         return entry[kManifestTypeKey] == kInvokeType &&
             entry[kManifestMethodKey] == name &&
             deeplyEqual(entry[kManifestPositionalArgumentsKey], args) &&
-            deeplyEqual(_asNamedArgsType(entry[kManifestNamedArgumentsKey]),
+            deeplyEqual(
+                _asNamedArgsType(
+                    entry[kManifestNamedArgumentsKey] as Map<String, dynamic>),
                 namedArgs) &&
             entry[kManifestObjectKey] == identifier;
       };
diff --git a/packages/file/lib/src/forwarding/forwarding_directory.dart b/packages/file/lib/src/forwarding/forwarding_directory.dart
index 235b1fd..062e02b 100644
--- a/packages/file/lib/src/forwarding/forwarding_directory.dart
+++ b/packages/file/lib/src/forwarding/forwarding_directory.dart
@@ -11,7 +11,7 @@
 abstract class ForwardingDirectory<T extends Directory>
     implements ForwardingFileSystemEntity<T, io.Directory>, Directory {
   @override
-  T wrap(io.Directory delegate) => wrapDirectory(delegate);
+  T wrap(io.Directory delegate) => wrapDirectory(delegate) as T;
 
   @override
   Future<Directory> create({bool recursive = false}) async =>
diff --git a/packages/file/lib/src/forwarding/forwarding_file.dart b/packages/file/lib/src/forwarding/forwarding_file.dart
index e0d52a0..8f98b50 100644
--- a/packages/file/lib/src/forwarding/forwarding_file.dart
+++ b/packages/file/lib/src/forwarding/forwarding_file.dart
@@ -13,7 +13,7 @@
 abstract class ForwardingFile
     implements ForwardingFileSystemEntity<File, io.File>, File {
   @override
-  ForwardingFile wrap(io.File delegate) => wrapFile(delegate);
+  ForwardingFile wrap(io.File delegate) => wrapFile(delegate) as ForwardingFile;
 
   @override
   Future<File> create({bool recursive = false}) async =>
diff --git a/packages/file/lib/src/forwarding/forwarding_link.dart b/packages/file/lib/src/forwarding/forwarding_link.dart
index 25a37d2..6dd0403 100644
--- a/packages/file/lib/src/forwarding/forwarding_link.dart
+++ b/packages/file/lib/src/forwarding/forwarding_link.dart
@@ -11,7 +11,7 @@
 abstract class ForwardingLink
     implements ForwardingFileSystemEntity<Link, io.Link>, Link {
   @override
-  ForwardingLink wrap(io.Link delegate) => wrapLink(delegate);
+  ForwardingLink wrap(io.Link delegate) => wrapLink(delegate) as ForwardingLink;
 
   @override
   Future<Link> create(String target, {bool recursive = false}) async =>
diff --git a/packages/file/pubspec.yaml b/packages/file/pubspec.yaml
index 6058e05..9b065eb 100644
--- a/packages/file/pubspec.yaml
+++ b/packages/file/pubspec.yaml
@@ -13,7 +13,6 @@
 homepage: https://github.com/google/file.dart
 
 dependencies:
-  intl: '>=0.14.0 <1.0.0'
   meta: ^1.1.2
   path: ^1.5.1
 
diff --git a/packages/file/test/chroot_test.dart b/packages/file/test/chroot_test.dart
index 997411c..4d811a0 100644
--- a/packages/file/test/chroot_test.dart
+++ b/packages/file/test/chroot_test.dart
@@ -67,7 +67,7 @@
 
       setUp(() {
         fs = createMemoryBackedChrootFileSystem();
-        mem = fs.delegate;
+        mem = fs.delegate as MemoryFileSystem;
       });
 
       group('FileSystem', () {
diff --git a/packages/file/test/common_tests.dart b/packages/file/test/common_tests.dart
index 702a441..bf10efc 100644
--- a/packages/file/test/common_tests.dart
+++ b/packages/file/test/common_tests.dart
@@ -144,7 +144,7 @@
 
     setUp(() async {
       root = rootfn != null ? rootfn() : '/';
-      fs = await createFs();
+      fs = await createFs() as FileSystem;
       assert(fs.path.isAbsolute(root));
       assert(!root.endsWith(fs.path.separator) ||
           fs.path.rootPrefix(root) == root);
diff --git a/packages/file/test/record_replay_matchers.dart b/packages/file/test/record_replay_matchers.dart
index 15932e6..6187242 100644
--- a/packages/file/test/record_replay_matchers.dart
+++ b/packages/file/test/record_replay_matchers.dart
@@ -72,7 +72,7 @@
   /// Returns this matcher for chaining.
   T on(dynamic object) {
     _fieldMatchers.add(_Target(object));
-    return this;
+    return this as T;
   }
 
   /// Limits the scope of the match to invocations that produced the specified
@@ -90,7 +90,7 @@
   /// Returns this matcher for chaining.
   T withResult(dynamic result) {
     _fieldMatchers.add(_Result(result));
-    return this;
+    return this as T;
   }
 
   /// Limits the scope of the match to invocations that were recorded with the
@@ -102,7 +102,7 @@
   /// Returns this matcher for chaining.
   T withTimestamp(dynamic timestamp) {
     _fieldMatchers.add(_Timestamp(timestamp));
-    return this;
+    return this as T;
   }
 
   /// @nodoc
@@ -129,8 +129,9 @@
     Map<dynamic, dynamic> matchState,
     bool verbose,
   ) {
-    Matcher matcher = matchState['matcher'];
-    matcher.describeMismatch(item, description, matchState['state'], verbose);
+    Matcher matcher = matchState['matcher'] as Matcher;
+    matcher.describeMismatch(item, description,
+        matchState['state'] as Map<String, dynamic>, verbose);
     return description;
   }
 
@@ -369,7 +370,7 @@
 
   @override
   bool matches(dynamic item, Map<dynamic, dynamic> matchState) =>
-      _matcher.matches(getSymbolName(item.method), matchState);
+      _matcher.matches(getSymbolName(item.method as Symbol), matchState);
 
   @override
   Description describeMismatch(
@@ -378,7 +379,7 @@
     Map<dynamic, dynamic> matchState,
     bool verbose,
   ) {
-    String methodName = getSymbolName(item.method);
+    String methodName = getSymbolName(item.method as Symbol);
     description.add('invoked method: \'$methodName\'');
     Description matcherDesc = StringDescription();
     _matcher.describeMismatch(methodName, matcherDesc, matchState, verbose);
@@ -482,7 +483,7 @@
 
   @override
   bool matches(dynamic item, Map<dynamic, dynamic> matchState) =>
-      _matcher.matches(getSymbolName(item.property), matchState);
+      _matcher.matches(getSymbolName(item.property as Symbol), matchState);
 
   @override
   Description describeMismatch(
@@ -491,7 +492,7 @@
     Map<dynamic, dynamic> matchState,
     bool verbose,
   ) {
-    String propertyName = getSymbolName(item.property);
+    String propertyName = getSymbolName(item.property as Symbol);
     description.add('got property: \'$propertyName\'');
     Description matcherDesc = StringDescription();
     _matcher.describeMismatch(propertyName, matcherDesc, matchState, verbose);
@@ -515,7 +516,7 @@
 
   /// Strips the trailing `=` off the symbol name to get the property name.
   String _getPropertyName(dynamic item) {
-    String symbolName = getSymbolName(item.property);
+    String symbolName = getSymbolName(item.property as Symbol);
     return symbolName.substring(0, symbolName.length - 1);
   }
 
diff --git a/packages/file/test/recording_test.dart b/packages/file/test/recording_test.dart
index ed61f18..968dad1 100644
--- a/packages/file/test/recording_test.dart
+++ b/packages/file/test/recording_test.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
@@ -197,7 +198,8 @@
         await rc.futureMethod('qux', namedArg: 'quz');
         await rc.streamMethod('quux', namedArg: 'quuz').drain<void>();
         List<Map<String, dynamic>> manifest =
-            await encode(recording.events).cast<Map<String, dynamic>>();
+            (await encode(recording.events) as List<dynamic>)
+                .cast<Map<String, dynamic>>();
         expect(manifest[0], <String, dynamic>{
           'type': 'set',
           'property': 'basicProperty=',
@@ -435,7 +437,7 @@
             List<InvocationEvent<dynamic>> events = recording.events;
             expect(events.length, greaterThanOrEqualTo(2));
             expect(events[0], invokesMethod().withResult(isDirectory));
-            Directory directory = events[0].result;
+            Directory directory = events[0].result as Directory;
             expect(
                 events,
                 contains(setsProperty('currentDirectory')
@@ -624,7 +626,8 @@
                 containsPair('namedArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -654,7 +657,8 @@
                 containsPair('namedArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -682,7 +686,8 @@
                 containsPair('namedArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -717,7 +722,8 @@
                       containsPair('encoding', 'iso-8859-1'),
                     )),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -752,7 +758,8 @@
                       containsPair('encoding', 'iso-8859-1'),
                     )),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -783,7 +790,8 @@
                 containsPair(
                     'namedArguments', <String, String>{'encoding': 'utf-8'}),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -814,7 +822,8 @@
                 containsPair(
                     'namedArguments', <String, String>{'encoding': 'utf-8'}),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -836,9 +845,9 @@
 List<Map<String, dynamic>> _loadManifest(LiveRecording recording) {
   List<FileSystemEntity> files = recording.destination.listSync();
   File manifestFile = files.singleWhere(
-      (FileSystemEntity entity) => entity.basename == kManifestName);
-  return const JsonDecoder()
-      .convert(manifestFile.readAsStringSync())
+      (FileSystemEntity entity) => entity.basename == kManifestName) as File;
+  return (const JsonDecoder().convert(manifestFile.readAsStringSync())
+          as List<dynamic>)
       .cast<Map<String, dynamic>>();
 }