analysis_options: move to language - strict-casts:true (#1725)

Handle extra strictness around for loops.

- Add a cast to `List`.
- Extract some work to a helper method that can be called from two
  branches so that inference from the `is` checks works better with
  no reassignment.

Co-authored-by: Nate Bosch <nbosch@google.com>
diff --git a/analysis_options.yaml b/analysis_options.yaml
index b38ca9e..0f13fc8 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,7 +1,7 @@
 include: package:lints/recommended.yaml
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
   errors:
     # There are a number of deprecated members used through this package
     deprecated_member_use_from_same_package: ignore
diff --git a/pkgs/test/CHANGELOG.md b/pkgs/test/CHANGELOG.md
index 172f849..16db634 100644
--- a/pkgs/test/CHANGELOG.md
+++ b/pkgs/test/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 1.21.4-dev
+
 ## 1.21.3
 
 * Support the latest `package:test_api` and `package:test_core`.
diff --git a/pkgs/test/pubspec.yaml b/pkgs/test/pubspec.yaml
index d576955..506467f 100644
--- a/pkgs/test/pubspec.yaml
+++ b/pkgs/test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test
-version: 1.21.3
+version: 1.21.4-dev
 description: >-
   A full featured library for writing and running Dart tests across platforms.
 repository: https://github.com/dart-lang/test/tree/master/pkgs/test
@@ -32,7 +32,7 @@
   webkit_inspection_protocol: ^1.0.0
   yaml: ^3.0.0
   # Use an exact version until the test_api and test_core package are stable.
-  test_api: 0.4.11
+  test_api: 0.4.12
   test_core: 0.4.15
 
 dev_dependencies:
diff --git a/pkgs/test_api/CHANGELOG.md b/pkgs/test_api/CHANGELOG.md
index 2f07dc3..2b57eec 100644
--- a/pkgs/test_api/CHANGELOG.md
+++ b/pkgs/test_api/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 0.4.12-dev
+
 ## 0.4.11
 
 * Support the latest version of `package:matcher`.
diff --git a/pkgs/test_api/lib/src/backend/metadata.dart b/pkgs/test_api/lib/src/backend/metadata.dart
index 2f94322..75ff45e 100644
--- a/pkgs/test_api/lib/src/backend/metadata.dart
+++ b/pkgs/test_api/lib/src/backend/metadata.dart
@@ -79,43 +79,47 @@
 
     var result = <PlatformSelector, Metadata>{};
     onPlatform.forEach((platform, metadata) {
+      var selector = PlatformSelector.parse(platform);
       if (metadata is Timeout || metadata is Skip) {
-        metadata = [metadata];
-      } else if (metadata is! List) {
+        result[selector] = _parsePlatformOptions(platform, [metadata]);
+      } else if (metadata is List) {
+        result[selector] = _parsePlatformOptions(platform, metadata);
+      } else {
         throw ArgumentError('Metadata for platform "$platform" must be a '
             'Timeout, Skip, or List of those; was "$metadata".');
       }
-
-      var selector = PlatformSelector.parse(platform);
-
-      Timeout? timeout;
-      dynamic skip;
-      for (var metadatum in metadata) {
-        if (metadatum is Timeout) {
-          if (timeout != null) {
-            throw ArgumentError('Only a single Timeout may be declared for '
-                '"$platform".');
-          }
-
-          timeout = metadatum;
-        } else if (metadatum is Skip) {
-          if (skip != null) {
-            throw ArgumentError('Only a single Skip may be declared for '
-                '"$platform".');
-          }
-
-          skip = metadatum.reason ?? true;
-        } else {
-          throw ArgumentError('Metadata for platform "$platform" must be a '
-              'Timeout, Skip, or List of those; was "$metadata".');
-        }
-      }
-
-      result[selector] = Metadata.parse(timeout: timeout, skip: skip);
     });
     return result;
   }
 
+  static Metadata _parsePlatformOptions(
+      String platform, List<dynamic> metadata) {
+    Timeout? timeout;
+    dynamic skip;
+    for (var metadatum in metadata) {
+      if (metadatum is Timeout) {
+        if (timeout != null) {
+          throw ArgumentError('Only a single Timeout may be declared for '
+              '"$platform".');
+        }
+
+        timeout = metadatum;
+      } else if (metadatum is Skip) {
+        if (skip != null) {
+          throw ArgumentError('Only a single Skip may be declared for '
+              '"$platform".');
+        }
+
+        skip = metadatum.reason ?? true;
+      } else {
+        throw ArgumentError('Metadata for platform "$platform" must be a '
+            'Timeout, Skip, or List of those; was "$metadata".');
+      }
+    }
+
+    return Metadata.parse(timeout: timeout, skip: skip);
+  }
+
   /// Parses a user-provided [String] or [Iterable] into the value for [tags].
   ///
   /// Throws an [ArgumentError] if [tags] is not a [String] or an [Iterable].
@@ -263,7 +267,7 @@
         _retry = serialized['retry'] as int?,
         tags = Set.from(serialized['tags'] as Iterable),
         onPlatform = {
-          for (var pair in serialized['onPlatform'])
+          for (var pair in serialized['onPlatform'] as List)
             PlatformSelector.parse(pair.first as String):
                 Metadata.deserialize(pair.last)
         },
diff --git a/pkgs/test_api/pubspec.yaml b/pkgs/test_api/pubspec.yaml
index b74bb64..7b9ae0a 100644
--- a/pkgs/test_api/pubspec.yaml
+++ b/pkgs/test_api/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test_api
-version: 0.4.11
+version: 0.4.12-dev
 description: A library for writing Dart tests.
 repository: https://github.com/dart-lang/test/tree/master/pkgs/test_api
 
diff --git a/pkgs/test_core/CHANGELOG.md b/pkgs/test_core/CHANGELOG.md
index 4fb0848..9e62d20 100644
--- a/pkgs/test_core/CHANGELOG.md
+++ b/pkgs/test_core/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 0.4.16-dev
+
 ## 0.4.15
 
 * Support the latest `package:test_api`.
diff --git a/pkgs/test_core/pubspec.yaml b/pkgs/test_core/pubspec.yaml
index c078255..2c94c66 100644
--- a/pkgs/test_core/pubspec.yaml
+++ b/pkgs/test_core/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test_core
-version: 0.4.15
+version: 0.4.16-dev
 description: A basic library for writing tests and running them on the VM.
 repository: https://github.com/dart-lang/test/tree/master/pkgs/test_core
 
@@ -30,7 +30,7 @@
   # matcher is tightly constrained by test_api
   matcher: any
   # Use an exact version until the test_api package is stable.
-  test_api: 0.4.11
+  test_api: 0.4.12
 
 dev_dependencies:
   lints: '>=1.0.0 <3.0.0'