Version 2.18.0-15.0.dev

Merge commit '03fd724529edcc2cf20c145e62bbb3430a8aff1c' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/deferred_closure_heuristic.dart b/pkg/_fe_analyzer_shared/lib/src/deferred_function_literal_heuristic.dart
similarity index 77%
rename from pkg/_fe_analyzer_shared/lib/src/deferred_closure_heuristic.dart
rename to pkg/_fe_analyzer_shared/lib/src/deferred_function_literal_heuristic.dart
index 9bff8c0..7102e1b 100644
--- a/pkg/_fe_analyzer_shared/lib/src/deferred_closure_heuristic.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/deferred_function_literal_heuristic.dart
@@ -10,26 +10,27 @@
 /// [planReconciliationStages] is used as part of support for
 /// https://github.com/dart-lang/language/issues/731 (improved inference for
 /// fold etc.) to choose the proper order in which to recursively analyze
-/// closures passed as invocation arguments.
-abstract class ClosureDependencies<TypeVariable, ParamInfo,
+/// function literals passed as invocation arguments.
+abstract class FunctionLiteralDependencies<TypeVariable, ParamInfo,
     DeferredParamInfo extends ParamInfo> {
   final List<_Node<ParamInfo>> _paramNodes = [];
 
-  /// Construct a [ClosureDependencies] object that's prepared to determine the
-  /// order to resolve [deferredParams] for a generic invocation involving the
-  /// given [typeVariables].
+  /// Construct a [FunctionLiteralDependencies] object that's prepared to
+  /// determine the order to resolve [deferredParams] for a generic invocation
+  /// involving the given [typeVariables].
   ///
   /// [unDeferredParams] should contain information about any parameters
   /// corresponding to arguments that have already been type inferred.
-  ClosureDependencies(
+  FunctionLiteralDependencies(
       Iterable<DeferredParamInfo> deferredParams,
       Iterable<TypeVariable> typeVariables,
       Iterable<ParamInfo> unDeferredParams) {
     Map<TypeVariable, Set<_Node<ParamInfo>>> paramsDependingOnTypeVar = {};
     Map<TypeVariable, Set<_Node<ParamInfo>>> paramsConstrainingTypeVar = {};
+    int deferredParamIndex = 0;
     for (DeferredParamInfo param in deferredParams) {
       _Node<ParamInfo> paramNode =
-          new _Node<ParamInfo>(param, isDeferred: true);
+          new _Node<ParamInfo>(param, deferredParamIndex: deferredParamIndex++);
       _paramNodes.add(paramNode);
       for (TypeVariable v in typeVarsFreeInParamParams(param)) {
         (paramsDependingOnTypeVar[v] ??= {}).add(paramNode);
@@ -40,7 +41,7 @@
     }
     for (ParamInfo param in unDeferredParams) {
       _Node<ParamInfo> paramNode =
-          new _Node<ParamInfo>(param, isDeferred: false);
+          new _Node<ParamInfo>(param, deferredParamIndex: null);
       _paramNodes.add(paramNode);
       // Note: for un-deferred parameters, we only care about
       // typeVarsFreeInParamReturns, because these parameters have already been
@@ -64,10 +65,12 @@
   /// Each entry in the returned list represents the set of parameters whose
   /// corresponding arguments should be visited during a single stage of
   /// resolution; after each stage, the assignment of actual types to type
-  /// variables should be refined.
+  /// variables should be refined.  The list of parameters in each stage is
+  /// sorted to match the order of the `deferredParams` node passed to the
+  /// constructor.
   ///
   /// So, for example, if the parameters in question are A, B, and C, and the
-  /// returned list is `[{A, B}, {C}]`, then first parameters A and B should be
+  /// returned list is `[[A, B], [C]]`, then first parameters A and B should be
   /// resolved, then the assignment of actual types to type variables should be
   /// refined, and then C should be resolved, and then the final assignment of
   /// actual types to type variables should be computed.
@@ -75,13 +78,24 @@
   /// Note that the first stage may be empty; when this happens, it means that
   /// the assignment of actual types to type variables should be refined before
   /// doing any visiting.
-  List<Set<DeferredParamInfo>> planReconciliationStages() {
+  List<List<DeferredParamInfo>> planReconciliationStages() {
     _DependencyWalker<ParamInfo, DeferredParamInfo> walker =
         new _DependencyWalker<ParamInfo, DeferredParamInfo>();
     for (_Node<ParamInfo> paramNode in _paramNodes) {
       walker.walk(paramNode);
     }
-    return walker.reconciliationStages;
+    List<_Node<ParamInfo>> _sortStage(List<_Node<ParamInfo>> stage) {
+      stage.sort((a, b) => a.deferredParamIndex! - b.deferredParamIndex!);
+      return stage;
+    }
+
+    return [
+      for (List<_Node<ParamInfo>> stage in walker.reconciliationStages)
+        [
+          for (_Node<ParamInfo> node in _sortStage(stage))
+            node.param as DeferredParamInfo
+        ]
+    ];
   }
 
   /// If the type of the parameter corresponding to [param] is a function type,
@@ -107,7 +121,7 @@
 class _DependencyWalker<ParamInfo, DeferredParamInfo extends ParamInfo>
     extends DependencyWalker<_Node<ParamInfo>> {
   /// The set of reconciliation stages accumulated so far.
-  final List<Set<DeferredParamInfo>> reconciliationStages = [];
+  final List<List<_Node<ParamInfo>>> reconciliationStages = [];
 
   @override
   void evaluate(_Node<ParamInfo> v) => evaluateScc([v]);
@@ -124,17 +138,17 @@
       }
     }
     if (reconciliationStages.length <= stageNum) {
-      reconciliationStages.add({});
+      reconciliationStages.add([]);
       // `stageNum` can't grow by more than 1 each time `evaluateScc` is called,
       // so adding one stage is sufficient to make sure the list is now long
       // enough.
       assert(stageNum < reconciliationStages.length);
     }
-    Set<DeferredParamInfo> stage = reconciliationStages[stageNum];
+    List<_Node<ParamInfo>> stage = reconciliationStages[stageNum];
     for (_Node<ParamInfo> node in nodes) {
       node.stageNum = stageNum;
-      if (node.isDeferred) {
-        stage.add(node.param as DeferredParamInfo);
+      if (node.deferredParamIndex != null) {
+        stage.add(node);
       }
     }
   }
@@ -153,10 +167,11 @@
   /// The nodes for the parameters depended on by this parameter.
   final List<_Node<ParamInfo>> dependencies = [];
 
-  /// Indicates whether this node represents a deferred parameter.
-  final bool isDeferred;
+  /// If this node represents a deferred parameter, the index of it in the list
+  /// of deferred parameters used to construct [FunctionLiteralDependencies].
+  final int? deferredParamIndex;
 
-  _Node(this.param, {required this.isDeferred});
+  _Node(this.param, {required this.deferredParamIndex});
 
   @override
   bool get isEvaluated => stageNum != null;
diff --git a/pkg/_fe_analyzer_shared/test/deferred_closure_heuristic_test.dart b/pkg/_fe_analyzer_shared/test/deferred_closure_heuristic_test.dart
deleted file mode 100644
index 41ec79e..0000000
--- a/pkg/_fe_analyzer_shared/test/deferred_closure_heuristic_test.dart
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:_fe_analyzer_shared/src/deferred_closure_heuristic.dart';
-import 'package:test/test.dart';
-
-main() {
-  test('single', () {
-    // If there is just a single closure and no type variables, it is selected.
-    var f = Param('f');
-    expect(
-        _TestClosureDeps(typeVars: [], closures: [f])
-            .planReconciliationStages(),
-        [
-          {f}
-        ]);
-  });
-
-  test('simple dependency', () {
-    // If f depends on g, then g is selected first, and then f.
-    var f = Param('f', argTypes: ['T']);
-    var g = Param('g', retTypes: ['T']);
-    expect(
-        _TestClosureDeps(typeVars: ['T'], closures: [f, g])
-            .planReconciliationStages(),
-        [
-          {g},
-          {f}
-        ]);
-  });
-
-  test('long chain', () {
-    // If f depends on g and g depends on h, then we do three separate stages:
-    // h, then g, then f.
-    var f = Param('f', argTypes: ['T']);
-    var g = Param('g', argTypes: ['U'], retTypes: ['T']);
-    var h = Param('h', retTypes: ['U']);
-    expect(
-        _TestClosureDeps(typeVars: ['T', 'U'], closures: [f, g, h])
-            .planReconciliationStages(),
-        [
-          {h},
-          {g},
-          {f}
-        ]);
-  });
-
-  test('unrelated closure', () {
-    // Closures that are independent of all the others are inferred during the
-    // first stage.
-    var f = Param('f', argTypes: ['T']);
-    var g = Param('g', retTypes: ['T']);
-    var h = Param('h');
-    expect(
-        _TestClosureDeps(typeVars: ['T', 'U'], closures: [f, g, h])
-            .planReconciliationStages(),
-        [
-          {g, h},
-          {f}
-        ]);
-  });
-
-  test('independent chains', () {
-    // If f depends on g, and h depends on i, then g and i are selected first,
-    // and then f and h.
-    var f = Param('f', argTypes: ['T']);
-    var g = Param('g', retTypes: ['T']);
-    var h = Param('h', argTypes: ['U']);
-    var i = Param('i', retTypes: ['U']);
-    expect(
-        _TestClosureDeps(typeVars: ['T', 'U'], closures: [f, g, h, i])
-            .planReconciliationStages(),
-        [
-          {g, i},
-          {f, h}
-        ]);
-  });
-
-  test('diamond', () {
-    // Test a diamond dependency shape: f depends on g and h; g and h both
-    // depend on i.
-    var f = Param('f', argTypes: ['T', 'U']);
-    var g = Param('g', argTypes: ['V'], retTypes: ['T']);
-    var h = Param('h', argTypes: ['V'], retTypes: ['U']);
-    var i = Param('i', retTypes: ['V']);
-    expect(
-        _TestClosureDeps(typeVars: ['T', 'U', 'V'], closures: [f, g, h, i])
-            .planReconciliationStages(),
-        [
-          {i},
-          {g, h},
-          {f}
-        ]);
-  });
-
-  test('cycle', () {
-    // A dependency cycle is inferred all at once.
-    var f = Param('f', argTypes: ['T']);
-    var g = Param('g', argTypes: ['U']);
-    var h = Param('h', argTypes: ['U'], retTypes: ['T']);
-    var i = Param('i', argTypes: ['T'], retTypes: ['U']);
-    expect(
-        _TestClosureDeps(typeVars: ['T', 'U'], closures: [f, g, h, i])
-            .planReconciliationStages(),
-        [
-          {h, i},
-          {f, g}
-        ]);
-  });
-
-  test('dependency on undeferred param', () {
-    var f = Param('f', argTypes: ['T']);
-    var x = Param('x', retTypes: ['T']);
-    expect(
-        _TestClosureDeps(typeVars: ['T'], closures: [f], undeferredParams: [x])
-            .planReconciliationStages(),
-        [
-          <Param>{},
-          {f}
-        ]);
-  });
-}
-
-class Param {
-  final String name;
-  final List<String> argTypes;
-  final List<String> retTypes;
-
-  Param(this.name, {this.argTypes = const [], this.retTypes = const []});
-
-  @override
-  String toString() => name;
-}
-
-class _TestClosureDeps extends ClosureDependencies<String, Param, Param> {
-  final List<String> typeVars;
-  final List<Param> closures;
-  final List<Param> undeferredParams;
-
-  _TestClosureDeps(
-      {required this.typeVars,
-      required this.closures,
-      this.undeferredParams = const []})
-      : super(closures, typeVars, undeferredParams);
-
-  @override
-  Set<String> typeVarsFreeInParamParams(Param closure) =>
-      closure.argTypes.toSet();
-
-  @override
-  Set<String> typeVarsFreeInParamReturns(Param closure) =>
-      closure.retTypes.toSet();
-}
diff --git a/pkg/_fe_analyzer_shared/test/deferred_function_literal_heuristic_test.dart b/pkg/_fe_analyzer_shared/test/deferred_function_literal_heuristic_test.dart
new file mode 100644
index 0000000..ad5434b
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/deferred_function_literal_heuristic_test.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/deferred_function_literal_heuristic.dart';
+import 'package:test/test.dart';
+
+main() {
+  test('single', () {
+    // If there is just a single function literal and no type variables, it is
+    // selected.
+    var f = Param('f');
+    expect(
+        _TestFunctionLiteralDeps(typeVars: [], functionLiterals: [f])
+            .planReconciliationStages(),
+        [
+          [f]
+        ]);
+  });
+
+  test('simple dependency', () {
+    // If f depends on g, then g is selected first, and then f.
+    var f = Param('f', argTypes: ['T']);
+    var g = Param('g', retTypes: ['T']);
+    expect(
+        _TestFunctionLiteralDeps(typeVars: ['T'], functionLiterals: [f, g])
+            .planReconciliationStages(),
+        [
+          [g],
+          [f]
+        ]);
+  });
+
+  test('long chain', () {
+    // If f depends on g and g depends on h, then we do three separate stages:
+    // h, then g, then f.
+    var f = Param('f', argTypes: ['T']);
+    var g = Param('g', argTypes: ['U'], retTypes: ['T']);
+    var h = Param('h', retTypes: ['U']);
+    expect(
+        _TestFunctionLiteralDeps(
+            typeVars: ['T', 'U'],
+            functionLiterals: [f, g, h]).planReconciliationStages(),
+        [
+          [h],
+          [g],
+          [f]
+        ]);
+  });
+
+  test('unrelated function literal', () {
+    // Function literals that are independent of all the others are inferred
+    // during the first stage.
+    var f = Param('f', argTypes: ['T']);
+    var g = Param('g', retTypes: ['T']);
+    var h = Param('h');
+    expect(
+        _TestFunctionLiteralDeps(
+            typeVars: ['T', 'U'],
+            functionLiterals: [f, g, h]).planReconciliationStages(),
+        [
+          [g, h],
+          [f]
+        ]);
+  });
+
+  test('independent chains', () {
+    // If f depends on g, and h depends on i, then g and i are selected first,
+    // and then f and h.
+    var f = Param('f', argTypes: ['T']);
+    var g = Param('g', retTypes: ['T']);
+    var h = Param('h', argTypes: ['U']);
+    var i = Param('i', retTypes: ['U']);
+    expect(
+        _TestFunctionLiteralDeps(
+            typeVars: ['T', 'U'],
+            functionLiterals: [f, g, h, i]).planReconciliationStages(),
+        [
+          [g, i],
+          [f, h]
+        ]);
+  });
+
+  test('diamond', () {
+    // Test a diamond dependency shape: f depends on g and h; g and h both
+    // depend on i.
+    var f = Param('f', argTypes: ['T', 'U']);
+    var g = Param('g', argTypes: ['V'], retTypes: ['T']);
+    var h = Param('h', argTypes: ['V'], retTypes: ['U']);
+    var i = Param('i', retTypes: ['V']);
+    expect(
+        _TestFunctionLiteralDeps(
+            typeVars: ['T', 'U', 'V'],
+            functionLiterals: [f, g, h, i]).planReconciliationStages(),
+        [
+          [i],
+          [g, h],
+          [f]
+        ]);
+  });
+
+  test('cycle', () {
+    // A dependency cycle is inferred all at once.
+    var f = Param('f', argTypes: ['T']);
+    var g = Param('g', argTypes: ['U']);
+    var h = Param('h', argTypes: ['U'], retTypes: ['T']);
+    var i = Param('i', argTypes: ['T'], retTypes: ['U']);
+    expect(
+        _TestFunctionLiteralDeps(
+            typeVars: ['T', 'U'],
+            functionLiterals: [f, g, h, i]).planReconciliationStages(),
+        [
+          [h, i],
+          [f, g]
+        ]);
+  });
+
+  test('dependency on undeferred param', () {
+    var f = Param('f', argTypes: ['T']);
+    var x = Param('x', retTypes: ['T']);
+    expect(
+        _TestFunctionLiteralDeps(
+            typeVars: ['T'],
+            functionLiterals: [f],
+            undeferredParams: [x]).planReconciliationStages(),
+        [
+          <Param>[],
+          [f]
+        ]);
+  });
+}
+
+class Param {
+  final String name;
+  final List<String> argTypes;
+  final List<String> retTypes;
+
+  Param(this.name, {this.argTypes = const [], this.retTypes = const []});
+
+  @override
+  String toString() => name;
+}
+
+class _TestFunctionLiteralDeps
+    extends FunctionLiteralDependencies<String, Param, Param> {
+  final List<String> typeVars;
+  final List<Param> functionLiterals;
+  final List<Param> undeferredParams;
+
+  _TestFunctionLiteralDeps(
+      {required this.typeVars,
+      required this.functionLiterals,
+      this.undeferredParams = const []})
+      : super(functionLiterals, typeVars, undeferredParams);
+
+  @override
+  Set<String> typeVarsFreeInParamParams(Param param) => param.argTypes.toSet();
+
+  @override
+  Set<String> typeVarsFreeInParamReturns(Param param) => param.retTypes.toSet();
+}
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index fdda3f2..5d8f3e7 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -1,4 +1,4 @@
-include: package:pedantic/analysis_options.1.9.0.yaml
+include: package:lints/recommended.yaml
 
 analyzer:
   language:
@@ -8,21 +8,26 @@
   errors:
     # Increase the severity of the unused_import hint.
     unused_import: warning
-    # TODO(srawlins): At the time of writing, 20 violations in lib/. The fix
-    # is not mechanical; each violation probably needs to be scrutinized.
-    unawaited_futures: ignore
+
+    # Lints from the recommended set that conflict w/ analyzer style or will
+    # require some work to reach compliance.
+    # See: https://github.com/dart-lang/sdk/issues/48785
+    avoid_renaming_method_parameters: ignore
+    camel_case_types: ignore
+    constant_identifier_names: ignore
+    file_names: ignore
+    hash_and_equals: ignore
+    implementation_imports: ignore
+    library_private_types_in_public_api: ignore
+    non_constant_identifier_names: ignore
+    overridden_fields: ignore
+    prefer_function_declarations_over_variables: ignore
+    # todo: add ignore to `protocol_generated.dart`
+    prefer_interpolation_to_compose_strings: ignore
+    prefer_void_to_null: ignore
+    provide_deprecation_message: ignore
 
 linter:
   rules:
-    - await_only_futures
-    - avoid_single_cascade_in_expression_statements
     - depend_on_referenced_packages
-    - empty_statements
-    - iterable_contains_unrelated_type
-    - list_remove_unrelated_type
-    - prefer_initializing_formals
-    - prefer_typing_uninitialized_variables
-    - unnecessary_brace_in_string_interps
-    - unnecessary_overrides
     - unnecessary_parenthesis
-    - void_checks
diff --git a/pkg/analysis_server/benchmark/integration/main.dart b/pkg/analysis_server/benchmark/integration/main.dart
index 07ce8bb..32908ae 100644
--- a/pkg/analysis_server/benchmark/integration/main.dart
+++ b/pkg/analysis_server/benchmark/integration/main.dart
@@ -61,7 +61,7 @@
 const VERBOSE_CMDLINE_OPTION = 'verbose';
 const VERY_VERBOSE_CMDLINE_OPTION = 'vv';
 
-late final ArgParser argParser = () {
+final ArgParser argParser = () {
   var argParser = ArgParser();
 
   argParser.addOption(INPUT_CMDLINE_OPTION,
diff --git a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
index d394ef0..501fb8d 100644
--- a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
+++ b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
@@ -95,9 +95,8 @@
       if (i + 1 < kGroupCount) {
         // mutate
         index = contents.indexOf(';', index);
-        contents = contents.substring(0, index + 1) +
-            ' ' +
-            contents.substring(index + 1);
+        contents =
+            '${contents.substring(0, index + 1)} ${contents.substring(index + 1)}';
         await test.updateFile(filePath, contents);
       }
     }
@@ -124,9 +123,8 @@
     for (var i = 0; i < kGroupCount; i++) {
       var startIndex = i * (contents.length ~/ (kGroupCount + 2));
       var index = contents.indexOf(';', startIndex);
-      contents = contents.substring(0, index + 1) +
-          ' ' +
-          contents.substring(index + 1);
+      contents =
+          '${contents.substring(0, index + 1)} ${contents.substring(index + 1)}';
       await test.updateFile(filePath, contents);
       await test.analysisFinished;
     }
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
index 8475456..d3218a8 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -7,6 +7,8 @@
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
 // ignore_for_file: annotate_overrides
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+// ignore_for_file: prefer_is_not_operator
 // ignore_for_file: unnecessary_parenthesis
 
 import 'dart:core' hide deprecated;
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 3222ce8..dfb5f9c 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -7,6 +7,8 @@
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
 // ignore_for_file: annotate_overrides
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+// ignore_for_file: prefer_is_not_operator
 // ignore_for_file: unnecessary_parenthesis
 
 import 'dart:core' hide deprecated;
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index 5e3a9c5..3f7c863 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -179,7 +179,7 @@
     parameter.appendToWithoutDelimiters(sb, withNullability: withNullability);
   }
   sb.write(closeOptionalString);
-  return '(' + sb.toString() + ')';
+  return '($sb)';
 }
 
 String? _getTypeParametersString(engine.Element element) {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index ef379b2..c248c2f 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -547,9 +547,9 @@
     priorityFiles.clear();
     priorityFiles.addAll(files);
     // Set priority files in drivers.
-    driverMap.values.forEach((driver) {
+    for (var driver in driverMap.values) {
       driver.priorityFiles = files;
-    });
+    }
   }
 
   @override
@@ -696,15 +696,15 @@
     var files = <String>{};
 
     if (analysis) {
-      analysisServices.values.forEach((serviceFiles) {
+      for (var serviceFiles in analysisServices.values) {
         files.addAll(serviceFiles);
-      });
+      }
     }
 
     if (flutter) {
-      flutterServices.values.forEach((serviceFiles) {
+      for (var serviceFiles in flutterServices.values) {
         files.addAll(serviceFiles);
-      });
+      }
     }
 
     for (var file in files) {
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index 955e547..390647f 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -62,7 +62,7 @@
   @override
   Future<Response> sendRequest(Request request) async {
     var id = request.id;
-    output.write(json.encode(request.toJson()) + '\n');
+    output.write('${json.encode(request.toJson())}\n');
     return await responseStream
         .firstWhere((Response response) => response.id == id);
   }
diff --git a/pkg/analysis_server/lib/src/cider/rename.dart b/pkg/analysis_server/lib/src/cider/rename.dart
index 84ef2e3..a306461 100644
--- a/pkg/analysis_server/lib/src/cider/rename.dart
+++ b/pkg/analysis_server/lib/src/cider/rename.dart
@@ -55,16 +55,16 @@
 
   FlutterWidgetState? _findFlutterStateClass(Element element, String newName) {
     if (Flutter.instance.isStatefulWidgetDeclaration(element)) {
-      var oldStateName = element.displayName + 'State';
+      var oldStateName = '${element.displayName}State';
       var library = element.library!;
       var state =
-          library.getType(oldStateName) ?? library.getType('_' + oldStateName);
+          library.getType(oldStateName) ?? library.getType('_$oldStateName');
       if (state != null) {
-        var flutterWidgetStateNewName = newName + 'State';
+        var flutterWidgetStateNewName = '${newName}State';
         // If the State was private, ensure that it stays private.
         if (state.name.startsWith('_') &&
             !flutterWidgetStateNewName.startsWith('_')) {
-          flutterWidgetStateNewName = '_' + flutterWidgetStateNewName;
+          flutterWidgetStateNewName = '_$flutterWidgetStateNewName';
         }
         return FlutterWidgetState(state, flutterWidgetStateNewName);
       }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 299f79a..aa3e93e 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -1014,7 +1014,7 @@
     if (type != null) {
       if (type.isDynamic && node.name.name == 'dynamic') {
         computer._addRegion_node(node, HighlightRegionType.TYPE_NAME_DYNAMIC);
-        return null;
+        return;
       }
     }
     super.visitNamedType(node);
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index 41e8088..eff224d 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -207,7 +207,7 @@
     }
     // setter
     if (_kinds.contains(ElementKind.SETTER)) {
-      member = classElement.lookUpSetter(_name + '=', _library);
+      member = classElement.lookUpSetter('$_name=', _library);
       if (member != null) {
         return member;
       }
diff --git a/pkg/analysis_server/lib/src/computer/computer_signature.dart b/pkg/analysis_server/lib/src/computer/computer_signature.dart
index 0e852c2..3adfbbe 100644
--- a/pkg/analysis_server/lib/src/computer/computer_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_signature.dart
@@ -18,10 +18,9 @@
   final AstNode? _node;
   late ArgumentList _argumentList;
   final bool _isNonNullableByDefault;
-  DartUnitSignatureComputer(
-      this._dartdocInfo, CompilationUnit _unit, int _offset)
-      : _node = NodeLocator(_offset).searchWithin(_unit),
-        _isNonNullableByDefault = _unit.isNonNullableByDefault;
+  DartUnitSignatureComputer(this._dartdocInfo, CompilationUnit unit, int offset)
+      : _node = NodeLocator(offset).searchWithin(unit),
+        _isNonNullableByDefault = unit.isNonNullableByDefault;
 
   /// The [ArgumentList] node located by [compute].
   ArgumentList get argumentList => _argumentList;
diff --git a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
index 3c3d68b..800ff38 100644
--- a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
@@ -24,11 +24,11 @@
   final bool _isNonNullableByDefault;
   DartTypeArgumentsSignatureComputer(
     this._dartdocInfo,
-    CompilationUnit _unit,
-    int _offset,
+    CompilationUnit unit,
+    int offset,
     this.preferredFormats,
-  )   : _node = NodeLocator(_offset).searchWithin(_unit),
-        _isNonNullableByDefault = _unit.isNonNullableByDefault;
+  )   : _node = NodeLocator(offset).searchWithin(unit),
+        _isNonNullableByDefault = unit.isNonNullableByDefault;
 
   /// The [TypeArgumentList] node located by [compute].
   TypeArgumentList get argumentList => _argumentList;
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 4fc64eb..257ef02 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -32,7 +32,7 @@
 
     var session = contextResult.session;
 
-    const codeMarker = '__code_\_';
+    const codeMarker = '__code__';
 
     // Insert the code being completed at the context offset.
     var changeBuilder = ChangeBuilder(session: session);
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 3210578..dd858f1 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -273,16 +273,16 @@
     _reset();
   }
 
-  void getRefactoring(Request _request, CancellationToken cancellationToken) {
+  void getRefactoring(Request request, CancellationToken cancellationToken) {
     // prepare for processing the request
-    request = _request;
+    this.request = request;
     final result = this.result = EditGetRefactoringResult(
         EMPTY_PROBLEM_LIST, EMPTY_PROBLEM_LIST, EMPTY_PROBLEM_LIST);
     // process the request
-    var params = EditGetRefactoringParams.fromRequest(_request);
+    var params = EditGetRefactoringParams.fromRequest(request);
     var file = params.file;
 
-    if (server.sendResponseErrorIfInvalidFilePath(_request, file)) {
+    if (server.sendResponseErrorIfInvalidFilePath(request, file)) {
       return;
     }
 
@@ -343,8 +343,8 @@
         cancel();
       } else {
         server.instrumentationService.logException(exception, stackTrace);
-        server.sendResponse(
-            Response.serverError(_request, exception, stackTrace));
+        server
+            .sendResponse(Response.serverError(request, exception, stackTrace));
       }
       _reset();
     });
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
index 7abcecb..c1ad910 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
@@ -141,9 +141,9 @@
         var serverError = newAnalysisError_fromEngine(result, error);
         var errorFixes = AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
-        fixes.forEach((fix) {
+        for (var fix in fixes) {
           errorFixes.fixes.add(fix.change);
-        });
+        }
       }
     }
     return errorFixesList;
@@ -190,9 +190,9 @@
             var serverError = newAnalysisError_fromEngine(result, error);
             var errorFixes = AnalysisErrorFixes(serverError);
             errorFixesList.add(errorFixes);
-            fixes.forEach((fix) {
+            for (var fix in fixes) {
               errorFixes.fixes.add(fix.change);
-            });
+            }
           }
         }
       }
@@ -230,9 +230,9 @@
         var serverError = newAnalysisError_fromEngine(result, error);
         var errorFixes = AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
-        fixes.forEach((fix) {
+        for (var fix in fixes) {
           errorFixes.fixes.add(fix.change);
-        });
+        }
       }
     }
     return errorFixesList;
