Version 2.17.0-221.0.dev

Merge commit 'd5cc53a1b8fba37fa14e48b7c669709f377c00be' into 'dev'
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index 9922aec..bb407f0 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -5,6 +5,9 @@
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:pub_semver/pub_semver.dart';
 
+// We use snake_case for these constants.
+// ignore_for_file: non_constant_identifier_names
+
 /// Information about a single language feature whose presence or absence
 /// depends on the supported Dart SDK version, and possibly on the presence of
 /// experimental flags.
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 309fcf1..364355a 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -102,9 +102,7 @@
 
   @override
   T? visitNode(AstNode node) {
-    delegates.forEach((delegate) {
-      node.accept(delegate);
-    });
+    delegates.forEach(node.accept);
     node.visitChildren(this);
     return null;
   }
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 9c73621..0a0a1e6 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -51,6 +51,9 @@
 import 'package:analyzer/src/task/api/model.dart' show AnalysisTarget;
 import 'package:pub_semver/pub_semver.dart';
 
+// TODO(srawlins): Fix these in a presumably breaking change.
+// ignore_for_file: constant_identifier_names
+
 /// An element that represents a class or a mixin. The class can be defined by
 /// either a class declaration (with a class body), a mixin application (without
 /// a class body), a mixin declaration, or an enum declaration.
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 19f32cc..e3393a2 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -943,7 +943,7 @@
 
 /// The lazy initialized map from [ErrorCode.uniqueName] to the [ErrorCode]
 /// instance.
-late final HashMap<String, ErrorCode> _uniqueNameToCodeMap =
+final HashMap<String, ErrorCode> _uniqueNameToCodeMap =
     _computeUniqueNameToCodeMap();
 
 /// Return the [ErrorCode] with the given [uniqueName], or `null` if not
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index 17a6103..6f8edc5 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -567,7 +567,7 @@
   }
 
   @override
-  Uri toUri() => provider.pathContext.toUri(path + '/');
+  Uri toUri() => provider.pathContext.toUri('$path/');
 }
 
 /// An in-memory implementation of [Resource].
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index c359bdd..6b75c0c 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -13,7 +13,7 @@
 
 /// The name of the directory containing plugin specific subfolders used to
 /// store data across sessions.
-const String _SERVER_DIR = ".dartServer";
+const String _serverDir = ".dartServer";
 
 /// Returns the path to default state location.
 ///
@@ -28,7 +28,7 @@
 
   final home = io.Platform.isWindows ? env['LOCALAPPDATA'] : env['HOME'];
   return home != null && io.FileSystemEntity.isDirectorySync(home)
-      ? join(home, _SERVER_DIR)
+      ? join(home, _serverDir)
       : null;
 }
 
diff --git a/pkg/analyzer/lib/instrumentation/log_adapter.dart b/pkg/analyzer/lib/instrumentation/log_adapter.dart
index cd1393c..2199242 100644
--- a/pkg/analyzer/lib/instrumentation/log_adapter.dart
+++ b/pkg/analyzer/lib/instrumentation/log_adapter.dart
@@ -6,6 +6,9 @@
 import 'package:analyzer/instrumentation/plugin_data.dart';
 import 'package:analyzer/instrumentation/service.dart';
 