@@ -278,9 +278,9 @@
         var serverError = newAnalysisError_fromEngine(result, error);
         var errorFixes = AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
-        fixes.forEach((fix) {
+        for (var fix in fixes) {
           errorFixes.fixes.add(fix.change);
-        });
+        }
       }
     }
     return errorFixesList;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index fd5c2d1..f922482 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -415,16 +415,17 @@
         // duplicates.
         final alreadyImportedSymbols = _buildLookupOfImportedSymbols(unit);
 
-        includedSuggestionSets.forEach((includedSet) {
+        for (var includedSet in includedSuggestionSets) {
           final library = declarationsTracker.getLibrary(includedSet.id);
           if (library == null) {
-            return;
+            break;
           }
 
           // Make a fast lookup for tag relevance.
           final tagBoosts = <String, int>{};
-          includedSuggestionRelevanceTags!
-              .forEach((t) => tagBoosts[t.tag] = t.relevanceBoost);
+          for (var t in includedSuggestionRelevanceTags) {
+            tagBoosts[t.tag] = t.relevanceBoost;
+          }
 
           // Only specific types of child declarations should be included.
           // This list matches what's in _protocolAvailableSuggestion in
@@ -493,7 +494,7 @@
                     completeFunctionCalls: completeFunctionCalls,
                   ));
           results.addAll(setResults);
-        });
+        }
       }
 
       // Add in any snippets.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
index ca28963..a5850a5 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
@@ -9,7 +9,7 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
-class ExitMessageHandler extends MessageHandler<Null, Null> {
+class ExitMessageHandler extends MessageHandler<void, void> {
   final bool clientDidCallShutdown;
 
   ExitMessageHandler(
@@ -21,10 +21,10 @@
   Method get handlesMessage => Method.exit;
 
   @override
-  LspJsonHandler<Null> get jsonHandler => NullJsonHandler;
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
 
   @override
-  Future<ErrorOr<Null>> handle(Null _, CancellationToken token) async {
+  Future<ErrorOr<void>> handle(void _, CancellationToken token) async {
     // Set a flag that the server shutdown is being controlled here to ensure
     // that the normal code that shuts down the server when the channel closes
     // does not fire.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
index 290bdc4..2c1d7b5 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -38,14 +38,14 @@
     // based only on the open files.
     if (!server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles) {
       if (workspaceFolders != null) {
-        workspaceFolders.forEach((wf) {
+        for (var wf in workspaceFolders) {
           final uri = Uri.parse(wf.uri);
           // Only file URIs are supported, but there's no way to signal this to
           // the LSP client (and certainly not before initialization).
           if (uri.isScheme('file')) {
             unnormalisedWorkspacePaths.add(uri.toFilePath());
           }
-        });
+        }
       }
       if (rootUri != null) {
         final uri = Uri.parse(rootUri);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
index 6e82230..67d2685 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
@@ -9,7 +9,7 @@
 
 /// A [MessageHandler] that rejects specific tpyes of messages with a given
 /// error code/message.
-class RejectMessageHandler extends MessageHandler<Object?, Null> {
+class RejectMessageHandler extends MessageHandler<Object?, void> {
   @override
   final Method handlesMessage;
   final ErrorCodes errorCode;
@@ -19,10 +19,10 @@
       : super(server);
 
   @override
-  LspJsonHandler<Null> get jsonHandler => NullJsonHandler;
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
 
   @override
-  ErrorOr<Null> handle(Object? _, CancellationToken token) {
+  ErrorOr<void> handle(Object? _, CancellationToken token) {
     return error(errorCode, errorMessage, null);
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
index df1ff6c..b226c29 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
@@ -8,16 +8,16 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
-class ShutdownMessageHandler extends MessageHandler<Null, Null> {
+class ShutdownMessageHandler extends MessageHandler<void, void> {
   ShutdownMessageHandler(LspAnalysisServer server) : super(server);
   @override
   Method get handlesMessage => Method.shutdown;
 
   @override
-  LspJsonHandler<Null> get jsonHandler => NullJsonHandler;
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
 
   @override
-  ErrorOr<Null> handle(void _, CancellationToken token) {
+  ErrorOr<void> handle(void _, CancellationToken token) {
     // Move to the Shutting Down state so we won't process any more
     // requests and the Exit notification will know it was a clean shutdown.
     server.messageHandler = ShuttingDownStateMessageHandler(server);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
index 8e5f7c6..079161a 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
@@ -23,13 +23,13 @@
       DidChangeTextDocumentParams.jsonHandler;
 
   @override
-  FutureOr<ErrorOr<Null>> handle(
+  FutureOr<ErrorOr<void>> handle(
       DidChangeTextDocumentParams params, CancellationToken token) {
     final path = pathOfDoc(params.textDocument);
     return path.mapResult((path) => _changeFile(path, params));
   }
 
-  FutureOr<ErrorOr<Null>> _changeFile(
+  FutureOr<ErrorOr<void>> _changeFile(
       String path, DidChangeTextDocumentParams params) {
     String? oldContents;
     if (server.resourceProvider.hasOverlay(path)) {
@@ -67,7 +67,7 @@
       DidCloseTextDocumentParams.jsonHandler;
 
   @override
-  FutureOr<ErrorOr<Null>> handle(
+  FutureOr<ErrorOr<void>> handle(
       DidCloseTextDocumentParams params, CancellationToken token) {
     final path = pathOfDoc(params.textDocument);
     return path.mapResult((path) async {
@@ -92,7 +92,7 @@
       DidOpenTextDocumentParams.jsonHandler;
 
   @override
-  FutureOr<ErrorOr<Null>> handle(
+  FutureOr<ErrorOr<void>> handle(
       DidOpenTextDocumentParams params, CancellationToken token) {
     final doc = params.textDocument;
     final path = pathOfDocItem(doc);
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 6674c4c..c2cc293 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -726,7 +726,9 @@
   }
 
   void _afterOverlayChanged(String path, plugin.HasToJson changeForPlugins) {
-    driverMap.values.forEach((driver) => driver.changeFile(path));
+    for (var driver in driverMap.values) {
+      driver.changeFile(path);
+    }
     pluginManager.setAnalysisUpdateContentParams(
       plugin.AnalysisUpdateContentParams({path: changeForPlugins}),
     );
@@ -795,9 +797,9 @@
 
   void _updateDriversAndPluginsPriorityFiles() {
     final priorityFilesList = priorityFiles.toList();
-    driverMap.values.forEach((driver) {
+    for (var driver in driverMap.values) {
       driver.priorityFiles = priorityFilesList;
-    });
+    }
 
     final pluginPriorities =
         plugin.AnalysisSetPriorityFilesParams(priorityFilesList);
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index fa6a104..3bbb8c3 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -367,8 +367,9 @@
       capabilities.completionItemKinds, declaration.kind);
 
   var relevanceBoost = 0;
-  declaration.relevanceTags
-      .forEach((t) => relevanceBoost = max(relevanceBoost, tagBoosts[t] ?? 0));
+  for (var t in declaration.relevanceTags) {
+    relevanceBoost = max(relevanceBoost, tagBoosts[t] ?? 0);
+  }
   final itemRelevance = includedSuggestionSet.relevance + relevanceBoost;
 
   // Because we potentially send thousands of these items, we should minimise
@@ -1305,17 +1306,13 @@
     label: outline.label,
     className: outline.className,
     variableName: outline.variableName,
-    attributes: attributes != null
-        ? attributes
-            .map((attribute) => toFlutterOutlineAttribute(lineInfo, attribute))
-            .toList()
-        : null,
+    attributes: attributes
+        ?.map((attribute) => toFlutterOutlineAttribute(lineInfo, attribute))
+        .toList(),
     dartElement: dartElement != null ? toElement(lineInfo, dartElement) : null,
     range: toRange(lineInfo, outline.offset, outline.length),
     codeRange: toRange(lineInfo, outline.codeOffset, outline.codeLength),
-    children: children != null
-        ? children.map((c) => toFlutterOutline(lineInfo, c)).toList()
-        : null,
+    children: children?.map((c) => toFlutterOutline(lineInfo, c)).toList(),
   );
 }
 
@@ -1402,9 +1399,7 @@
     element: toElement(lineInfo, outline.element),
     range: toRange(lineInfo, outline.offset, outline.length),
     codeRange: toRange(lineInfo, outline.codeOffset, outline.codeLength),
-    children: children != null
-        ? children.map((c) => toOutline(lineInfo, c)).toList()
-        : null,
+    children: children?.map((c) => toOutline(lineInfo, c)).toList(),
   );
 }
 
@@ -1458,10 +1453,10 @@
       params.add(positionalRequired.map(getParamLabel).join(', '));
     }
     if (positionalOptional.isNotEmpty) {
-      params.add('[' + positionalOptional.map(getParamLabel).join(', ') + ']');
+      params.add('[${positionalOptional.map(getParamLabel).join(', ')}]');
     }
     if (named.isNotEmpty) {
-      params.add('{' + named.map(getParamLabel).join(', ') + '}');
+      params.add('{${named.map(getParamLabel).join(', ')}}');
     }
     return '${resp.name}(${params.join(", ")})';
   }
diff --git a/pkg/analysis_server/lib/src/plugin/notification_manager.dart b/pkg/analysis_server/lib/src/plugin/notification_manager.dart
index b8de615..caaa088 100644
--- a/pkg/analysis_server/lib/src/plugin/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/notification_manager.dart
@@ -243,7 +243,7 @@
     Set<server.AnalysisService> services = HashSet<server.AnalysisService>();
     services.addAll(currentSubscriptions.keys);
     services.addAll(newSubscriptions.keys);
-    services.forEach((server.AnalysisService service) {
+    for (var service in services) {
       var collector = collectorFor(service);
       if (collector != null) {
         var currentPaths = currentSubscriptions[service];
@@ -254,29 +254,29 @@
             return;
           }
           // All of the [newPaths] need to be added.
-          newPaths.forEach((String filePath) {
+          for (var filePath in newPaths) {
             collector.startCollectingFor(filePath);
-          });
+          }
         } else if (newPaths == null) {
           // All of the [currentPaths] need to be removed.
-          currentPaths.forEach((String filePath) {
+          for (var filePath in currentPaths) {
             collector.stopCollectingFor(filePath);
-          });
+          }
         } else {
           // Compute the difference of the two sets.
-          newPaths.forEach((String filePath) {
+          for (var filePath in newPaths) {
             if (!currentPaths.contains(filePath)) {
               collector.startCollectingFor(filePath);
             }
-          });
-          currentPaths.forEach((String filePath) {
+          }
+          for (var filePath in currentPaths) {
             if (!newPaths.contains(filePath)) {
               collector.stopCollectingFor(filePath);
             }
-          });
+          }
         }
       }
-    });
+    }
     currentSubscriptions = newSubscriptions;
   }
 
diff --git a/pkg/analysis_server/lib/src/protocol/protocol_internal.dart b/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
index e84109e..a481ee2 100644
--- a/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
@@ -21,9 +21,9 @@
 /// are applied in the order they appear in [edits].  Access via
 /// SourceEdit.applySequence().
 String applySequenceOfEdits(String code, Iterable<SourceEdit> edits) {
-  edits.forEach((SourceEdit edit) {
+  for (var edit in edits) {
     code = edit.apply(code);
-  });
+  }
   return code;
 }
 
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 4877ec5..d555525 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -136,7 +136,7 @@
             .map((type) =>
                 type.getDisplayString(withNullability: _isNonNullableByDefault))
             .join(', ');
-        displayName = classElement.displayName + '<' + typeArgumentsStr + '>';
+        displayName = '${classElement.displayName}<$typeArgumentsStr>';
       }
       var memberElement = _findMemberElement(classElement);
       var memberElementDeclared = memberElement?.nonSynthetic;
@@ -164,15 +164,15 @@
       }
     }
     // mixins
-    classElement.mixins.forEach((InterfaceType type) {
+    for (var type in classElement.mixins) {
       var id = _createSuperItem(type.element, type.typeArguments);
       item.mixins.add(id);
-    });
+    }
     // interfaces
-    classElement.interfaces.forEach((InterfaceType type) {
+    for (var type in classElement.interfaces) {
       var id = _createSuperItem(type.element, type.typeArguments);
       item.interfaces.add(id);
-    });
+    }
     // done
     return itemId;
   }
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index ba94d24..5f05388 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -195,7 +195,7 @@
       analytics.setSessionValue('cd1', analysisServerOptions.clientVersion);
     }
 
-    var shouldSendCallback = () {
+    bool shouldSendCallback() {
       // Check sdkConfig to optionally force reporting on.
       if (sdkConfig.crashReportingForceEnabled == true) {
         return true;
@@ -203,7 +203,7 @@
 
       // TODO(devoncarew): Replace with a real enablement check.
       return false;
-    };
+    }
 
     // Crash reporting
 
@@ -216,7 +216,7 @@
       if (results.wasParsed(ANALYTICS_FLAG)) {
         analytics.enabled = results[ANALYTICS_FLAG] as bool;
         print(telemetry.createAnalyticsStatusMessage(analytics.enabled));
-        return null;
+        return;
       }
     }
 
@@ -234,7 +234,7 @@
 
     if (results[HELP_OPTION] as bool) {
       _printUsage(parser, analytics, fromHelp: true);
-      return null;
+      return;
     }
 
     final defaultSdkPath = _getSdkPath(results);
@@ -287,7 +287,7 @@
         print('');
         _printUsage(parser, analytics);
         exitCode = 1;
-        return null;
+        return;
       }
     }
 
@@ -335,7 +335,7 @@
       if (!FileSystemEntity.isDirectorySync(trainDirectory)) {
         print("Training directory '$trainDirectory' not found.\n");
         exitCode = 1;
-        return null;
+        return;
       }
     }
     //
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart b/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
index 8411094..9ceca57 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
@@ -180,7 +180,7 @@
       Element member) {
     var name = member.name;
     if (name == null) {
-      return null;
+      return;
     }
     cacheElement(dartdocDirectiveInfo, '$parentKey.$name', member);
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 94c4ede..66b007f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -1037,9 +1037,9 @@
   }
 
   void _addSuggestions(List<Keyword> keywords) {
-    keywords.forEach((Keyword keyword) {
+    for (var keyword in keywords) {
       _addSuggestion(keyword);
-    });
+    }
   }
 
   bool _isEntityAfterIfWithoutElse(AstNode node) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index aeb07b2..bf2dee5 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -1295,7 +1295,7 @@
 
     if (prefix != null) {
       completion ??= elementData.completion;
-      completion = prefix + '.' + completion;
+      completion = '$prefix.$completion';
     }
 
     return CompletionSuggestionBuilderImpl(
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 279afd7..ebab076 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -208,7 +208,7 @@
   if (type.isDynamic) {
     return '';
   } else {
-    return type.getDisplayString(withNullability: withNullability) + ' ';
+    return '${type.getDisplayString(withNullability: withNullability)} ';
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index 1de638f..b86c7e0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
@@ -77,7 +77,7 @@
       for (var varName in variableNameSuggestions) {
         _createNameSuggestion(builder, varName);
         if (doIncludePrivateVersion) {
-          _createNameSuggestion(builder, '_' + varName);
+          _createNameSuggestion(builder, '_$varName');
         }
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index 2da4819..076cc4f 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -312,7 +312,7 @@
           var loc = expr.offset + src.length;
           if (src.contains(eol)) {
             var indent = utils.getNodePrefix(node);
-            _addInsertEdit(loc, ',' + eol + indent + ']');
+            _addInsertEdit(loc, ',$eol$indent]');
           } else {
             _addInsertEdit(loc, ']');
           }
@@ -1183,8 +1183,9 @@
     assert(exitPosition != null);
     change.selection = exitPosition;
     change.message = formatList(kind.message, args);
-    linkedPositionGroups.values
-        .forEach((group) => change.addLinkedEditGroup(group));
+    for (var group in linkedPositionGroups.values) {
+      change.addLinkedEditGroup(group);
+    }
     completion = StatementCompletion(kind, change);
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index efb33d2..79ac1aa 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -174,7 +174,7 @@
         }
       }
       if (propertiesBuilderName == null) {
-        return null;
+        return;
       }
 
       final final_propertiesBuilderName = propertiesBuilderName;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
index fecc01d..82c63b7 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_return_type.dart
@@ -69,7 +69,7 @@
 
     var returnType = _inferReturnType(body);
     if (returnType == null) {
-      return null;
+      return;
     }
 
     final insertBeforeEntity_final = insertBeforeEntity;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_add_all_to_spread.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_add_all_to_spread.dart
index 0d3aa94..23a4405 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_add_all_to_spread.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_add_all_to_spread.dart
@@ -107,7 +107,7 @@
         // TODO(brianwilkerson) Consider adding a cleanup for the empty list
         //  case. We can essentially remove the whole invocation because it does
         //  nothing.
-        return null;
+        return;
       }
       var startOffset = elements.first.offset;
       var endOffset = elements.last.end;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_conditional_expression_to_if_element.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_conditional_expression_to_if_element.dart
index b686773..656ff6b3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_conditional_expression_to_if_element.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_conditional_expression_to_if_element.dart
@@ -31,7 +31,7 @@
   Future<void> compute(ChangeBuilder builder) async {
     var conditional = node.thisOrAncestorOfType<ConditionalExpression>();
     if (conditional == null) {
-      return null;
+      return;
     }
 
     AstNode nodeToReplace = conditional;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_documentation_into_line.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_documentation_into_line.dart
index 659f521..64e21d8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_documentation_into_line.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_documentation_into_line.dart
@@ -34,11 +34,11 @@
     if (comment == null ||
         !comment.isDocumentation ||
         comment.tokens.length != 1) {
-      return null;
+      return;
     }
     var token = comment.tokens.first;
     if (token.type != TokenType.MULTI_LINE_COMMENT) {
-      return null;
+      return;
     }
     var text = token.lexeme;
     var lines = text.split(eol);
@@ -51,7 +51,7 @@
         firstLine = false;
         var expectedPrefix = '/**';
         if (!line.startsWith(expectedPrefix)) {
-          return null;
+          return;
         }
         line = line.substring(expectedPrefix.length).trim();
         if (line.isNotEmpty) {
@@ -59,12 +59,12 @@
           linePrefix = eol + prefix;
         }
       } else {
-        if (line.startsWith(prefix + ' */')) {
+        if (line.startsWith('$prefix */')) {
           break;
         }
-        var expectedPrefix = prefix + ' *';
+        var expectedPrefix = '$prefix *';
         if (!line.startsWith(expectedPrefix)) {
-          return null;
+          return;
         }
         line = line.substring(expectedPrefix.length);
         if (line.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
index c16bfeb..26e9f45 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
@@ -74,11 +74,11 @@
       var returnType = getter.returnType;
       var code = 'final';
       if (returnType != null) {
-        code += ' ' + utils.getNodeText(returnType);
+        code += ' ${utils.getNodeText(returnType)}';
       }
-      code += ' ' + utils.getNodeText(getter.name);
+      code += ' ${utils.getNodeText(getter.name)}';
       if (expression is! NullLiteral) {
-        code += ' = ' + utils.getNodeText(expression);
+        code += ' = ${utils.getNodeText(expression)}';
       }
       code += ';';
       var replacementRange =
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart
index bb9bebd..6677e5f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_getter.dart
@@ -51,11 +51,11 @@
     var code = '';
     var typeAnnotation = fieldList.type;
     if (typeAnnotation != null) {
-      code += utils.getNodeText(typeAnnotation) + ' ';
+      code += '${utils.getNodeText(typeAnnotation)} ';
     }
     code += 'get';
-    code += ' ' + utils.getNodeText(field.name);
-    code += ' => ' + utils.getNodeText(initializer);
+    code += ' ${utils.getNodeText(field.name)}';
+    code += ' => ${utils.getNodeText(initializer)}';
     code += ';';
     var replacementRange = range.startEnd(finalKeyword, fieldDeclaration);
     await builder.addDartFileEdit(file, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
index 4039211..68c1434 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
@@ -36,20 +36,20 @@
     //
     var creation = node.thisOrAncestorOfType<InstanceCreationExpression>();
     if (creation == null) {
-      return null;
+      return;
     }
     var element = creation.constructorName.staticElement;
     if (element == null ||
         element.name != 'fromIterable' ||
         element.enclosingElement != typeProvider.mapElement) {
-      return null;
+      return;
     }
     //
     // Ensure that the arguments have the right form.
     //
     var arguments = creation.argumentList.arguments;
     if (arguments.length != 3) {
-      return null;
+      return;
     }
     var iterator = arguments[0].unParenthesized;
     var secondArg = arguments[1];
@@ -60,7 +60,7 @@
     var valueClosure = _extractClosure('value', thirdArg) ??
         _extractClosure('value', secondArg);
     if (keyClosure == null || valueClosure == null) {
-      return null;
+      return;
     }
     //
     // Compute the loop variable name and convert the key and value closures if
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_function_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_function_declaration.dart
index 8f8cbc3..9266180 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_function_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_function_declaration.dart
@@ -84,7 +84,7 @@
             replacement += '$keyword ';
           }
           if (type != null) {
-            replacement += utils.getNodeText(type) + ' ';
+            replacement += '${utils.getNodeText(type)} ';
           }
           replaceWithNewLine(r, after: replacement);
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
index e899a17..1cc03ee 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
@@ -40,7 +40,7 @@
       } else if (node is FormalParameterList) {
         // It would be confusing for this assist to alter a surrounding context
         // when the selection is inside a parameter list.
-        return null;
+        return;
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_class.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_class.dart
index 95dc29b..00cbb7d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_class.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_class.dart
@@ -81,8 +81,8 @@
             try {
               offset = targetSource.contents.data.length;
               filePath = targetSource.fullName;
-              prefix = '$eol';
-              suffix = '$eol';
+              prefix = eol;
+              suffix = eol;
             } on FileSystemException {
               // If we can't read the file to get the offset, then we can't
               // create a fix.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
index ba94cc0..9eb4968 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
@@ -129,7 +129,7 @@
     var insertOffset = unit.end;
     // prepare prefix
     var prefix = '';
-    var sourcePrefix = '$eol';
+    var sourcePrefix = eol;
     var sourceSuffix = eol;
     await _createExecutable(builder, functionType, name, file, insertOffset,
         false, prefix, sourcePrefix, sourceSuffix, unit.declaredElement!);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
index 1bbc953..01698d0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
@@ -80,8 +80,8 @@
                 offset = targetSource.contents.data.length;
                 filePath = targetSource.fullName;
               }
-              prefix = '$eol';
-              suffix = '$eol';
+              prefix = eol;
+              suffix = eol;
             } on FileSystemException {
               // If we can't read the file to get the offset, then we can't
               // create a fix.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
index a714bcd..b9c9d5c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
@@ -87,7 +87,7 @@
         var typeCode = '';
         var typeAnnotation = variableList.type;
         if (typeAnnotation != null) {
-          typeCode = utils.getNodeText(typeAnnotation) + ' ';
+          typeCode = '${utils.getNodeText(typeAnnotation)} ';
         }
 
         // Write getter.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
index 9e95655..c624414e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
@@ -29,7 +29,7 @@
             utils.getRangeText(range.startStart(parent, parentArgs));
 
         var parentIndent = utils.getLinePrefix(parent.offset);
-        var childIndent = parentIndent + '  ';
+        var childIndent = '$parentIndent  ';
 
         // Write the beginning of the child.
         builder.write(childText);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
index 72b790f..bd3fe0c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
@@ -44,7 +44,7 @@
         // Linked editing not needed since arg is always a list.
         builder.write('children: ');
         builder.write(literalSrc.replaceAll(
-            RegExp('^$indentOld', multiLine: true), '$indentList'));
+            RegExp('^$indentOld', multiLine: true), indentList));
         builder.write(',');
         builder.write(eol);
         builder.write(indentArg);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
index 215b32e..c752866 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
@@ -59,11 +59,11 @@
         var elseSrc = utils.getNodeText(conditional.elseExpression);
         var name = utils.getNodeText(leftSide);
         var src = '';
-        src += 'if ($conditionSrc) {' + eol;
-        src += prefix + indent + '$name = $thenSrc;' + eol;
-        src += prefix + '} else {' + eol;
-        src += prefix + indent + '$name = $elseSrc;' + eol;
-        src += prefix + '}';
+        src += 'if ($conditionSrc) {$eol';
+        src += '$prefix$indent$name = $thenSrc;$eol';
+        src += '$prefix} else {$eol';
+        src += '$prefix$indent$name = $elseSrc;$eol';
+        src += '$prefix}';
         builder.addSimpleReplacement(range.node(statement), src);
       });
     }
@@ -83,11 +83,11 @@
         var thenSrc = utils.getNodeText(conditional.thenExpression);
         var elseSrc = utils.getNodeText(conditional.elseExpression);
         var src = '';
-        src += 'if ($conditionSrc) {' + eol;
-        src += prefix + indent + 'return $thenSrc;' + eol;
-        src += prefix + '} else {' + eol;
-        src += prefix + indent + 'return $elseSrc;' + eol;
-        src += prefix + '}';
+        src += 'if ($conditionSrc) {$eol';
+        src += '$prefix${indent}return $thenSrc;$eol';
+        src += '$prefix} else {$eol';
+        src += '$prefix${indent}return $elseSrc;$eol';
+        src += '$prefix}';
         builder.addSimpleReplacement(range.node(statement), src);
       });
     }
@@ -126,11 +126,11 @@
           var elseSrc = utils.getNodeText(conditional.elseExpression);
           var name = variable.name.name;
           var src = eol;
-          src += prefix + 'if ($conditionSrc) {' + eol;
-          src += prefix + indent + '$name = $thenSrc;' + eol;
-          src += prefix + '} else {' + eol;
-          src += prefix + indent + '$name = $elseSrc;' + eol;
-          src += prefix + '}';
+          src += '${prefix}if ($conditionSrc) {$eol';
+          src += '$prefix$indent$name = $thenSrc;$eol';
+          src += '$prefix} else {$eol';
+          src += '$prefix$indent$name = $elseSrc;$eol';
+          src += '$prefix}';
           builder.addSimpleReplacement(range.endLength(statement, 0), src);
         });
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.dart
index 17a4ab6..c6cba84 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.dart
@@ -40,7 +40,7 @@
     if (value == null) {
       return;
     }