+// TODO(srawlins): Fix these in a presumably breaking change.
+// ignore_for_file: constant_identifier_names
+
 /// A class to adapt an [InstrumentationService] into a log using an [InstrumentationLogger].
 class InstrumentationLogAdapter implements InstrumentationService {
   static const String TAG_ERROR = 'Err';
diff --git a/pkg/analyzer/lib/instrumentation/multicast_service.dart b/pkg/analyzer/lib/instrumentation/multicast_service.dart
index 9c7e0af..7962f56 100644
--- a/pkg/analyzer/lib/instrumentation/multicast_service.dart
+++ b/pkg/analyzer/lib/instrumentation/multicast_service.dart
@@ -13,7 +13,9 @@
 
   @override
   void logError(String message) {
-    _services.forEach((s) => s.logError(message));
+    for (var service in _services) {
+      service.logError(message);
+    }
   }
 
   @override
@@ -22,81 +24,105 @@
     StackTrace? stackTrace,
     List<InstrumentationServiceAttachment>? attachments,
   ]) {
-    _services
-        .forEach((s) => s.logException(exception, stackTrace, attachments));
+    for (var service in _services) {
+      service.logException(exception, stackTrace, attachments);
+    }
   }
 
   @override
   void logInfo(String message, [dynamic exception]) {
-    _services.forEach((s) => s.logInfo(message, exception));
+    for (var service in _services) {
+      service.logInfo(message, exception);
+    }
   }
 
   @override
   void logLogEntry(String level, DateTime time, String message,
       Object exception, StackTrace stackTrace) {
-    _services.forEach(
-        (s) => s.logLogEntry(level, time, message, exception, stackTrace));
+    for (var service in _services) {
+      service.logLogEntry(level, time, message, exception, stackTrace);
+    }
   }
 
   @override
   void logNotification(String notification) {
-    _services.forEach((s) => s.logNotification(notification));
+    for (var service in _services) {
+      service.logNotification(notification);
+    }
   }
 
   @override
   void logPluginError(
       PluginData plugin, String code, String message, String stackTrace) {
-    _services
-        .forEach((s) => s.logPluginError(plugin, code, message, stackTrace));
+    for (var service in _services) {
+      service.logPluginError(plugin, code, message, stackTrace);
+    }
   }
 
   @override
   void logPluginException(
       PluginData plugin, Object exception, StackTrace? stackTrace) {
-    _services
-        .forEach((s) => s.logPluginException(plugin, exception, stackTrace));
+    for (var service in _services) {
+      service.logPluginException(plugin, exception, stackTrace);
+    }
   }
 
   @override
   void logPluginNotification(String pluginId, String notification) {
-    _services.forEach((s) => s.logPluginNotification(pluginId, notification));
+    for (var service in _services) {
+      service.logPluginNotification(pluginId, notification);
+    }
   }
 
   @override
   void logPluginRequest(String pluginId, String request) {
-    _services.forEach((s) => s.logPluginRequest(pluginId, request));
+    for (var service in _services) {
+      service.logPluginRequest(pluginId, request);
+    }
   }
 
   @override
   void logPluginResponse(String pluginId, String response) {
-    _services.forEach((s) => s.logPluginResponse(pluginId, response));
+    for (var service in _services) {
+      service.logPluginResponse(pluginId, response);
+    }
   }
 
   @override
   void logPluginTimeout(PluginData plugin, String request) {
-    _services.forEach((s) => s.logPluginTimeout(plugin, request));
+    for (var service in _services) {
+      service.logPluginTimeout(plugin, request);
+    }
   }
 
   @override
   void logRequest(String request) {
-    _services.forEach((s) => s.logRequest(request));
+    for (var service in _services) {
+      service.logRequest(request);
+    }
   }
 
   @override
   void logResponse(String response) {
-    _services.forEach((s) => s.logResponse(response));
+    for (var service in _services) {
+      service.logResponse(response);
+    }
   }
 
   @override
   void logVersion(String uuid, String clientId, String clientVersion,
       String serverVersion, String sdkVersion) {
-    _services.forEach((s) =>
-        s.logVersion(uuid, clientId, clientVersion, serverVersion, sdkVersion));
+    for (var service in _services) {
+      service.logVersion(
+          uuid, clientId, clientVersion, serverVersion, sdkVersion);
+    }
   }
 
   @override
   void logWatchEvent(String folderPath, String filePath, String changeType) {
-    _services.forEach((s) => s.logWatchEvent(folderPath, filePath, changeType));
+    for (var service in _services) {
+      service.logWatchEvent(folderPath, filePath, changeType);
+    }
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 5ab147e..a454827 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -1170,18 +1170,18 @@
           return;
         }
         // Notify the completers.
-        _requestedFiles.remove(path)!.forEach((completer) {
+        for (var completer in _requestedFiles.remove(path)!) {
           completer.complete(result.unitResult!);
-        });
+        }
         // Remove from to be analyzed and produce it now.
         _fileTracker.fileWasAnalyzed(path);
         _resultController.add(result.unitResult!);
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
         _fileTracker.fileWasAnalyzed(path);