-    _replacement = '0x' + value.toRadixString(16).padLeft(8, '0');
+    _replacement = '0x${value.toRadixString(16).padLeft(8, '0')}';
     //
     // Build the edit.
     //
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
index 8233e82..98ddb5b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
@@ -65,7 +65,7 @@
 
       var indent = utils.getNodePrefix(statement);
       var name = variable.name.name;
-      builder.addSimpleInsertion(variable.name.end, ';' + eol + indent + name);
+      builder.addSimpleInsertion(variable.name.end, ';$eol$indent$name');
     });
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart
index 7a08f4c..ac592ae 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart
@@ -61,7 +61,7 @@
 
   Future<void> _doStatement(ChangeBuilder builder, DoStatement node) async {
     var body = node.body;
-    if (body is Block) return null;
+    if (body is Block) return;
 
     var prefix = utils.getLinePrefix(node.offset);
     var indent = prefix + utils.getIndent(1);
@@ -80,7 +80,7 @@
 
   Future<void> _forStatement(ChangeBuilder builder, ForStatement node) async {
     var body = node.body;
-    if (body is Block) return null;
+    if (body is Block) return;
 
     var prefix = utils.getLinePrefix(node.offset);
     var indent = prefix + utils.getIndent(1);
@@ -135,7 +135,7 @@
   Future<void> _whileStatement(
       ChangeBuilder builder, WhileStatement node) async {
     var body = node.body;
-    if (body is Block) return null;
+    if (body is Block) return;
 
     var prefix = utils.getLinePrefix(node.offset);
     var indent = prefix + utils.getIndent(1);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index 29913b3..c3ea6b4 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -812,7 +812,7 @@
     var parameterSpecKey = _singleKey(node, const [_nameKey, _indexKey], node);
     if (parameterSpecKey == null) {
       // The error has already been reported.
-      return null;
+      return;
     }
     ParameterReference reference;
     if (parameterSpecKey == _indexKey) {
@@ -820,7 +820,7 @@
           ErrorContext(key: _indexKey, parentNode: node));
       if (index == null) {
         // The error has already been reported.
-        return null;
+        return;
       }
       reference = PositionalParameterReference(index);
     } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
index 8f0e934..22b0bf9 100644
--- a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
+++ b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
@@ -61,7 +61,7 @@
   // cost array, horizontally
   var d = List<int>.filled(s_len + 1, 0);
   // placeholder to assist in swapping p and d
-  List<int> _d;
+  List<int> holder;
 
   // fill in starting table values
   var boundary = math.min(s_len, threshold) + 1;
@@ -106,9 +106,9 @@
     }
 
     // copy current distance counts to 'previous row' distance counts
-    _d = p;
+    holder = p;
     p = d;
-    d = _d;
+    d = holder;
   }
 
   // if p[n] is greater than the threshold,
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index bdb7b99..fd87a5d 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -1021,7 +1021,7 @@
 
     var lastConstant = enumDeclaration.constants.last;
     return ClassMemberLocation(
-      ';' + endOfLine + endOfLine + indent,
+      ';$endOfLine$endOfLine$indent',
       lastConstant.end,
       '',
     );
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index e70ddb4..4b72c5e 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -31,7 +31,7 @@
   var name = element.enclosingElement.name;
   var constructorName = element.name;
   if (constructorName.isNotEmpty) {
-    name = name + '.' + constructorName;
+    name = '$name.$constructorName';
   }
   return name;
 }
diff --git a/pkg/analysis_server/lib/src/services/kythe/schema.dart b/pkg/analysis_server/lib/src/services/kythe/schema.dart
index 3016742..c646373 100644
--- a/pkg/analysis_server/lib/src/services/kythe/schema.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/schema.dart
@@ -65,18 +65,18 @@
 const EDGE_PREFIX = '/kythe/edge/';
 
 /// Kythe edge kinds
-const ANNOTATED_BY_EDGE = EDGE_PREFIX + 'annotatedby';
-const CHILD_OF_EDGE = EDGE_PREFIX + 'childof';
-const EXTENDS_EDGE = EDGE_PREFIX + 'extends';
-const INSTANTIATES_EDGE = EDGE_PREFIX + 'instantiates';
-const OVERRIDES_EDGE = EDGE_PREFIX + 'overrides';
-const PARAM_EDGE = EDGE_PREFIX + 'param';
-const TYPED_EDGE = EDGE_PREFIX + 'typed';
+const ANNOTATED_BY_EDGE = '${EDGE_PREFIX}annotatedby';
+const CHILD_OF_EDGE = '${EDGE_PREFIX}childof';
+const EXTENDS_EDGE = '${EDGE_PREFIX}extends';
+const INSTANTIATES_EDGE = '${EDGE_PREFIX}instantiates';
+const OVERRIDES_EDGE = '${EDGE_PREFIX}overrides';
+const PARAM_EDGE = '${EDGE_PREFIX}param';
+const TYPED_EDGE = '${EDGE_PREFIX}typed';
 
 /// Kythe edge kinds associated with anchors
-const DEFINES_EDGE = EDGE_PREFIX + 'defines';
-const DEFINES_BINDING_EDGE = EDGE_PREFIX + 'defines/binding';
-const DOCUMENTS_EDGE = EDGE_PREFIX + 'documents';
-const REF_EDGE = EDGE_PREFIX + 'ref';
-const REF_CALL_EDGE = EDGE_PREFIX + 'ref/call';
-const REF_IMPORTS_EDGE = EDGE_PREFIX + 'ref/imports';
+const DEFINES_EDGE = '${EDGE_PREFIX}defines';
+const DEFINES_BINDING_EDGE = '${EDGE_PREFIX}defines/binding';
+const DOCUMENTS_EDGE = '${EDGE_PREFIX}documents';
+const REF_EDGE = '${EDGE_PREFIX}ref';
+const REF_CALL_EDGE = '${EDGE_PREFIX}ref/call';
+const REF_IMPORTS_EDGE = '${EDGE_PREFIX}ref/imports';
diff --git a/pkg/analysis_server/lib/src/services/pub/pub_command.dart b/pkg/analysis_server/lib/src/services/pub/pub_command.dart
index 234d5ee..1c4e758 100644
--- a/pkg/analysis_server/lib/src/services/pub/pub_command.dart
+++ b/pkg/analysis_server/lib/src/services/pub/pub_command.dart
@@ -43,11 +43,11 @@
   PubCommand(this._instrumentationService, this._processRunner) {
     // When calling the `pub` command, we must add an identifier to the
     // PUB_ENVIRONMENT environment variable (joined with colons).
-    const _pubEnvString = 'analysis_server.pub_api';
+    const pubEnvString = 'analysis_server.pub_api';
     final existingPubEnv = Platform.environment[_pubEnvironmentKey];
     _pubEnvironmentValue = [
       if (existingPubEnv?.isNotEmpty ?? false) existingPubEnv,
-      _pubEnvString,
+      pubEnvString,
     ].join(':');
   }
 
@@ -86,10 +86,10 @@
 
   /// Terminates any in-process commands with [ProcessSignal.sigterm].
   void shutdown() {
-    _activeProcesses.forEach((process) {
+    for (var process in _activeProcesses) {
       _instrumentationService.logInfo('Terminating process ${process.pid}');
       process.kill();
-    });
+    }
   }
 
   /// Runs a pub command and decodes JSON from `stdout`.
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 4afc45f..5867145 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -177,21 +177,18 @@
         var indent = utils.getIndent(1);
         var expr = target.expression;
         {
-          var code = '{' + eol + prefix + indent;
+          var code = '{$eol$prefix$indent';
           addPosition(
               target.offset + code.length + nameOffsetInDeclarationCode);
           code += declarationCode + eol;
-          code += prefix + indent + 'return ';
+          code += '$prefix${indent}return ';
           var edit =
               SourceEdit(target.offset, expr.offset - target.offset, code);
           occurrencesShift = target.offset + code.length - expr.offset;
           doSourceChange_addElementEdit(change, unitElement, edit);
         }
-        doSourceChange_addElementEdit(
-            change,
-            unitElement,
-            SourceEdit(
-                expr.end, target.end - expr.end, ';' + eol + prefix + '}'));
+        doSourceChange_addElementEdit(change, unitElement,
+            SourceEdit(expr.end, target.end - expr.end, ';$eol$prefix}'));
       }
     }
     // prepare replacement
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index b33e29a..cbdcd00 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -364,7 +364,7 @@
         // statements
         if (_selectionStatements != null) {
           if (returnType.isNotEmpty) {
-            annotations += returnType + ' ';
+            annotations += '$returnType ';
           }
           declarationSource = '$annotations$signature$asyncKeyword {$eol';
           declarationSource += returnExpressionSource;
@@ -613,7 +613,7 @@
       if (parameterType is FunctionType) {
         var typeCode = _getTypeCode(parameterType.returnType);
         if (typeCode != 'dynamic') {
-          return typeCode + ' ';
+          return '$typeCode ';
         }
       }
     }
@@ -653,7 +653,7 @@
     final selectionStatements = _selectionStatements;
     if (selectionStatements != null) {
       var selectionIndent = utils.getNodePrefix(selectionStatements[0]);
-      var targetIndent = utils.getNodePrefix(_parentMember!) + '  ';
+      var targetIndent = '${utils.getNodePrefix(_parentMember!)}  ';
       source = utils.replaceSourceIndent(source, selectionIndent, targetIndent);
     }
     // done
@@ -682,9 +682,9 @@
     if (_selectionExpression != null) {
       _selectionExpression!.accept(visitor);
     } else if (_selectionStatements != null) {
-      _selectionStatements!.forEach((statement) {
+      for (var statement in _selectionStatements!) {
         statement.accept(visitor);
-      });
+      }
     }
     _hasAwait = visitor.result;
   }
@@ -735,9 +735,9 @@
     if (selectionStatements != null) {
       var typeSystem = resolveResult.typeSystem;
       var returnTypeComputer = _ReturnTypeComputer(typeSystem);
-      selectionStatements.forEach((statement) {
+      for (var statement in selectionStatements) {
         statement.accept(returnTypeComputer);
-      });
+      }
       _returnType = returnTypeComputer.returnType;
     }
     // maybe single variable to return
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 6fe4778..d807a1d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -650,9 +650,10 @@
   bool _isMemberOfEnclosingClass(Element element) {
     final enclosingClass = this.enclosingClass;
     if (enclosingClass != null) {
-      final enclosingClasses = this.enclosingClasses ??= <ClassElement>[]
-        ..add(enclosingClass)
-        ..addAll(enclosingClass.allSupertypes.map((t) => t.element));
+      final enclosingClasses = this.enclosingClasses ??= <ClassElement>[
+        enclosingClass,
+        ...enclosingClass.allSupertypes.map((t) => t.element)
+      ];
       return enclosingClasses.contains(element.enclosingElement);
     }
     return false;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 8a99365..00cd08f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -98,7 +98,7 @@
   part._implicitClassNameOffsets.forEach((String className, List<int> offsets) {
     for (var offset in offsets) {
 //      edits.add(newSourceEdit_range(range, className + '.'));
-      edits.add(SourceEdit(offset, 0, className + '.'));
+      edits.add(SourceEdit(offset, 0, '$className.'));
     }
   });
   // replace "this" references with invocation target
@@ -765,7 +765,7 @@
   void visitNode(AstNode node) {
     var nodeRange = range.node(node);
     if (!bodyRange.intersects(nodeRange)) {
-      return null;
+      return;
     }
     super.visitNode(node);
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index c8cd8e6..bdb68b6 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -130,11 +130,11 @@
           if (partOfs.isNotEmpty) {
             await changeBuilder.addDartFileEdit(
                 result.unit.declaredElement!.source.fullName, (builder) {
-              partOfs.forEach((uri) {
+              for (var uri in partOfs) {
                 var newUri = _getRelativeUri(newPath, oldDir);
                 builder.addSimpleReplacement(
                     SourceRange(uri.offset, uri.length), "'$newUri'");
-              });
+              }
             });
           }
         }
@@ -159,12 +159,12 @@
 
       if (partOfs.isNotEmpty) {
         await changeBuilder.addDartFileEdit(element.source.fullName, (builder) {
-          partOfs.forEach((uri) {
+          for (var uri in partOfs) {
             var oldLocation = pathContext.join(oldDir, uri.stringValue);
             var newUri = _getRelativeUri(oldLocation, newDir);
             builder.addSimpleReplacement(
                 SourceRange(uri.offset, uri.length), "'$newUri'");
-          });
+          }
         });
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index 113f8d8..91d1722 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -142,21 +142,21 @@
 
   void _findFlutterStateClass() {
     if (Flutter.instance.isStatefulWidgetDeclaration(element)) {
-      var oldStateName = oldName + 'State';
+      var oldStateName = '${oldName}State';
       var library = element.library!;
       _flutterWidgetState =
-          library.getType(oldStateName) ?? library.getType('_' + oldStateName);
+          library.getType(oldStateName) ?? library.getType('_$oldStateName');
     }
   }
 
   void _updateFlutterWidgetStateName() {
     final flutterWidgetState = _flutterWidgetState;
     if (flutterWidgetState != null) {
-      var flutterWidgetStateNewName = newName + 'State';
+      var flutterWidgetStateNewName = '${newName}State';
       // If the State was private, ensure that it stays private.
       if (flutterWidgetState.name.startsWith('_') &&
           !flutterWidgetStateNewName.startsWith('_')) {
-        flutterWidgetStateNewName = '_' + flutterWidgetStateNewName;
+        flutterWidgetStateNewName = '_$flutterWidgetStateNewName';
       }
       _flutterWidgetStateNewName = flutterWidgetStateNewName;
     }
diff --git a/pkg/analysis_server/lib/src/status/ast_writer.dart b/pkg/analysis_server/lib/src/status/ast_writer.dart
index d3917ce..b9f610a 100644
--- a/pkg/analysis_server/lib/src/status/ast_writer.dart
+++ b/pkg/analysis_server/lib/src/status/ast_writer.dart
@@ -157,7 +157,7 @@
       if (name == null) {
         return node.returnType.name;
       } else {
-        return node.returnType.name + '.' + name.name;
+        return '${node.returnType.name}.${name.name}';
       }
     } else if (node is ConstructorName) {
       return node.toSource();
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 4cb6d42..7132231 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -107,7 +107,7 @@
         builder.addSimpleInsertion(listLoc, '[');
       }
       var newChildArgSrc = childArgSrc.replaceAll(
-          RegExp('^$indentOld', multiLine: true), '$indentNew');
+          RegExp('^$indentOld', multiLine: true), indentNew);
       newChildArgSrc = '$prefix$newChildArgSrc,$eol$indentOld]';
       builder.addSimpleReplacement(rangeNode(childArg), newChildArgSrc);
     }
diff --git a/pkg/analysis_server/lib/src/utilities/mocks.dart b/pkg/analysis_server/lib/src/utilities/mocks.dart
index 494b98c..d51c9a5 100644
--- a/pkg/analysis_server/lib/src/utilities/mocks.dart
+++ b/pkg/analysis_server/lib/src/utilities/mocks.dart
@@ -229,7 +229,7 @@
   @override
   Future<void> restartPlugins() async {
     // Nothing to restart.
-    return null;
+    return;
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/utilities/stream.dart b/pkg/analysis_server/lib/src/utilities/stream.dart
index 5ac8669..868dd67 100644
--- a/pkg/analysis_server/lib/src/utilities/stream.dart
+++ b/pkg/analysis_server/lib/src/utilities/stream.dart
@@ -30,21 +30,21 @@
         }
         var local_onPause = onPause;
         if (local_onPause != null) {
-          pauseData = local_onPause(listenData!);
+          pauseData = local_onPause(listenData as ListenData);
         }
       },
       onResume: () {
         var local_onResume = onResume;
         if (local_onResume != null) {
-          var local_pauseData = pauseData!;
+          var local_pauseData = pauseData as PauseData;
           pauseData = null;
-          local_onResume(listenData!, local_pauseData);
+          local_onResume(listenData as ListenData, local_pauseData);
         }
       },
       onCancel: () {
         var local_onCancel = onCancel;
         if (local_onCancel != null) {
-          var local_listenData = listenData!;
+          var local_listenData = listenData as ListenData;
           listenData = null;
           local_onCancel(local_listenData);
         }
diff --git a/pkg/analysis_server/lib/src/utilities/strings.dart b/pkg/analysis_server/lib/src/utilities/strings.dart
index e13bfae..7ad635a 100644
--- a/pkg/analysis_server/lib/src/utilities/strings.dart
+++ b/pkg/analysis_server/lib/src/utilities/strings.dart
@@ -159,9 +159,7 @@
   if (text.length > limit) {
     var headLength = limit ~/ 2 - 1;
     var tailLength = limit - headLength - 3;
-    return text.substring(0, headLength) +
-        '...' +
-        text.substring(text.length - tailLength);
+    return '${text.substring(0, headLength)}...${text.substring(text.length - tailLength)}';
   }
   return text;
 }
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index e1680a0..20795bf 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -33,9 +33,9 @@
 dev_dependencies:
   analyzer_utilities:
     path: ../analyzer_utilities
+  lints: ^2.0.0
   logging: any
   matcher: any
-  pedantic: ^1.9.0
   test_reflective_loader: any
 
 dependency_overrides:
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index b657168..f4b8b23 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -140,7 +140,7 @@
     for (var region in regions) {
       var offset = region.offset;
       if (offset < lastEnd) {
-        fail('$lastEnd was expected to be > $offset in\n' + regions.join('\n'));
+        fail('$lastEnd was expected to be > $offset in\n${regions.join('\n')}');
       }
       lastEnd = offset + region.length;
     }