-        _requestedFiles.remove(path)!.forEach((completer) {
+        for (var completer in _requestedFiles.remove(path)!) {
           completer.completeError(exception, stackTrace);
-        });
+        }
         _clearLibraryContextAfterException();
       }
       return;
@@ -1192,13 +1192,13 @@
       String path = _requestedLibraries.keys.first;
       try {
         var result = _computeResolvedLibrary(path);
-        _requestedLibraries.remove(path)!.forEach((completer) {
+        for (var completer in _requestedLibraries.remove(path)!) {
           completer.complete(result);
-        });
+        }
       } catch (exception, stackTrace) {
-        _requestedLibraries.remove(path)!.forEach((completer) {
+        for (var completer in _requestedLibraries.remove(path)!) {
           completer.completeError(exception, stackTrace);
-        });
+        }
         _clearLibraryContextAfterException();
       }
       return;
@@ -1210,9 +1210,9 @@
       var completers = _errorsRequestedFiles.remove(path)!;
       var result = _computeErrors(path: path, asIsIfPartWithoutLibrary: false);
       if (result != null) {
-        completers.forEach((completer) {
+        for (var completer in completers) {
           completer.complete(result);
-        });
+        }
       } else {
         _errorsRequestedParts.putIfAbsent(path, () => []).addAll(completers);
       }
@@ -1223,9 +1223,9 @@
     if (_indexRequestedFiles.isNotEmpty) {
       String path = _indexRequestedFiles.keys.first;
       AnalysisDriverUnitIndex index = _computeIndex(path);
-      _indexRequestedFiles.remove(path)!.forEach((completer) {
+      for (var completer in _indexRequestedFiles.remove(path)!) {
         completer.complete(index);
-      });
+      }
       return;
     }
 
@@ -1235,9 +1235,9 @@
       UnitElementResult? result = _computeUnitElement(path);
       var completers = _unitElementRequestedFiles.remove(path)!;
       if (result != null) {
-        completers.forEach((completer) {
+        for (var completer in completers) {
           completer.complete(result);
-        });
+        }
       } else {
         _unitElementRequestedParts
             .putIfAbsent(path, () => [])
@@ -1327,18 +1327,18 @@
         var result = _computeAnalysisResult(path,
             withUnit: true, asIsIfPartWithoutLibrary: true)!;
         // Notify the completers.
-        _requestedParts.remove(path)!.forEach((completer) {
+        for (var completer in _requestedParts.remove(path)!) {
           completer.complete(result.unitResult!);
-        });
+        }
         // Remove from to be analyzed and produce it now.
         _partsToAnalyze.remove(path);
         _resultController.add(result.unitResult!);
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
         _partsToAnalyze.remove(path);
-        _requestedParts.remove(path)!.forEach((completer) {
+        for (var completer in _requestedParts.remove(path)!) {
           completer.completeError(exception, stackTrace);
-        });
+        }
         _clearLibraryContextAfterException();
       }
       return;
@@ -1371,9 +1371,9 @@
       String path = _unitElementRequestedParts.keys.first;
       UnitElementResult result =
           _computeUnitElement(path, asIsIfPartWithoutLibrary: true)!;
-      _unitElementRequestedParts.remove(path)!.forEach((completer) {
+      for (var completer in _unitElementRequestedParts.remove(path)!) {
         completer.complete(result);
-      });
+      }
       return;
     }
 
@@ -1382,9 +1382,9 @@
       var path = _errorsRequestedParts.keys.first;
       var completers = _errorsRequestedParts.remove(path)!;
       var result = _computeErrors(path: path, asIsIfPartWithoutLibrary: true);
-      completers.forEach((completer) {
+      for (var completer in completers) {
         completer.complete(result);
-      });
+      }
       return;
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 06b9e06..92ea903 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -2360,14 +2360,14 @@
     StringBuffer buffer = StringBuffer();
     buffer.write('[');
     bool first = true;
-    _elements.forEach((DartObjectImpl element) {
+    for (var element in _elements) {
       if (first) {
         first = false;
       } else {
         buffer.write(', ');
       }
       buffer.write(element);
-    });
+    }
     buffer.write(']');
     return buffer.toString();
   }