diff --git a/pkg/analysis_server/test/client/impl/expect_mixin.dart b/pkg/analysis_server/test/client/impl/expect_mixin.dart
index 67cdc1c..295bfd5 100644
--- a/pkg/analysis_server/test/client/impl/expect_mixin.dart
+++ b/pkg/analysis_server/test/client/impl/expect_mixin.dart
@@ -27,7 +27,7 @@
     } else if (x is _Predicate<Object>) {
       // x is already a predicate that can handle anything
       return predicate(x);
-    } else if (x is _Predicate<Null>) {
+    } else if (x is _Predicate<void>) {
       // x is a unary predicate, but expects a specific type
       // so wrap it.
       return predicate((a) => (x as dynamic)(a) as bool);
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index 894f8d4..e031aa1 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -2130,9 +2130,9 @@
 !4part 'x';''',
         <String>[
           '1+library',
-          "2+import \'\';",
-          "3+export \'\';",
-          "4+part \'\';",
+          "2+import '';",
+          "3+export '';",
+          "4+part '';",
           '5+as',
           '6+hide',
           '7+show',
diff --git a/pkg/analysis_server/test/completion_test_support.dart b/pkg/analysis_server/test/completion_test_support.dart
index de59784..7de6d30 100644
--- a/pkg/analysis_server/test/completion_test_support.dart
+++ b/pkg/analysis_server/test/completion_test_support.dart
@@ -154,11 +154,11 @@
           modifiedSource.substring(index + n);
     }
     if (modifiedSource == originalSource) {
-      throw StateError('No tests in source: ' + originalSource);
+      throw StateError('No tests in source: $originalSource');
     }
     for (var result in validationStrings) {
       if (result.length < 3) {
-        throw StateError('Invalid location result: ' + result);
+        throw StateError('Invalid location result: $result');
       }
       var id = result.substring(0, 1);
       var sign = result.substring(1, 2);
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 03ec19a..7503258 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -2391,9 +2391,8 @@
 
     // Wait for analysis then edit the content
     await waitForTasksFinished();
-    var revisedContent = testCode.substring(0, completionOffset) +
-        'i' +
-        testCode.substring(completionOffset);
+    var revisedContent =
+        '${testCode.substring(0, completionOffset)}i${testCode.substring(completionOffset)}';
     ++completionOffset;
     server.handleRequest(AnalysisUpdateContentParams(
         {testFile: AddContentOverlay(revisedContent)}).toRequest('add1'));
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 9e64bec..1d02ab8 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -47,7 +47,7 @@
       int? replacementLength,
       ElementKind? elementKind}) {
     CompletionSuggestion? cs;
-    suggestions.forEach((s) {
+    for (var s in suggestions) {
       if (elementKind != null && s.element?.kind != elementKind) {
         return;
       }
@@ -58,7 +58,7 @@
           fail('expected exactly one $completion but found > 1');
         }
       }
-    });
+    }
     if (cs == null) {
       var completions = suggestions.map((s) => s.completion).toList();
 
@@ -69,7 +69,7 @@
 
       fail('expected $expectationText, but found\n $completions');
     }
-    var suggestion = cs!;
+    var suggestion = cs;
     expect(suggestion.kind, equals(kind));
     expect(suggestion.selectionOffset, selectionOffset ?? completion.length);
     expect(suggestion.selectionLength, equals(0));
diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
index e7ee0e0..7ba7566 100644
--- a/pkg/analysis_server/test/edit/assists_test.dart
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -147,6 +147,6 @@
         return;
       }
     }
-    fail('Expected to find |$message| in\n' + changes.join('\n'));
+    fail('Expected to find |$message| in\n${changes.join('\n')}');
   }
 }
diff --git a/pkg/analysis_server/test/edit/postfix_completion_test.dart b/pkg/analysis_server/test/edit/postfix_completion_test.dart
index 5a49b9a..656aa00 100644
--- a/pkg/analysis_server/test/edit/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/edit/postfix_completion_test.dart
@@ -75,7 +75,7 @@
       }
       return;
     }
-    fail('Expected to find |$message| but got: ' + change.message);
+    fail('Expected to find |$message| but got: ${change.message}');
   }
 
   Future<void> _prepareCompletion(String key) async {
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 8f47785..910154e 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -2270,13 +2270,13 @@
 
   SourceEdit? _findEditWithId(SourceChange change, String id) {
     SourceEdit? potentialEdit;
-    change.edits.forEach((fileEdit) {
-      fileEdit.edits.forEach((edit) {
+    for (var fileEdit in change.edits) {
+      for (var edit in fileEdit.edits) {
         if (edit.id == id) {
           potentialEdit = edit;
         }
-      });
-    });
+      }
+    }
     return potentialEdit;
   }
 
diff --git a/pkg/analysis_server/test/edit/statement_completion_test.dart b/pkg/analysis_server/test/edit/statement_completion_test.dart
index 6676f45..7fa58d1 100644
--- a/pkg/analysis_server/test/edit/statement_completion_test.dart
+++ b/pkg/analysis_server/test/edit/statement_completion_test.dart
@@ -119,7 +119,7 @@
       }
       return;
     }
-    fail('Expected to find |$message| but got: ' + change.message);
+    fail('Expected to find |$message| but got: ${change.message}');
   }
 
   Future<void> _prepareCompletion(String search,
diff --git a/pkg/analysis_server/test/integration/server/bazel_changes_test.dart b/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
index da935af..3a64173 100644
--- a/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
+++ b/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
@@ -109,7 +109,7 @@
         processedNotification.complete();
       }
     });
-    var resetCompleterAndErrors = () async {
+    resetCompleterAndErrors() async {
       // This is necessary because our polling uses modification timestamps
       // whose resolution seems to be too small for a test like this (i.e., we
       // write to the `command.log` file, but if the modification timestamp
@@ -117,7 +117,7 @@
       await Future.delayed(Duration(seconds: 1));
       errors.clear();
       processedNotification = Completer();
-    };
+    }
 
     writeFile(testFile, r'''
 import 'generated.dart';
diff --git a/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart b/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
index c4664f7..4184735 100644
--- a/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
@@ -145,7 +145,7 @@
     newFile2(mainFilePath, withoutMarkers(content));
     await initialize();
 
-    final ofKind = (CodeActionKind kind) => getCodeActions(
+    ofKind(CodeActionKind kind) => getCodeActions(
           mainFileUri.toString(),
           range: rangeFromMarkers(content),
           kinds: [kind],
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index 10690ba..a175f49 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -250,7 +250,7 @@
       ),
     );
 
-    final ofKind = (CodeActionKind kind) => getCodeActions(
+    ofKind(CodeActionKind kind) => getCodeActions(
           mainFileUri.toString(),
           range: rangeFromMarkers(content),
           kinds: [kind],
diff --git a/pkg/analysis_server/test/lsp/code_actions_source_test.dart b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
index 76fb7a9..ecdfe3a 100644
--- a/pkg/analysis_server/test/lsp/code_actions_source_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
@@ -166,7 +166,7 @@
         workspaceCapabilities:
             withApplyEditSupport(emptyWorkspaceClientCapabilities));
 
-    final ofKind = (CodeActionKind kind) => getCodeActions(
+    ofKind(CodeActionKind kind) => getCodeActions(
           mainFileUri.toString(),
           kinds: [kind],
         );
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 484434a..b91f9e7 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -803,9 +803,9 @@
     expect(getter.detail, equals('String'));
     expect(setter.detail, equals('String'));
     expect(both.detail, equals('String'));
-    [getter, setter, both].forEach((item) {
+    for (var item in [getter, setter, both]) {
       expect(item.kind, equals(CompletionItemKind.Property));
-    });
+    }
   }
 
   Future<void> test_insertReplaceRanges() async {
diff --git a/pkg/analysis_server/test/lsp/implementation_test.dart b/pkg/analysis_server/test/lsp/implementation_test.dart
index dabf3ec..ab2593d 100644
--- a/pkg/analysis_server/test/lsp/implementation_test.dart
+++ b/pkg/analysis_server/test/lsp/implementation_test.dart
@@ -178,6 +178,7 @@
     if (shouldMatch) {
       expect(res, equals(expectedLocations));
     } else {
+      // ignore: avoid_function_literals_in_foreach_calls
       expectedLocations.forEach((l) => expect(res, isNot(contains(res))));
     }
   }
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index 2f693e4..3949a70 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -562,9 +562,9 @@
     // adding to priority files, but if that's done before the file is in an
     // analysis root it will not occur.
     // https://github.com/dart-lang/sdk/issues/37338
-    server.driverMap.values.forEach((driver) {
+    for (var driver in server.driverMap.values) {
       expect(driver.getCachedResult(nestedFilePath), isNotNull);
-    });
+    }
 
     // Closing the file should remove it.
     await closeFile(nestedFileUri);
@@ -856,9 +856,9 @@
     // adding to priority files, but if that's done before the file is in an
     // analysis root it will not occur.
     // https://github.com/dart-lang/sdk/issues/37338
-    server.driverMap.values.forEach((driver) {
+    for (var driver in server.driverMap.values) {
       expect(driver.getCachedResult(nestedFilePath), isNotNull);
-    });
+    }
 
     // Closing the file should remove it.
     await closeFile(nestedFileUri);
diff --git a/pkg/analysis_server/test/lsp/priority_files_test.dart b/pkg/analysis_server/test/lsp/priority_files_test.dart
index 028f903..21b041e 100644
--- a/pkg/analysis_server/test/lsp/priority_files_test.dart
+++ b/pkg/analysis_server/test/lsp/priority_files_test.dart
@@ -21,9 +21,9 @@
     await closeFile(mainFileUri);
 
     expect(server.priorityFiles, isNot(contains(mainFilePath)));
-    server.driverMap.values.forEach((driver) {
+    for (var driver in server.driverMap.values) {
       expect(driver.priorityFiles, isNot(contains(mainFilePath)));
-    });
+    }
   }
 
   Future<void> test_open() async {
@@ -31,8 +31,8 @@
     await openFile(mainFileUri, '');
 
     expect(server.priorityFiles, contains(mainFilePath));
-    server.driverMap.values.forEach((driver) {
+    for (var driver in server.driverMap.values) {
       expect(driver.priorityFiles, contains(mainFilePath));
-    });
+    }
   }
 }
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index fd2d8b2..0873411 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -261,7 +261,7 @@
   }
 
   void mergeJson(Map<String, dynamic> source, Map<String, dynamic> dest) {
-    source.keys.forEach((key) {
+    for (var key in source.keys) {
       var sourceValue = source[key];
       var destValue = dest[key];
       if (sourceValue is Map<String, dynamic> &&
@@ -270,7 +270,7 @@
       } else {
         dest[key] = source[key];
       }
-    });
+    }
   }
 
   TextDocumentClientCapabilities
@@ -739,14 +739,14 @@
 
   void applyTextDocumentEdits(
       Map<String, String> oldFileContent, List<TextDocumentEdit> edits) {
-    edits.forEach((edit) {
+    for (var edit in edits) {
       final path = Uri.parse(edit.textDocument.uri).toFilePath();
       if (!oldFileContent.containsKey(path)) {
         throw 'Recieved edits for $path which was not provided as a file to be edited. '
             'Perhaps a CreateFile change was missing from the edits?';
       }
       oldFileContent[path] = applyTextDocumentEdit(oldFileContent[path]!, edit);
-    });
+    }
   }
 
   String applyTextEdit(String content,
@@ -910,18 +910,23 @@
   ) {
     documentChanges.map(
       // Validate versions on simple doc edits
-      (edits) => edits
-          .forEach((edit) => expectDocumentVersion(edit, expectedVersions)),
+      (edits) {
+        for (var edit in edits) {
+          expectDocumentVersion(edit, expectedVersions);
+        }
+      },
       // For resource changes, we only need to validate changes since
       // creates/renames/deletes do not supply versions.
-      (changes) => changes.forEach((change) {
-        change.map(
-          (edit) => expectDocumentVersion(edit, expectedVersions),
-          (create) => {},
-          (rename) {},
-          (delete) {},
-        );
-      }),
+      (changes) {
+        for (var change in changes) {
+          change.map(
+            (edit) => expectDocumentVersion(edit, expectedVersions),
+            (create) => {},
+            (rename) {},
+            (delete) {},
+          );
+        }
+      },
     );
   }
 
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 60c1114..a3bfbb5 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -57,8 +57,8 @@
   final _exitCodeCompleter = Completer<int>();
   final String _stdout, _stderr;
 
-  MockProcess(this._pid, FutureOr<int> _exitCode, this._stdout, this._stderr) {
-    Future.value(_exitCode).then(_exitCodeCompleter.complete);
+  MockProcess(this._pid, FutureOr<int> exitCode, this._stdout, this._stderr) {
+    Future.value(exitCode).then(_exitCodeCompleter.complete);
   }
 
   @override
diff --git a/pkg/analysis_server/test/mocks_lsp.dart b/pkg/analysis_server/test/mocks_lsp.dart
index 3888981..8478ce4 100644
--- a/pkg/analysis_server/test/mocks_lsp.dart
+++ b/pkg/analysis_server/test/mocks_lsp.dart
@@ -28,12 +28,12 @@
   /// Warning popups sent to the user.
   final shownWarnings = <lsp.ShowMessageParams>[];
 
-  MockLspServerChannel(bool _printMessages) {
-    if (_printMessages) {
+  MockLspServerChannel(bool printMessages) {
+    if (printMessages) {
       _serverToClient.stream
-          .listen((message) => print('<== ' + jsonEncode(message)));
+          .listen((message) => print('<== ${jsonEncode(message)}'));
       _clientToServer.stream
-          .listen((message) => print('==> ' + jsonEncode(message)));
+          .listen((message) => print('==> ${jsonEncode(message)}'));
     }
 
     // Keep track of any errors/warnings that are sent to the user with
diff --git a/pkg/analysis_server/test/search/abstract_search_domain.dart b/pkg/analysis_server/test/search/abstract_search_domain.dart
index 54b8990..15cba77 100644
--- a/pkg/analysis_server/test/search/abstract_search_domain.dart
+++ b/pkg/analysis_server/test/search/abstract_search_domain.dart
@@ -38,7 +38,7 @@
           location.offset == offset &&
           location.length == length) {
         if (!expected) {
-          fail('Unexpected result $result in\n' + results.join('\n'));
+          fail('Unexpected result $result in\n${results.join('\n')}');
         }
         this.result = result;
         return;
@@ -46,8 +46,7 @@
     }
     if (expected) {
       fail(
-          'Not found: "search" kind=$kind offset=$offset length=$length\nin\n' +
-              results.join('\n'));
+          'Not found: "search" kind=$kind offset=$offset length=$length\nin\n${results.join('\n')}');
     }
   }
 
diff --git a/pkg/analysis_server/test/search/member_declarations_test.dart b/pkg/analysis_server/test/search/member_declarations_test.dart
index 29e27c9..42be69a 100644
--- a/pkg/analysis_server/test/search/member_declarations_test.dart
+++ b/pkg/analysis_server/test/search/member_declarations_test.dart
@@ -20,7 +20,7 @@
   void assertHasDeclaration(ElementKind kind, String className) {
     var result = findTopLevelResult(kind, className);
     if (result == null) {
-      fail('Not found: kind=$kind in="$className"\nin\n' + results.join('\n'));
+      fail('Not found: kind=$kind in="$className"\nin\n${results.join('\n')}');
     }
     this.result = result;
   }
diff --git a/pkg/analysis_server/test/search/top_level_declarations_test.dart b/pkg/analysis_server/test/search/top_level_declarations_test.dart
index 977f966..6fd2959 100644
--- a/pkg/analysis_server/test/search/top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/search/top_level_declarations_test.dart
@@ -20,7 +20,7 @@
   void assertHasDeclaration(ElementKind kind, String name) {
     var result = findTopLevelResult(kind, name);
     if (result == null) {
-      fail('Not found: kind=$kind name="$name"\nin\n' + results.join('\n'));
+      fail('Not found: kind=$kind name="$name"\nin\n${results.join('\n')}');
     }
     this.result = result;
   }
@@ -28,7 +28,7 @@
   void assertNoDeclaration(ElementKind kind, String name) {
     var result = findTopLevelResult(kind, name);
     if (result != null) {
-      fail('Unexpected: kind=$kind name="$name"\nin\n' + results.join('\n'));
+      fail('Unexpected: kind=$kind name="$name"\nin\n${results.join('\n')}');
     }
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 371d0a0..4c5f292 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -607,17 +607,17 @@
       CompletionSuggestionKind? csKind,
       ElementKind? elemKind}) {
     CompletionSuggestion? cs;
-    suggestions.forEach((CompletionSuggestion s) {
+    for (var s in suggestions) {
       if (completion != null && completion != s.completion) {
-        return;
+        continue;
       }
       if (csKind != null && csKind != s.kind) {
-        return;
+        continue;
       }
       if (elemKind != null) {
         var element = s.element;
         if (element == null || elemKind != element.kind) {
-          return;
+          continue;
         }
       }
       if (cs == null) {
@@ -626,7 +626,7 @@
         failedCompletion('expected exactly one $cs',
             suggestions.where((s) => s.completion == completion));
       }
-    });
+    }
     return cs;
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 1918e2d..3043a0d 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -2346,8 +2346,9 @@
       StringBuffer msg, Iterable<String> completions, Iterable<String> other) {
     var sorted = completions.toList();
     sorted.sort((c1, c2) => c1.compareTo(c2));
-    sorted.forEach(
-        (c) => msg.writeln('  $c, ${other.contains(c) ? '' : '<<<<<<<<<<<'}'));
+    for (var c in sorted) {
+      msg.writeln('  $c, ${other.contains(c) ? '' : '<<<<<<<<<<<'}');
+    }
   }
 
   bool _equalSets(Iterable<String> iter1, Iterable<String> iter2) {
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index 7676492..fa81e8d 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
@@ -47,7 +47,7 @@
       }
       return;
     }
-    fail('Expected to find |$message| but got: ' + change.message);
+    fail('Expected to find |$message| but got: ${change.message}');
   }
 
   Future<void> _assertNotApplicable(String key, String code) async {
diff --git a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
index ad27bcd..f2bece5 100644
--- a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
@@ -57,7 +57,7 @@
       }
       return;
     }
-    fail('Expected to find |$message| but got: ' + change.message);
+    fail('Expected to find |$message| but got: ${change.message}');
   }
 
   Future<void> _computeCompletion(int offset) async {
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index 50ccb48..05be8f8 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -575,7 +575,7 @@
   void test_validateTypeAliasName_invalidCharacters() {
     assertRefactoringStatus(
         validateTypeAliasName('New-Name'), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Type alias name must not contain \'-\'.");
+        expectedMessage: "Type alias name must not contain '-'.");
   }
 
   void test_validateTypeAliasName_leadingBlanks() {
diff --git a/pkg/analysis_server/test/services/snippets/dart/dart_snippet_producers_test.dart b/pkg/analysis_server/test/services/snippets/dart/dart_snippet_producers_test.dart
index 70374d3..4c00dfa 100644
--- a/pkg/analysis_server/test/services/snippets/dart/dart_snippet_producers_test.dart
+++ b/pkg/analysis_server/test/services/snippets/dart/dart_snippet_producers_test.dart
@@ -51,8 +51,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 class A {}
   
@@ -96,8 +97,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   do {
@@ -139,8 +141,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   for (var element in collection) {
@@ -189,8 +192,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   for (var i = 0; i < count; i++) {
@@ -232,8 +236,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   if (condition) {
@@ -267,8 +272,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   if (true) {
@@ -314,8 +320,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   if (condition) {
@@ -347,8 +354,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   if (true) {
@@ -419,8 +427,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     final expectedParams = expectArgsParameter ? 'List<String> args' : '';
     expect(code, '''
 void main($expectedParams) {
@@ -492,8 +501,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   switch (expression) {
@@ -537,8 +547,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   if (true) {
@@ -595,8 +606,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   test('test name', () {
@@ -647,8 +659,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   group('group name', () {
@@ -698,8 +711,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   try {
@@ -733,8 +747,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   if (true) {
@@ -780,8 +795,9 @@
     expect(snippet.label, label);
     expect(snippet.change.edits, hasLength(1));
     code = withoutMarkers(code);
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 void f() {
   while (condition) {
diff --git a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
index 8cd7dbc..16423ce 100644
--- a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
+++ b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
@@ -86,8 +86,9 @@
     expect(snippet.label, label);
     var code = '';
     expect(snippet.change.edits, hasLength(1));
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 import 'package:flutter/src/foundation/key.dart';
 import 'package:flutter/src/widgets/framework.dart';
@@ -121,8 +122,9 @@
     expect(snippet.label, label);
     var code = '';
     expect(snippet.change.edits, hasLength(1));
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 import 'package:flutter/src/widgets/framework.dart';
 
@@ -181,8 +183,9 @@
     expect(snippet.label, label);
     var code = '';
     expect(snippet.change.edits, hasLength(1));
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 import 'package:flutter/src/animation/animation_controller.dart';
 import 'package:flutter/src/foundation/key.dart';
@@ -233,8 +236,9 @@
     expect(snippet.label, label);
     var code = '';
     expect(snippet.change.edits, hasLength(1));
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 import 'package:flutter/src/animation/animation_controller.dart';
 import 'package:flutter/src/widgets/framework.dart';
@@ -307,8 +311,9 @@
     expect(snippet.label, label);
     var code = '';
     expect(snippet.change.edits, hasLength(1));
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 import 'package:flutter/src/foundation/key.dart';
 import 'package:flutter/src/widgets/framework.dart';
@@ -337,8 +342,9 @@
     expect(snippet.label, label);
     var code = '';
     expect(snippet.change.edits, hasLength(1));
-    snippet.change.edits
-        .forEach((edit) => code = SourceEdit.applySequence(code, edit.edits));
+    for (var edit in snippet.change.edits) {
+      code = SourceEdit.applySequence(code, edit.edits);
+    }
     expect(code, '''
 import 'package:flutter/src/widgets/framework.dart';
 
diff --git a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
index 307a91f..0aa5e78 100644
--- a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
@@ -381,7 +381,7 @@
 
     // Go through each marker, find the expected label/end and
     // ensure it's in the results.
-    expectedLabels.forEach((m) {
+    for (var m in expectedLabels) {
       var i = m.group(1);
       // Find the end marker.
       var endMatch = RegExp('/\\*$i:(.+?)\\*/').firstMatch(content)!;
@@ -392,7 +392,7 @@
 
       expect(labels,
           contains(ClosingLabel(expectedStart, expectedLength, expectedLabel)));
-    });
+    }
   }
 
   Future<List<ClosingLabel>> _computeElements(String sourceContent) async {
diff --git a/pkg/analysis_server/test/src/computer/folding_computer_test.dart b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
index 09c90df..7ee425d 100644
--- a/pkg/analysis_server/test/src/computer/folding_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -555,7 +555,7 @@
 
     // Go through each marker, find the expected region start/end and
     // ensure it's in the results.
-    expectedRegions.forEach((m) {
+    for (var m in expectedRegions) {
       final i = m.group(1);
       final inclusiveStart = m.group(2) == 'INC';
       // Find the end marker.
@@ -576,7 +576,7 @@
 
       expect(regions,
           contains(FoldingRegion(expectedKind, expectedStart, expectedLength)));
-    });
+    }
   }
 
   Future<List<FoldingRegion>> _computeRegions(String sourceContent) async {
diff --git a/pkg/analysis_server/test/src/lsp/lsp_packet_transformer_test.dart b/pkg/analysis_server/test/src/lsp/lsp_packet_transformer_test.dart
index d25328e..61c0d1b 100644
--- a/pkg/analysis_server/test/src/lsp/lsp_packet_transformer_test.dart
+++ b/pkg/analysis_server/test/src/lsp/lsp_packet_transformer_test.dart
@@ -85,9 +85,8 @@
 
 List<int> makeLspPacket(String json, [String? contentType]) {
   final utf8EncodedBody = utf8.encode(json);
-  final header = 'Content-Length: ${utf8EncodedBody.length}' +
-      (contentType != null ? '\r\nContent-Type: $contentType' : '') +
-      '\r\n\r\n';
+  final header =
+      'Content-Length: ${utf8EncodedBody.length}${contentType != null ? '\r\nContent-Type: $contentType' : ''}\r\n\r\n';
   final asciiEncodedHeader = ascii.encode(header);
 
   return asciiEncodedHeader.followedBy(utf8EncodedBody).toList();
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 7d12566..358bb99 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -114,7 +114,7 @@
   Future<void> addPluginToContextRoot(
       ContextRoot contextRoot, String path) async {
     addedContextRoots.add(contextRoot);
-    return null;
+    return;
   }
 
   @override
diff --git a/pkg/analysis_server/test/src/services/completion/filtering/fuzzy_matcher_test.dart b/pkg/analysis_server/test/src/services/completion/filtering/fuzzy_matcher_test.dart
index e1cda4a..c4916c9 100644
--- a/pkg/analysis_server/test/src/services/completion/filtering/fuzzy_matcher_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/filtering/fuzzy_matcher_test.dart
@@ -26,10 +26,8 @@
   var index = 0;
   var result = '';
   for (var i = 0; i < matches.length - 1; i += 2) {
-    result += str.substring(index, matches[i]) +
-        '[' +
-        str.substring(matches[i], matches[i + 1]) +
-        ']';
+    result +=
+        '${str.substring(index, matches[i])}[${str.substring(matches[i], matches[i + 1])}]';
     index = matches[i + 1];
   }
   return result + str.substring(index);
diff --git a/pkg/analysis_server/test/stress/replay/replay.dart b/pkg/analysis_server/test/stress/replay/replay.dart
index 2cbad2f..fbfe0e1 100644
--- a/pkg/analysis_server/test/stress/replay/replay.dart
+++ b/pkg/analysis_server/test/stress/replay/replay.dart
@@ -100,7 +100,7 @@
     // Process the command-line arguments.
     //
     if (!_processCommandLine(args)) {
-      return null;
+      return;
     }
     if (verbose) {
       stdout.writeln();
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index 68ef712..93daac0 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -231,11 +231,11 @@
       stdout.writeln('  none');
     } else {
       var requestsByMethod = <String, List<RequestData>>{};
-      _requestDataMap.values.forEach((RequestData requestData) {
+      for (var requestData in _requestDataMap.values) {
         requestsByMethod
             .putIfAbsent(requestData.method, () => <RequestData>[])
             .add(requestData);
-      });
+      }
       var keys = requestsByMethod.keys.toList();
       keys.sort();
       var maxCount = requestsByMethod.values
@@ -248,7 +248,7 @@
         var minTime = -1;
         var maxTime = -1;
         var totalTime = 0;
-        requests.forEach((RequestData data) {
+        for (var data in requests) {
           if (data.responseTime == null) {
             noResponseCount++;
           } else {
@@ -258,7 +258,7 @@
             maxTime = math.max(maxTime, time);
             totalTime += time;
           }
-        });
+        }
         var count = requests.length.toString();
         writeSpaces(countWidth - count.length);
         stdout.write('  ');
@@ -745,7 +745,7 @@
   /// Handle a [line] of input read from stderr.
   void _handleStdErr(String line) {
     var trimmedLine = line.trim();
-    logger?.log(fromStderr, '$trimmedLine');
+    logger?.log(fromStderr, trimmedLine);
     throw StateError('Message received on stderr: "$trimmedLine"');
   }
 
@@ -765,7 +765,7 @@
         trimmedLine.startsWith('The Dart VM service is listening on ')) {
       return;
     }
-    logger?.log(fromServer, '$trimmedLine');
+    logger?.log(fromServer, trimmedLine);
     var message = asMap(json.decoder.convert(trimmedLine) as Object);
     if (message.containsKey('id')) {
       // The message is a response.
@@ -807,7 +807,7 @@
     }
     var line = json.encode(command);
     _process!.stdin.add(utf8.encoder.convert('$line\n'));
-    logger?.log(fromClient, '$line');
+    logger?.log(fromClient, line);
     return requestData;
   }
 }
diff --git a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
index 04a78a6..2ecc605 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
@@ -12,10 +12,10 @@
 void main() {
   group('toJson', () {
     test('returns correct JSON for a union', () {
-      final _num = Either2.t1(1);
-      final _string = Either2.t2('Test');
-      expect(json.encode(_num.toJson()), equals('1'));
-      expect(json.encode(_string.toJson()), equals('"Test"'));
+      final num = Either2.t1(1);
+      final string = Either2.t2('Test');
+      expect(json.encode(num.toJson()), equals('1'));
+      expect(json.encode(string.toJson()), equals('"Test"'));
     });
 
     test('returns correct output for union types', () {
diff --git a/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart b/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
index 2fbe495..990d952 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
@@ -92,12 +92,12 @@
       expect(output[0], const TypeMatcher<Interface>());
       final interface = output[0] as Interface;
       expect(interface.members, hasLength(2));
-      [0, 1].forEach((i) {
+      for (var i in [0, 1]) {
         expect(interface.members[i], const TypeMatcher<Field>());
         final field = interface.members[i] as Field;
         expect(field.name, equals('options$i'));
         expect(field.commentText, equals('''Options$i used by something.'''));
-      });
+      }
     });
 
     test('parses an interface with type args', () {
@@ -176,7 +176,9 @@
       final output = parseString(input);
       final interface = output[0] as Interface;
       expect(interface.members, hasLength(4));
-      interface.members.forEach((m) => expect(m, const TypeMatcher<Field>()));
+      for (var m in interface.members) {
+        expect(m, const TypeMatcher<Field>());
+      }
       final canBeBoth = interface.members[0] as Field,
           canBeNeither = interface.members[1] as Field,
           canBeNull = interface.members[2] as Field,
@@ -299,7 +301,9 @@
       expect(output[0], const TypeMatcher<Namespace>());
       final namespace = output[0] as Namespace;
       expect(namespace.members, hasLength(3));
-      namespace.members.forEach((m) => expect(m, const TypeMatcher<Const>()));
+      for (var m in namespace.members) {
+        expect(m, const TypeMatcher<Const>());
+      }
       final create = namespace.members[0] as Const,
           delete = namespace.members[1] as Const,
           rename = namespace.members[2] as Const;
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index d6f8764..fcc4650 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -1051,7 +1051,7 @@
     var columnHeaders = [' ', targetMetrics[0].name];
     for (var i = 1; i < targetMetrics.length; i++) {
       columnHeaders.add('|');
-      columnHeaders.add('${targetMetrics[i].name}');
+      columnHeaders.add(targetMetrics[i].name);
       columnHeaders.add('delta');
     }
     var blankRow = [for (int i = 0; i < columnHeaders.length; i++) ''];
diff --git a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
index 83be746..647850c 100644
--- a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
+++ b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
@@ -122,7 +122,7 @@
     for (var varDecl in node.variables) {
       handleVariableDeclaration(varDecl, node.type?.type);
     }
-    return null;
+    return;
   }
 }
 
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index 97f3c5c..34b7f53 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -1521,9 +1521,9 @@
       {List<Keyword> allowedKeywords = noKeywords}) {
     _recordElementKind(context, node);
     if (inGenericContext) {
-      _recordElementKind(context + ' - generic', node);
+      _recordElementKind('$context - generic', node);
     } else {
-      _recordElementKind(context + ' - non-generic', node);
+      _recordElementKind('$context - non-generic', node);
     }
     _recordReferenceDepth(node);
     _recordTokenDistance(node);
@@ -1807,10 +1807,10 @@
       String descriptor, DartType parameterType, DartType argumentType,
       {bool isContextType = false}) {
     if (argumentType == parameterType) {
-      data.recordTypeMatch('$descriptor', 'exact');
+      data.recordTypeMatch(descriptor, 'exact');
       data.recordTypeMatch('all', 'exact');
     } else if (typeSystem.isSubtypeOf(argumentType, parameterType)) {
-      data.recordTypeMatch('$descriptor', 'subtype');
+      data.recordTypeMatch(descriptor, 'subtype');
       data.recordTypeMatch('all', 'subtype');
       if (isContextType &&
           argumentType is InterfaceType &&
@@ -1835,10 +1835,10 @@
         data.recordDistance('Subtype of context type (all)', distance);
       }
     } else if (typeSystem.isSubtypeOf(parameterType, argumentType)) {
-      data.recordTypeMatch('$descriptor', 'supertype');
+      data.recordTypeMatch(descriptor, 'supertype');
       data.recordTypeMatch('all', 'supertype');
     } else {
-      data.recordTypeMatch('$descriptor', 'unrelated');
+      data.recordTypeMatch(descriptor, 'unrelated');
       data.recordTypeMatch('all', 'unrelated');
     }
   }
diff --git a/pkg/analysis_server/tool/instrumentation/log/log.dart b/pkg/analysis_server/tool/instrumentation/log/log.dart
index 4ede5ea..11643d6 100644
--- a/pkg/analysis_server/tool/instrumentation/log/log.dart
+++ b/pkg/analysis_server/tool/instrumentation/log/log.dart
@@ -450,12 +450,12 @@
       buffer.write('}');
     } else if (object is List) {
       buffer.write('[<br>');
-      object.forEach((element) {
+      for (var element in object) {
         var newIndent = indent + singleIndent;
         buffer.write(newIndent);
         _format(buffer, newIndent, element as Object);
         buffer.write('<br>');
-      });
+      }
       buffer.write(indent);
       buffer.write(']');
     }
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index ba060b9..12998d6 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -39,7 +39,7 @@
   final buffer = IndentableStringBuffer();
   _getSortedUnique(types).forEach((t) => _writeType(buffer, t));
   final formattedCode = _formatCode(buffer.toString());
-  return formattedCode.trim() + '\n'; // Ensure a single trailing newline.
+  return '${formattedCode.trim()}\n'; // Ensure a single trailing newline.
 }
 
 void recordTypes(List<AstNode> types) {
@@ -50,10 +50,10 @@
     _interfaces[interface.name] = interface;
     // Keep track of our base classes so they can look up their super classes
     // later in their fromJson() to deserialise into the most specific type.
-    interface.baseTypes.forEach((base) {
+    for (var base in interface.baseTypes) {
       final subTypes = _subtypes[base.dartType] ??= <String>[];
       subTypes.add(interface.name);
-    });
+    }
   });
   types
       .whereType<Namespace>()
@@ -108,7 +108,7 @@
 /// Returns a copy of the list sorted by name with duplicates (by name+type) removed.
 List<N> _getSortedUnique<N extends AstNode>(List<N> items) {
   final uniqueByName = <String, N>{};
-  items.forEach((item) {
+  for (var item in items) {
     // It's fine to have the same name used for different types (eg. namespace +
     // type alias) but some types are just duplicated entirely in the spec in
     // different positions which should not be emitted twice.
@@ -124,7 +124,7 @@
 
     // Keep the last one as in some cases the first definition is less specific.
     uniqueByName[nameTypeKey] = item;
-  });
+  }
   final sortedList = uniqueByName.values.toList();
   sortedList.sort((item1, item2) => item1.name.compareTo(item2.name));
   return sortedList;
@@ -348,7 +348,9 @@
     // Wrap at 80 - 4 ('/// ') - indent characters.
     var wrappedLines =
         _wrapLines(originalLines, (80 - 4 - buffer.totalIndent).clamp(0, 80));
-    wrappedLines.forEach((l) => buffer.writeIndentedln('/// $l'.trim()));
+    for (var l in wrappedLines) {
+      buffer.writeIndentedln('/// $l'.trim());
+    }
   }
   // Marking LSP-deprecated fields as deprecated in Dart results in a lot
   // of warnings because we still often populate these fields for clients that
@@ -392,9 +394,9 @@
     buffer
       ..writeIndentedln('switch (obj) {')
       ..indent();
-    consts.forEach((cons) {
+    for (var cons in consts) {
       buffer.writeIndentedln('case ${cons.valueAsLiteral}:');
-    });
+    }
     buffer
       ..indent()
       ..writeIndentedln('return true;')
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index f050549..b25b7c7 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -162,6 +162,8 @@
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
 // ignore_for_file: annotate_overrides
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+// ignore_for_file: prefer_is_not_operator
 // ignore_for_file: unnecessary_parenthesis
 
 import 'dart:core' hide deprecated;
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript.dart b/pkg/analysis_server/tool/lsp_spec/typescript.dart
index e0b3812..82ac9c2 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript.dart
@@ -27,33 +27,33 @@
     comment = comment.substring(2);
   }
 
-  final _commentLinePrefixes = RegExp(r'\n\s*\* ?');
-  final _nonConcurrentNewlines = RegExp(r'\n(?![\n\s\-*])');
-  final _newLinesThatRequireReinserting = RegExp(r'\n (\w)');
+  final commentLinePrefixes = RegExp(r'\n\s*\* ?');
+  final nonConcurrentNewlines = RegExp(r'\n(?![\n\s\-*])');
+  final newLinesThatRequireReinserting = RegExp(r'\n (\w)');
   // Remove any Windows newlines from the source.
   comment = comment.replaceAll('\r', '');
   // Remove the * prefixes.
-  comment = comment.replaceAll(_commentLinePrefixes, '\n');
+  comment = comment.replaceAll(commentLinePrefixes, '\n');
   // Remove and newlines that look like wrapped text.
-  comment = comment.replaceAll(_nonConcurrentNewlines, ' ');
+  comment = comment.replaceAll(nonConcurrentNewlines, ' ');
   // The above will remove one of the newlines when there are two, so we need
   // to re-insert newlines for any block that starts immediately after a newline.
   comment = comment.replaceAllMapped(
-      _newLinesThatRequireReinserting, (m) => '\n\n${m.group(1)}');
+      newLinesThatRequireReinserting, (m) => '\n\n${m.group(1)}');
   return comment.trim();
 }
 
 /// Improves comments in generated code to support where types may have been
 /// altered (for ex. with [getImprovedType] above).
 String? getImprovedComment(String interfaceName, String fieldName) {
-  const _improvedComments = <String, Map<String, String>>{
+  const improvedComments = <String, Map<String, String>>{
     'ResponseError': {
       'data':
           '// A string that contains additional information about the error. Can be omitted.',
     },
   };
 
-  final interface = _improvedComments[interfaceName];
+  final interface = improvedComments[interfaceName];
 
   return interface != null ? interface[fieldName] : null;
 }
@@ -68,7 +68,7 @@
 ///   and we know we always use a specific type. This avoids wrapping a lot
 ///   of code in `EitherX<Y,Z>.tX()` and simplifies the testing of them.
 String? getImprovedType(String interfaceName, String? fieldName) {
-  const _improvedTypeMappings = <String, Map<String, String>>{
+  const improvedTypeMappings = <String, Map<String, String>>{
     'Diagnostic': {
       'severity': 'DiagnosticSeverity',
       'code': 'String',
@@ -129,7 +129,7 @@
     }
   };
 
-  final interface = _improvedTypeMappings[interfaceName];
+  final interface = improvedTypeMappings[interfaceName];
 
   return interface != null ? interface[fieldName] : null;
 }
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
index d897d0b..d35dc51 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
@@ -367,12 +367,12 @@
     // marked with number.
     final commentText = leadingComment?.text;
     if (commentText != null) {
-      final _linkTypePattern = RegExp(r'See \{@link (\w+)\}\.?');
-      final linkTypeMatch = _linkTypePattern.firstMatch(commentText);
+      final linkTypePattern = RegExp(r'See \{@link (\w+)\}\.?');
+      final linkTypeMatch = linkTypePattern.firstMatch(commentText);
       if (linkTypeMatch != null) {
         type = Type.identifier(linkTypeMatch.group(1)!);
         leadingComment = Comment(Token(TokenType.COMMENT,
-            '// ' + commentText.replaceAll(_linkTypePattern, '')));
+            '// ${commentText.replaceAll(linkTypePattern, '')}'));
       }
     }
 
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index cd11d2c..d48acf3 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -250,7 +250,7 @@
             toHtmlVisitor.translateHtml(value.html);
           }));
           writeln(
-              'public static final String ${value.value} = \"${value.value}\";');
+              'public static final String ${value.value} = "${value.value}";');
         });
       }
     });