@@ -2571,14 +2571,14 @@
     StringBuffer buffer = StringBuffer();
     buffer.write('{');
     bool first = true;
-    _elements.forEach((DartObjectImpl element) {
+    for (var element in _elements) {
       if (first) {
         first = false;
       } else {
         buffer.write(', ');
       }
       buffer.write(element);
-    });
+    }
     buffer.write('}');
     return buffer.toString();
   }
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index df98227..91ce587 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -219,9 +219,9 @@
         var result = performance!.run('getFilesContaining', (performance) {
           return fsState!.getFilesContaining(element.displayName);
         });
-        result.forEach((filePath) {
+        for (var filePath in result) {
           collectReferences(filePath, performance!);
-        });
+        }
       }
       return references;
     });
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index dcac77f..216f128 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -101,6 +101,16 @@
   }
 
   @override
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
+    var element = node.declaredElement;
+    if (element is SuperFormalParameterElement) {
+      usedElements.addElement(element.superConstructorParameter);
+    }
+
+    super.visitDefaultFormalParameter(node);
+  }
+
+  @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     usedElements.addElement(node.constructorElement?.declaration);
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 66b1e0f..20996fa 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -585,13 +585,13 @@
   void checkFieldFormalParameters(FormalParameterList? parameterList) {
     var parameters = parameterList?.parameters;
     if (parameters != null) {
-      parameters.forEach((FormalParameter param) {
-        if (param is FieldFormalParameter) {
+      for (var parameter in parameters) {
+        if (parameter is FieldFormalParameter) {
           // This error is reported in the BodyBuilder.endFormalParameter.
           handleRecoverableError(messageFieldInitializerOutsideConstructor,
-              param.thisKeyword, param.thisKeyword);
+              parameter.thisKeyword, parameter.thisKeyword);
         }
-      });
+      }
     }
   }
 
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 7eb9520..18d98ab 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -138,11 +138,11 @@
         projectAnalysisSession,
         _filesAnalyzed.toList(),
       );
-      Registry.ruleRegistry.forEach((lint) {
+      for (var lint in Registry.ruleRegistry) {
         if (lint is ProjectVisitor) {
           (lint as ProjectVisitor).visit(project);
         }
-      });
+      }
     }
 
     var result = <AnalysisErrorInfo>[];
diff --git a/pkg/analyzer/lib/src/lint/config.dart b/pkg/analyzer/lib/src/lint/config.dart
index 288bf06..d27f4ae 100644
--- a/pkg/analyzer/lib/src/lint/config.dart
+++ b/pkg/analyzer/lib/src/lint/config.dart
@@ -65,7 +65,9 @@
 
   void addAsListOrString(Object? value, List<String> list) {
     if (value is List) {
-      value.forEach((v) => list.add(v));
+      for (var entry in value) {
+        list.add(entry);
+      }
     } else if (value is String) {
       list.add(value);
     }
@@ -130,12 +132,12 @@
           // - unnecessary_getters
           // - camel_case_types
           if (v is YamlList) {
-            v.nodes.forEach((rule) {
+            for (var rule in v.nodes) {
               var config = _RuleConfig();
               config.name = asString(rule);
               config.args = {'enabled': true};
               ruleConfigs.add(config);
-            });
+            }
           }
 
           // style_guide: {unnecessary_getters: false, camel_case_types: true}
diff --git a/pkg/analyzer/lib/src/lint/util.dart b/pkg/analyzer/lib/src/lint/util.dart
index 392df53..0580f08 100644
--- a/pkg/analyzer/lib/src/lint/util.dart
+++ b/pkg/analyzer/lib/src/lint/util.dart
@@ -107,9 +107,11 @@
   }
 
   void write(AstNode node) {
-    //EOL comments
+    // EOL comments.
     var comments = getPrecedingComments(node.beginToken);
-    comments.forEach((c) => sink.writeln('${"  " * indent}$c'));
+    for (var comment in comments) {
+      sink.writeln('${"  " * indent}$comment');
+    }
 
     sink.writeln(
         '${"  " * indent}${asString(node)} ${getTrailingComment(node)}');
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 682acc6..8170621 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -272,8 +272,11 @@
   CompositeValidator(this.validators);
 
   @override
-  void validate(ErrorReporter reporter, YamlMap options) =>
-      validators.forEach((v) => v.validate(reporter, options));
+  void validate(ErrorReporter reporter, YamlMap options) {
+    for (var validator in validators) {
+      validator.validate(reporter, options);
+    }
+  }
 }
 
 /// Validates `analyzer` language configuration options.