@@ -421,7 +421,7 @@
             javadocComment(toHtmlVisitor.collectHtml(() {
               toHtmlVisitor.translateHtml(field.html);
             }));
-            var setterName = 'set' + capitalize(name);
+            var setterName = 'set${capitalize(name)}';
             writeln('public void $setterName($type $name) {');
             writeln('  this.$name = $name;');
             writeln('}');
@@ -505,7 +505,7 @@
             for (var field in fields) {
               if (!_isTypeFieldInUpdateContentUnionType(
                   className, field.name)) {
-                parameters.add('${javaName(field.name)}');
+                parameters.add(javaName(field.name));
               }
             }
             write(parameters.join(', '));
@@ -692,17 +692,17 @@
         writeln('public String toString() {');
         indent(() {
           writeln('StringBuilder builder = new StringBuilder();');
-          writeln('builder.append(\"[\");');
+          writeln('builder.append("[");');
           for (var i = 0; i < fields.length; i++) {
-            writeln('builder.append(\"${javaName(fields[i].name)}=\");');
+            writeln('builder.append("${javaName(fields[i].name)}=");');
             write('builder.append(${_getToStringForField(fields[i])}');
             if (i + 1 != fields.length) {
               // this is not the last field
-              write(' + \", \"');
+              write(' + ", "');
             }
             writeln(');');
           }
-          writeln('builder.append(\"]\");');
+          writeln('builder.append("]");');
           writeln('return builder.toString();');
         });
         writeln('}');
diff --git a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
index 3c16118..45116ed 100644
--- a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
+++ b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
@@ -143,13 +143,13 @@
     if (type == null) {
       return;
     }
-    type.fields.forEach((TypeObjectField field) {
+    for (var field in type.fields) {
       var name = field.name;
       var components = <String>[];
       components.add(parentName);
       components.addAll(_split(name));
       var fieldConstantName = _fromComponents(components);
       constants.add(_Constant(fieldConstantName, "'$name'"));
-    });
+    }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
index 2c82679..1ee2156 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/base/errors.dart';
-import 'package:_fe_analyzer_shared/src/deferred_closure_heuristic.dart';
+import 'package:_fe_analyzer_shared/src/deferred_function_literal_heuristic.dart';
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -217,26 +217,26 @@
     List<EqualityInfo<PromotableElement, DartType>?>? identicalInfo =
         _isIdentical ? [] : null;
     var parameterMap = _computeParameterMap(rawType?.parameters ?? const []);
-    var deferredClosures = _visitArguments(
+    var deferredFunctionLiterals = _visitArguments(
         parameterMap: parameterMap,
         identicalInfo: identicalInfo,
         substitution: substitution,
         inferrer: inferrer);
-    if (deferredClosures != null) {
+    if (deferredFunctionLiterals != null) {
       bool isFirstStage = true;
-      for (var stage in _ClosureDependencies(
+      for (var stage in _FunctionLiteralDependencies(
               resolver.typeSystem,
-              deferredClosures,
+              deferredFunctionLiterals,
               rawType?.typeFormals.toSet() ?? const {},
               _computeUndeferredParamInfo(
-                  rawType, parameterMap, deferredClosures))
+                  rawType, parameterMap, deferredFunctionLiterals))
           .planReconciliationStages()) {
         if (inferrer != null && !isFirstStage) {
           substitution = Substitution.fromPairs(
               rawType!.typeFormals, inferrer.partialInfer());
         }
-        _resolveDeferredClosures(
-            deferredClosures: stage,
+        _resolveDeferredFunctionLiterals(
+            deferredFunctionLiterals: stage,
             identicalInfo: identicalInfo,
             substitution: substitution,
             inferrer: inferrer);
@@ -271,10 +271,11 @@
   List<_ParamInfo> _computeUndeferredParamInfo(
       FunctionType? rawType,
       Map<Object, ParameterElement> parameterMap,
-      List<_DeferredParamInfo> deferredClosures) {
+      List<_DeferredParamInfo> deferredFunctionLiterals) {
     if (rawType == null) return const [];
     var parameterKeysAlreadyCovered = {
-      for (var closure in deferredClosures) closure.parameterKey
+      for (var functionLiteral in deferredFunctionLiterals)
+        functionLiteral.parameterKey
     };
     return [
       for (var entry in parameterMap.entries)
@@ -443,10 +444,11 @@
   /// the type of the function the invocation is resolved to (with type
   /// arguments not applied yet).
   void resolveInvocation({required FunctionType? rawType}) {
-    var deferredClosures = _visitArguments(
+    var deferredFunctionLiterals = _visitArguments(
         parameterMap: _computeParameterMap(rawType?.parameters ?? const []));
-    if (deferredClosures != null) {
-      _resolveDeferredClosures(deferredClosures: deferredClosures);
+    if (deferredFunctionLiterals != null) {
+      _resolveDeferredFunctionLiterals(
+          deferredFunctionLiterals: deferredFunctionLiterals);
     }
   }
 
@@ -467,15 +469,15 @@
     }
   }
 
-  /// Resolves any closures that were deferred by [_visitArguments].
-  void _resolveDeferredClosures(
-      {required Iterable<_DeferredParamInfo> deferredClosures,
+  /// Resolves any function literals that were deferred by [_visitArguments].
+  void _resolveDeferredFunctionLiterals(
+      {required List<_DeferredParamInfo> deferredFunctionLiterals,
       List<EqualityInfo<PromotableElement, DartType>?>? identicalInfo,
       Substitution? substitution,
       GenericInferrer? inferrer}) {
     var flow = resolver.flowAnalysis.flow;
     var arguments = argumentList.arguments;
-    for (var deferredArgument in deferredClosures) {
+    for (var deferredArgument in deferredFunctionLiterals) {
       var parameter = deferredArgument.parameter;
       DartType? parameterContextType;
       if (parameter != null) {
@@ -509,7 +511,7 @@
       Substitution? substitution,
       GenericInferrer? inferrer}) {
     assert(whyNotPromotedList.isEmpty);
-    List<_DeferredParamInfo>? deferredClosures;
+    List<_DeferredParamInfo>? deferredFunctionLiterals;
     resolver.checkUnreachableNode(argumentList);
     var flow = resolver.flowAnalysis.flow;
     var unnamedArgumentIndex = 0;
@@ -529,12 +531,12 @@
       parameter = parameterMap[parameterKey];
       if (resolver.isInferenceUpdate1Enabled &&
           value is FunctionExpressionImpl) {
-        (deferredClosures ??= [])
+        (deferredFunctionLiterals ??= [])
             .add(_DeferredParamInfo(parameter, value, i, parameterKey));
         identicalInfo?.add(null);
-        // The "why not promoted" list isn't really relevant for closures
-        // because promoting a closure doesn't even make sense.  So we store an
-        // innocuous value in the list.
+        // The "why not promoted" list isn't really relevant for function
+        // literals because promoting a function literal doesn't even make
+        // sense.  So we store an innocuous value in the list.
         whyNotPromotedList.add(() => const {});
       } else {
         DartType? parameterContextType;
@@ -559,7 +561,7 @@
         }
       }
     }
-    return deferredClosures;
+    return deferredFunctionLiterals;
   }
 
   /// Computes the return type of the method or function represented by the
@@ -629,13 +631,30 @@
   }
 }
 
-class _ClosureDependencies extends ClosureDependencies<TypeParameterElement,
-    _ParamInfo, _DeferredParamInfo> {
+/// Information about an invocation argument that needs to be resolved later due
+/// to the fact that it's a function literal and the `inference-update-1`
+/// feature is enabled.
+class _DeferredParamInfo extends _ParamInfo {
+  /// The function literal expression.
+  final FunctionExpression value;
+
+  /// The index into the argument list of the function literal expression.
+  final int index;
+
+  final Object parameterKey;
+
+  _DeferredParamInfo(
+      ParameterElement? parameter, this.value, this.index, this.parameterKey)
+      : super(parameter);
+}
+
+class _FunctionLiteralDependencies extends FunctionLiteralDependencies<
+    TypeParameterElement, _ParamInfo, _DeferredParamInfo> {
   final TypeSystemImpl _typeSystem;
 
   final Set<TypeParameterElement> _typeVariables;
 
-  _ClosureDependencies(
+  _FunctionLiteralDependencies(
       this._typeSystem,
       Iterable<_DeferredParamInfo> deferredParamInfo,
       this._typeVariables,
@@ -680,23 +699,6 @@
   }
 }
 
-/// Information about an invocation argument that needs to be resolved later due
-/// to the fact that it's a closure and the `inference-update-1` feature is
-/// enabled.
-class _DeferredParamInfo extends _ParamInfo {
-  /// The closure expression.
-  final FunctionExpression value;
-
-  /// The index into the argument list of the closure expression.
-  final int index;
-
-  final Object parameterKey;
-
-  _DeferredParamInfo(
-      ParameterElement? parameter, this.value, this.index, this.parameterKey)
-      : super(parameter);
-}
-
 /// Information about an invocation argument that may or may not have already
 /// been resolved, as part of the deferred resolution mechanism for the
 /// `inference-update-1` feature.
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 738c40b..573457d 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -500,7 +500,7 @@
   /// On Windows, a path is absolute if it starts with `\\`
   /// (two backslashes or representing a UNC path) or with a drive letter
   /// between `a` and `z` (upper or lower case) followed by `:\` or `:/`.
-  /// The makes, for example, `\file.ext` a non-absolute path
+  /// This makes, for example, `\file.ext` a non-absolute path
   /// because it depends on the current drive letter.
   ///
   /// On non-Windows, a path is absolute if it starts with `/`.
@@ -699,7 +699,7 @@
   static Future<bool> isFile(String path) => _getType(_toUtf8Array(path), true)
       .then((type) => (type == FileSystemEntityType.file));
 
-  /// Whether [path]] refers to a directory.
+  /// Whether [path] refers to a directory.
   ///
   /// Checks whether `type(path)` returns [FileSystemEntityType.directory].
   static Future<bool> isDirectory(String path) =>
diff --git a/tools/VERSION b/tools/VERSION
index fda6b19..37c54e9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 14
+PRERELEASE 15
 PRERELEASE_PATCH 0
\ No newline at end of file