@@ -550,7 +553,9 @@
       source,
       isNonNullableByDefault: false,
     );
-    _validators.forEach((OptionsValidator v) => v.validate(reporter, options));
+    for (var validator in _validators) {
+      validator.validate(reporter, options);
+    }
     return recorder.errors;
   }
 }
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index 5519a0d..d010025 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -1376,13 +1376,13 @@
     expect(
         astFactory
             .simpleStringLiteral(
-                TokenFactory.tokenFromString("''' \ \nX''"), "X")
+                TokenFactory.tokenFromString("'''  \nX''"), "X")
             .contentsOffset,
         6);
     expect(
         astFactory
             .simpleStringLiteral(
-                TokenFactory.tokenFromString('r""" \ \nX"""'), "X")
+                TokenFactory.tokenFromString('r"""  \nX"""'), "X")
             .contentsOffset,
         7);
   }
diff --git a/pkg/analyzer/test/file_system/file_system_test_support.dart b/pkg/analyzer/test/file_system/file_system_test_support.dart
index 239b461..517ac99 100644
--- a/pkg/analyzer/test/file_system/file_system_test_support.dart
+++ b/pkg/analyzer/test/file_system/file_system_test_support.dart
@@ -665,9 +665,9 @@
     expect(children, hasLength(3));
     children.sort((a, b) => a.shortName.compareTo(b.shortName));
     // check that each child exists
-    children.forEach((child) {
+    for (var child in children) {
       expect(child.exists, true);
-    });
+    }
     // check names
     expect(children[0].shortName, 'a.txt');
     expect(children[1].shortName, 'bFolder');
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 461dba2..d06a00c 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -2902,7 +2902,7 @@
     expect(result.unit.declarations, hasLength(1));
     final mainDecl = result.unit.declarations[0];
     expect(mainDecl.metadata, hasLength(8));
-    mainDecl.metadata.forEach((metadata) {
+    for (var metadata in mainDecl.metadata) {
       final value = metadata.elementAnnotation!.computeConstantValue()!;
       expect(value, isNotNull);
       assertType(value.type, 'B');
@@ -2915,7 +2915,7 @@
         expect(unbounded.isNull, true);
         assertType(bounded.type, 'Bounded<String>');
       }
-    });
+    }
   }
 
   test_parameterScope_local() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
index 76fafef..46ba881 100644
--- a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
+++ b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
@@ -104,11 +104,11 @@
   void applyReplacements() {
     replacements.sort((a, b) => b.offset - a.offset);
     var newCode = content;
-    replacements.forEach((replacement) {
+    for (var replacement in replacements) {
       newCode = newCode.substring(0, replacement.offset) +
           replacement.text +
           newCode.substring(replacement.end);
-    });
+    }
     io.File(path).writeAsStringSync(newCode);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
index 74c8fa5..69468f2 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
@@ -261,6 +261,18 @@
     ]);
   }
 
+  test_parameter_optionalNamed_isUsed_superFormal() async {
+    await assertNoErrorsInCode(r'''
+class _A {
+  _A({int? a});
+}
+
+class B extends _A {
+  B({super.a});
+}
+''');
+  }
+
   test_parameter_optionalPositional_fieldFormal_isUsed_constructorInvocation() async {
     await assertNoErrorsInCode(r'''
 class _A {
@@ -307,6 +319,18 @@
     ]);
   }
 
+  test_parameter_optionalPositional_isUsed_superFormal() async {
+    await assertNoErrorsInCode(r'''
+class _A {
+  _A([int? a]);
+}
+
+class B extends _A {
+  B([super.a]);
+}
+''');
+  }
+
   test_privateEnum_privateConstructor_isUsed_redirect() async {
     await assertNoErrorsInCode(r'''
 enum _E {
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
index 0622739..da370bd 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
@@ -169,13 +169,13 @@
           GatheringErrorListener(checkRanges: true);
       parseCompilationUnit2(base.toString(), listener, featureSet: featureSet);
       var baseErrorCodes = <ErrorCode>[];
-      listener.errors.forEach((AnalysisError error) {
+      for (var error in listener.errors) {
         if (error.errorCode == ParserErrorCode.BREAK_OUTSIDE_OF_LOOP ||
             error.errorCode == ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP ||
             error.errorCode == ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE) {
           baseErrorCodes.add(error.errorCode);
         }
-      });
+      }
 
       var expectedValidCodeErrors = <ErrorCode>[];
       expectedValidCodeErrors.addAll(baseErrorCodes);
diff --git a/pkg/analyzer/test/src/lint/pub_test.dart b/pkg/analyzer/test/src/lint/pub_test.dart
index aa4dfe1..303e6d3 100644
--- a/pkg/analyzer/test/src/lint/pub_test.dart
+++ b/pkg/analyzer/test/src/lint/pub_test.dart
@@ -203,13 +203,13 @@
 testDepListContains(
     String label, PSDependencyList? list, List<Map<String, String>> exp) {
   test(label, () {
-    exp.forEach((Map<String, String> entry) {
+    for (var entry in exp) {
       entry.forEach((k, v) {
         PSDependency dep = findDependency(list, name: k);
         expect(dep, isNotNull);
         expect(dep.version!.value.text, equals(v));
       });
-    });
+    }
   });
 }
 
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 47a6243..af36916 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -31,10 +31,11 @@
   if (_testPath != null && _replacements.isNotEmpty) {
     _replacements.sort((a, b) => b.offset - a.offset);
     String newCode = _testCode!;
-    _replacements.forEach((r) {
-      newCode =
-          newCode.substring(0, r.offset) + r.text + newCode.substring(r.end);
-    });
+    for (var replacement in _replacements) {
+      newCode = newCode.substring(0, replacement.offset) +
+          replacement.text +
+          newCode.substring(replacement.end);
+    }
     File(_testPath!).writeAsStringSync(newCode);
   }
 }
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 09c0acc..1a23546 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -37738,7 +37738,9 @@
       LibraryElementImpl library, List<String> names) {
     var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
     var reference = unit.reference!;
-    names.forEach((name) => reference = reference.getChild(name));
+    for (var name in names) {
+      reference = reference.getChild(name);
+    }
 
     var element = reference.element;
     if (element != null) {
diff --git a/pkg/analyzer/tool/analysis_driver/inspect_exception.dart b/pkg/analyzer/tool/analysis_driver/inspect_exception.dart
index 2dc63cc..4eda86e 100644
--- a/pkg/analyzer/tool/analysis_driver/inspect_exception.dart
+++ b/pkg/analyzer/tool/analysis_driver/inspect_exception.dart
@@ -36,7 +36,7 @@
   print('');
   print('');
 
-  context.files.forEach((file) {
+  for (var file in context.files) {
     print("=" * 40);
     print('${file.path}');
     print("-" * 40);
@@ -44,5 +44,5 @@
     print('');
     print('');
     print('');
-  });
+  }
 }
diff --git a/pkg/analyzer/tool/summary/stats.dart b/pkg/analyzer/tool/summary/stats.dart
index d03b7db..a9c094e 100644
--- a/pkg/analyzer/tool/summary/stats.dart
+++ b/pkg/analyzer/tool/summary/stats.dart
@@ -76,11 +76,11 @@
       if (value is SummaryClass) {
         record(value);
       } else if (value is List) {
-        value.forEach((element) {
+        for (var element in value) {
           if (element is SummaryClass) {
             record(element);
           }
-        });
+        }
       }
     });
   }
diff --git a/tools/VERSION b/tools/VERSION
index 7353eaa..748f5d3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 220
+PRERELEASE 221
 PRERELEASE_PATCH 0
\ No newline at end of file