Version 2.17.0-246.0.dev

Merge commit '5050f31b29950b527e580f5fe2e26ac85fd2bad2' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index a9b52c3..4f359ad 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -40,16 +40,6 @@
     50,
     "Remove '{0}'",
   );
-  static const REPLACE_WITH_STRICT_CASTS = FixKind(
-    'analysisOptions.fix.replaceWithStrictCasts',
-    50,
-    'Replace with the strict-casts analysis mode',
-  );
-  static const REPLACE_WITH_STRICT_RAW_TYPES = FixKind(
-    'analysisOptions.fix.replaceWithStrictRawTypes',
-    50,
-    'Replace with the strict-raw-types analysis mode',
-  );
 }
 
 /// The implementation of [DartFixContext].
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
index 5e36f57..8c148db 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
@@ -16,12 +16,9 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/options_rule_validator.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_yaml.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
-import 'package:collection/collection.dart';
 import 'package:yaml/yaml.dart';
-import 'package:yaml_edit/yaml_edit.dart';
 
 /// The generator used to generate fixes in analysis options files.
 class AnalysisOptionsFixGenerator {
@@ -70,26 +67,7 @@
 //        AnalysisOptionsHintCode.STRONG_MODE_SETTING_DEPRECATED) {
 //    } else
 
-    if (errorCode ==
-        AnalysisOptionsWarningCode
-            .ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT) {
-      var analyzerMap = options['analyzer'];
-      if (analyzerMap is! YamlMap) {
-        return fixes;
-      }
-      var strongModeMap = analyzerMap['strong-mode'];
-
-      if (strongModeMap is! YamlMap) {
-        return fixes;
-      }
-      if (_isErrorAtMapKey(strongModeMap, 'implicit-casts')) {
-        await _addFix_replaceWithStrictCasts(
-            coveringNodePath, analyzerMap, strongModeMap);
-      } else if (_isErrorAtMapKey(strongModeMap, 'implicit-dynamic')) {
-        await _addFix_replaceWithStrictRawTypes(
-            coveringNodePath, analyzerMap, strongModeMap);
-      }
-    } else if (errorCode == DEPRECATED_LINT_HINT) {
+    if (errorCode == DEPRECATED_LINT_HINT) {
       await _addFix_removeLint(coveringNodePath);
     } else if (errorCode ==
         AnalysisOptionsHintCode.SUPER_MIXINS_SETTING_DEPRECATED) {
@@ -131,52 +109,6 @@
     }
   }
 
-  /// Replaces `analyzer: strong-mode: implicit-casts: false` with
-  /// `analyzer: language: strict-casts: true`.
-  Future<void> _addFix_replaceWithStrictCasts(List<YamlNode> coveringNodePath,
-      YamlMap analyzerMap, YamlMap strongModeMap) async {
-    var builder =
-        ChangeBuilder(workspace: _NonDartChangeWorkspace(resourceProvider));
-    await builder.addYamlFileEdit(file, (builder) {
-      _replaceStrongModeEntryWithLanguageEntry(
-        builder,
-        coveringNodePath,
-        analyzerMap,
-        strongModeMap,
-        strongModeKey: 'implicit-casts',
-        languageKey: 'strict-casts',
-        languageValue: true,
-      );
-    });
-    _addFixFromBuilder(
-        builder, AnalysisOptionsFixKind.REPLACE_WITH_STRICT_CASTS,
-        args: [coveringNodePath[0].toString()]);
-  }
-
-  /// Replaces `analyzer: strong-mode: implicit-dynamic: false` with
-  /// `analyzer: language: strict-raw-types: true`.
-  Future<void> _addFix_replaceWithStrictRawTypes(
-      List<YamlNode> coveringNodePath,
-      YamlMap analyzerMap,
-      YamlMap strongModeMap) async {
-    var builder =
-        ChangeBuilder(workspace: _NonDartChangeWorkspace(resourceProvider));
-    await builder.addYamlFileEdit(file, (builder) {
-      _replaceStrongModeEntryWithLanguageEntry(
-        builder,
-        coveringNodePath,
-        analyzerMap,
-        strongModeMap,
-        strongModeKey: 'implicit-dynamic',
-        languageKey: 'strict-raw-types',
-        languageValue: true,
-      );
-    });
-    _addFixFromBuilder(
-        builder, AnalysisOptionsFixKind.REPLACE_WITH_STRICT_RAW_TYPES,
-        args: [coveringNodePath[0].toString()]);
-  }
-
   /// Add a fix whose edits were built by the [builder] that has the given
   /// [kind]. If [args] are provided, they will be used to fill in the message
   /// for the fix.
@@ -259,20 +191,6 @@
     return offset;
   }
 
-  /// Returns whether the error is located within [map], covering the
-  /// [YamlScalar] node for [key].
-  bool _isErrorAtMapKey(YamlMap map, String key) {
-    var keyNode = map.nodes.keys
-        .whereType<YamlScalar>()
-        .firstWhereOrNull((k) => k.value == key);
-    if (keyNode == null) {
-      return false;
-    }
-    var keyOffset = keyNode.span.start.offset;
-    var keyLength = keyNode.span.end.offset - keyOffset;
-    return keyOffset == errorOffset && keyLength == errorLength;
-  }
-
   SourceRange _lines(int start, int end) {
     var startLocation = lineInfo.getLocation(start);
     var startOffset = lineInfo.getOffsetOfLine(startLocation.lineNumber - 1);
@@ -281,53 +199,6 @@
         math.min(endLocation.lineNumber, lineInfo.lineCount - 1));
     return SourceRange(startOffset, endOffset - startOffset);
   }
-
-  /// Replaces a 'strong-mode' entry keyed to [strongModeKey] with a 'language'
-  /// entry with [languageKey] and [languageValue].
-  ///
-  /// 'strong-mode' and 'language' are each maps which can be found under the
-  /// top-level 'analyzer' map. 'strong-mode' (given as [strongModeMap]) must
-  /// already be present under the 'analyzer' map (given as [analyzerMap]).
-  void _replaceStrongModeEntryWithLanguageEntry(
-    YamlFileEditBuilder builder,
-    List<YamlNode> coveringNodePath,
-    YamlMap analyzerMap,
-    YamlMap strongModeMap, {
-    required String strongModeKey,
-    required String languageKey,
-    required Object? languageValue,
-  }) {
-    var yamlEditor = YamlEditor(content);
-    // If 'language' does not exist yet under 'analyzer', create it.
-    if (analyzerMap['language'] == null) {
-      yamlEditor.update(['analyzer', 'language'], {languageKey: languageValue});
-    } else {
-      yamlEditor.update(['analyzer', 'language', languageKey], languageValue);
-    }
-    var languageEdit = yamlEditor.edits.single;
-    builder.addSimpleReplacement(
-        SourceRange(languageEdit.offset, languageEdit.length),
-        languageEdit.replacement);
-
-    // If `strongModeKey` is the only entry under 'strong-mode', then remove
-    // the entire 'strong-mode' entry.
-    if (strongModeMap.length == 1) {
-      yamlEditor.remove(['analyzer', 'strong-mode']);
-    } else {
-      yamlEditor.remove(['analyzer', 'strong-mode', strongModeKey]);
-    }
-    var strongModeEdit = yamlEditor.edits[1];
-    int strongModeEditOffset;
-    if (strongModeEdit.offset > languageEdit.offset) {
-      strongModeEditOffset = strongModeEdit.offset -
-          (languageEdit.replacement.length - languageEdit.length);
-    } else {
-      strongModeEditOffset = strongModeEdit.offset;
-    }
-    builder.addSimpleReplacement(
-        SourceRange(strongModeEditOffset, strongModeEdit.length),
-        strongModeEdit.replacement);
-  }
 }
 
 class _NonDartChangeWorkspace implements ChangeWorkspace {
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 98487cb..5f62d61 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -29,7 +29,6 @@
   path: any
   watcher: any
   yaml: any
-  yaml_edit: any
 
 dev_dependencies:
   analyzer_utilities:
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 3d99a77..ab5be7e 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -66,10 +66,6 @@
 
   Future<AnalysisSession> get session => sessionFor(testPackageRootPath);
 
-  /// The path for `analysis_options.yaml` in [testPackageRootPath].
-  String get testAnalysisOptionsPath =>
-      convertPath('$testPackageRootPath/analysis_options.yaml');
-
   String? get testPackageLanguageVersion => latestLanguageVersion;
 
   String get testPackageLibPath => '$testPackageRootPath/lib';
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index f4d93622..816c714 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -43,6 +43,8 @@
 /// TODO(scheglov) this is duplicate
 class AnalysisOptionsFileConfig {
   final List<String> experiments;
+  final bool implicitCasts;
+  final bool implicitDynamic;
   final List<String> lints;
   final bool strictCasts;
   final bool strictInference;
@@ -50,6 +52,8 @@
 
   AnalysisOptionsFileConfig({
     this.experiments = const [],
+    this.implicitCasts = true,
+    this.implicitDynamic = true,
     this.lints = const [],
     this.strictCasts = false,
     this.strictInference = false,
@@ -68,6 +72,9 @@
     buffer.writeln('    strict-casts: $strictCasts');
     buffer.writeln('    strict-inference: $strictInference');
     buffer.writeln('    strict-raw-types: $strictRawTypes');
+    buffer.writeln('  strong-mode:');
+    buffer.writeln('    implicit-casts: $implicitCasts');
+    buffer.writeln('    implicit-dynamic: $implicitDynamic');
 
     buffer.writeln('linter:');
     buffer.writeln('  rules:');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/replace_with_strict_casts_test.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/replace_with_strict_casts_test.dart
deleted file mode 100644
index c8be60d..0000000
--- a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/replace_with_strict_casts_test.dart
+++ /dev/null
@@ -1,163 +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:test_reflective_loader/test_reflective_loader.dart';
-
-import 'test_support.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ReplaceWithStrictCastsTest);
-  });
-}
-
-@reflectiveTest
-class ReplaceWithStrictCastsTest extends AnalysisOptionsFixTest {
-  Future<void> test_hasLanguage() async {
-    await assertHasFix('''
-analyzer:
-  language:
-    strict-inference: true
-  strong-mode:
-    implicit-casts: false
-''', '''
-analyzer:
-  language:
-    strict-casts: true
-    strict-inference: true
-''');
-  }
-
-  Future<void> test_hasLanguage_isAfter() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-casts: false
-  language:
-    strict-inference: true
-''', '''
-analyzer:
-  language:
-    strict-casts: true
-    strict-inference: true
-''');
-  }
-
-  Future<void> test_hasStrictCastsFalse() async {
-    await assertHasFix('''
-analyzer:
-  language:
-    strict-casts: false
-  strong-mode:
-    implicit-casts: false
-''', '''
-analyzer:
-  language:
-    strict-casts: true
-''');
-  }
-
-  Future<void> test_hasStrictCastsTrue() async {
-    await assertHasFix('''
-analyzer:
-  language:
-    strict-casts: true
-  strong-mode:
-    implicit-casts: false
-''', '''
-analyzer:
-  language:
-    strict-casts: true
-''');
-  }
-
-  Future<void> test_noLanguage() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-casts: false
-''', '''
-analyzer:
-  language:
-    strict-casts: true
-''');
-  }
-
-  Future<void> test_noLanguage_analyzerHasOtherEntries() async {
-    await assertHasFix('''
-analyzer:
-  errors:
-    unused_import: ignore
-  strong-mode:
-    implicit-casts: false
-''', '''
-analyzer:
-  errors:
-    unused_import: ignore
-  language:
-    strict-casts: true
-''');
-  }
-
-  Future<void> test_noLanguage_analyzerHasOtherEntriesAfter() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-casts: false
-  errors:
-    unused_import: ignore
-''', '''
-analyzer:
-  errors:
-    unused_import: ignore
-  language:
-    strict-casts: true
-''');
-  }
-
-  Future<void> test_noLanguage_hasOtherStrongModeEntry() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
-''', '''
-analyzer:
-  language:
-    strict-casts: true
-  strong-mode:
-    implicit-dynamic: false
-''', errorFilter: (error) => error.message.contains('implicit-casts'));
-  }
-
-  Future<void> test_noLanguage_implicitCastsHasComment() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    # No implicit casts
-    implicit-casts: false
-''', '''
-analyzer:
-  language:
-    strict-casts: true
-''');
-  }
-
-  Future<void> test_noLanguage_strongModeHasComment() async {
-    // TODO(srawlins): This is unfortunate; it would be better to remove the
-    // comment. But we leave this assertion as is to show at least the file is
-    // not corrupted.
-    await assertHasFix('''
-analyzer:
-  # Strong mode
-  strong-mode:
-    implicit-casts: false
-''', '''
-analyzer:
-  # Strong mode
-  language:
-    strict-casts: true
-''');
-  }
-}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/replace_with_strict_raw_types_test.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/replace_with_strict_raw_types_test.dart
deleted file mode 100644
index eb8012d..0000000
--- a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/replace_with_strict_raw_types_test.dart
+++ /dev/null
@@ -1,163 +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:test_reflective_loader/test_reflective_loader.dart';
-
-import 'test_support.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ReplaceWithStrictRawTypesTest);
-  });
-}
-
-@reflectiveTest
-class ReplaceWithStrictRawTypesTest extends AnalysisOptionsFixTest {
-  Future<void> test_hasLanguage() async {
-    await assertHasFix('''
-analyzer:
-  language:
-    strict-inference: true
-  strong-mode:
-    implicit-dynamic: false
-''', '''
-analyzer:
-  language:
-    strict-inference: true
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_hasLanguage_isAfter() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-dynamic: false
-  language:
-    strict-inference: true
-''', '''
-analyzer:
-  language:
-    strict-inference: true
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_hasStrictRawTypesFalse() async {
-    await assertHasFix('''
-analyzer:
-  language:
-    strict-raw-types: false
-  strong-mode:
-    implicit-dynamic: false
-''', '''
-analyzer:
-  language:
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_hasStrictRawTypesTrue() async {
-    await assertHasFix('''
-analyzer:
-  language:
-    strict-raw-types: true
-  strong-mode:
-    implicit-dynamic: false
-''', '''
-analyzer:
-  language:
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_noLanguage() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-dynamic: false
-''', '''
-analyzer:
-  language:
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_noLanguage_analyzerHasOtherEntries() async {
-    await assertHasFix('''
-analyzer:
-  errors:
-    unused_import: ignore
-  strong-mode:
-    implicit-dynamic: false
-''', '''
-analyzer:
-  errors:
-    unused_import: ignore
-  language:
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_noLanguage_analyzerHasOtherEntriesAfter() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-dynamic: false
-  errors:
-    unused_import: ignore
-''', '''
-analyzer:
-  errors:
-    unused_import: ignore
-  language:
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_noLanguage_hasOtherStrongModeEntry() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
-''', '''
-analyzer:
-  language:
-    strict-raw-types: true
-  strong-mode:
-    implicit-casts: false
-''', errorFilter: (error) => error.message.contains('implicit-dynamic'));
-  }
-
-  Future<void> test_noLanguage_implicitDynamicHasComment() async {
-    await assertHasFix('''
-analyzer:
-  strong-mode:
-    # No implicit dynamic
-    implicit-dynamic: false
-''', '''
-analyzer:
-  language:
-    strict-raw-types: true
-''');
-  }
-
-  Future<void> test_noLanguage_strongModeHasComment() async {
-    // TODO(srawlins): This is unfortunate; it would be better to remove the
-    // comment. But we leave this assertion as is to show at least the file is
-    // not corrupted.
-    await assertHasFix('''
-analyzer:
-  # Strong mode
-  strong-mode:
-    implicit-dynamic: false
-''', '''
-analyzer:
-  # Strong mode
-  language:
-    strict-raw-types: true
-''');
-  }
-}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart
index c4d940e..6d61c19 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart
@@ -6,15 +6,10 @@
 
 import 'remove_lint_test.dart' as remove_lint;
 import 'remove_setting_test.dart' as remove_setting;
-import 'replace_with_strict_casts_test.dart' as replace_with_strict_casts;
-import 'replace_with_strict_raw_types_test.dart'
-    as replace_with_strict_raw_types;
 
 void main() {
   defineReflectiveSuite(() {
     remove_lint.main();
     remove_setting.main();
-    replace_with_strict_casts.main();
-    replace_with_strict_raw_types.main();
   });
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_support.dart
index d5cc2c4..058fc31 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_support.dart
@@ -3,13 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/protocol_server.dart' show SourceEdit;
 import 'package:analysis_server/src/services/correction/fix/analysis_options/fix_generator.dart';
-import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart'
-    hide AnalysisError;
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:yaml/yaml.dart';
 
@@ -17,11 +16,8 @@
 /// errors in Dart files.
 class AnalysisOptionsFixTest with ResourceProviderMixin {
   Future<void> assertHasFix(
-    String initialContent,
-    String expectedContent, {
-    bool Function(AnalysisError)? errorFilter,
-  }) async {
-    var fixes = await _getFixes(initialContent, errorFilter: errorFilter);
+      String initialContent, String expectedContent) async {
+    var fixes = await _getFixes(initialContent);
     expect(fixes, hasLength(1));
     var fileEdits = fixes[0].change.edits;
     expect(fileEdits, hasLength(1));
@@ -36,11 +32,8 @@
     expect(fixes, hasLength(0));
   }
 
-  Future<List<Fix>> _getFixes(
-    String content, {
-    bool Function(AnalysisError)? errorFilter,
-  }) {
-    var optionsFile = newFile2('/analysis_options.yaml', content);
+  Future<List<Fix>> _getFixes(String content) {
+    var optionsFile = getFile('/analysis_options.yaml');
     var sourceFactory = SourceFactory([]);
     var errors = analyzeAnalysisOptions(
       optionsFile.createSource(),
@@ -48,12 +41,6 @@
       sourceFactory,
       '/',
     );
-    if (errorFilter != null) {
-      if (errors.length == 1) {
-        fail('Unnecessary error filter');
-      }
-      errors = errors.where(errorFilter).toList();
-    }
     expect(errors, hasLength(1));
     var error = errors[0];
     var options = _parseYaml(content);
diff --git a/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart b/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart
index 962d243..cbe95e2 100644
--- a/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart
+++ b/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart
@@ -135,17 +135,6 @@
   );
 
   /**
-   * An error code indicating that the given option is deprecated.
-   */
-  static const AnalysisOptionsWarningCode
-      ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT = AnalysisOptionsWarningCode(
-    'ANALYSIS_OPTION_DEPRECATED',
-    "The option '{0}' is no longer supported.",
-    correctionMessage: "Try using the new '{1}' option.",
-    uniqueName: 'ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT',
-  );
-
-  /**
    * An error code indicating a specified include file has a warning.
    *
    * Parameters:
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 3c67e40..ea2f3f4 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -635,48 +635,43 @@
   void validate(ErrorReporter reporter, YamlMap options) {
     var analyzer = options.valueAt(AnalyzerOptions.analyzer);
     if (analyzer is YamlMap) {
-      var strongModeNode = analyzer.valueAt(AnalyzerOptions.strong_mode);
-      if (strongModeNode is YamlScalar) {
-        return _validateStrongModeAsScalar(reporter, strongModeNode);
-      } else if (strongModeNode is YamlMap) {
-        return _validateStrongModeAsMap(reporter, strongModeNode);
-      } else if (strongModeNode != null) {
-        reporter.reportErrorForSpan(
-            AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
-            strongModeNode.span,
-            [AnalyzerOptions.enableExperiment]);
-      }
-    }
-  }
-
-  void _validateStrongModeAsMap(
-      ErrorReporter reporter, YamlMap strongModeNode) {
-    strongModeNode.nodes.forEach((k, v) {
-      if (k is YamlScalar) {
-        var key = k.value?.toString();
-        if (!AnalyzerOptions.strongModeOptions.contains(key)) {
-          _builder.reportError(reporter, AnalyzerOptions.strong_mode, k);
-        } else if (key == AnalyzerOptions.declarationCasts) {
+      var v = analyzer.valueAt(AnalyzerOptions.strong_mode);
+      if (v is YamlScalar) {
+        var value = toLowerCase(v.value);
+        if (!AnalyzerOptions.trueOrFalse.contains(value)) {
           reporter.reportErrorForSpan(
-              AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED,
-              k.span,
-              [AnalyzerOptions.declarationCasts]);
-        } else if (key == AnalyzerOptions.implicitCasts) {
+              AnalysisOptionsWarningCode.UNSUPPORTED_VALUE, v.span, [
+            AnalyzerOptions.strong_mode,
+            v.value,
+            AnalyzerOptions.trueOrFalseProposal
+          ]);
+        } else if (value == 'false') {
           reporter.reportErrorForSpan(
-              AnalysisOptionsWarningCode
-                  .ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT,
-              k.span,
-              [AnalyzerOptions.implicitCasts, 'strict-casts']);
-        } else if (key == AnalyzerOptions.implicitDynamic) {
+              AnalysisOptionsWarningCode.SPEC_MODE_REMOVED, v.span);
+        } else if (value == 'true') {
           reporter.reportErrorForSpan(
-              AnalysisOptionsWarningCode
-                  .ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT,
-              k.span,
-              [AnalyzerOptions.implicitDynamic, 'strict-raw-types']);
-        } else {
-          // The key is valid.
-          if (v is YamlScalar) {
-            var value = toLowerCase(v.value);
+              AnalysisOptionsHintCode.STRONG_MODE_SETTING_DEPRECATED, v.span);
+        }
+      } else if (v is YamlMap) {
+        v.nodes.forEach((k, v) {
+          String? key, value;
+          bool validKey = false;
+          if (k is YamlScalar) {
+            key = k.value?.toString();
+            if (!AnalyzerOptions.strongModeOptions.contains(key)) {
+              _builder.reportError(reporter, AnalyzerOptions.strong_mode, k);
+            } else if (key == AnalyzerOptions.declarationCasts) {
+              reporter.reportErrorForSpan(
+                  AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED,
+                  k.span,
+                  [AnalyzerOptions.declarationCasts]);
+            } else {
+              // If we have a valid key, go on and check the value.
+              validKey = true;
+            }
+          }
+          if (validKey && v is YamlScalar) {
+            value = toLowerCase(v.value);
             if (!AnalyzerOptions.trueOrFalse.contains(value)) {
               reporter.reportErrorForSpan(
                   AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
@@ -684,28 +679,13 @@
                   [key!, v.value, AnalyzerOptions.trueOrFalseProposal]);
             }
           }
-        }
+        });
+      } else if (v != null) {
+        reporter.reportErrorForSpan(
+            AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
+            v.span,
+            [AnalyzerOptions.enableExperiment]);
       }
-    });
-  }
-
-  void _validateStrongModeAsScalar(
-      ErrorReporter reporter, YamlScalar strongModeNode) {
-    var stringValue = toLowerCase(strongModeNode.value);
-    if (!AnalyzerOptions.trueOrFalse.contains(stringValue)) {
-      reporter.reportErrorForSpan(
-          AnalysisOptionsWarningCode.UNSUPPORTED_VALUE, strongModeNode.span, [
-        AnalyzerOptions.strong_mode,
-        strongModeNode.value,
-        AnalyzerOptions.trueOrFalseProposal
-      ]);
-    } else if (stringValue == 'false') {
-      reporter.reportErrorForSpan(
-          AnalysisOptionsWarningCode.SPEC_MODE_REMOVED, strongModeNode.span);
-    } else if (stringValue == 'true') {
-      reporter.reportErrorForSpan(
-          AnalysisOptionsHintCode.STRONG_MODE_SETTING_DEPRECATED,
-          strongModeNode.span);
     }
   }
 }
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 0b689ee..372e4e8 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -74,11 +74,6 @@
   ANALYSIS_OPTION_DEPRECATED:
     problemMessage: "The option '{0}' is no longer supported."
     comment: An error code indicating that the given option is deprecated.
-  ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT:
-    sharedName: ANALYSIS_OPTION_DEPRECATED
-    problemMessage: "The option '{0}' is no longer supported."
-    correctionMessage: "Try using the new '{1}' option."
-    comment: An error code indicating that the given option is deprecated.
   INCLUDED_FILE_WARNING:
     problemMessage: "Warning in the included options file {0}({1}..{2}): {3}"
     comment: |-
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 0afa6ef..bf13737 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -460,22 +460,6 @@
 ''', [AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED]);
   }
 
-  test_analyzer_strong_mode_deprecated_key_implicit_casts() {
-    validate('''
-analyzer:
-  strong-mode:
-    implicit-casts: false
-''', [AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT]);
-  }
-
-  test_analyzer_strong_mode_deprecated_key_implicit_dynamic() {
-    validate('''
-analyzer:
-  strong-mode:
-    implicit-dynamic: false
-''', [AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED_WITH_REPLACEMENT]);
-  }
-
   test_analyzer_strong_mode_error_code_supported() {
     validate('''
 analyzer:
@@ -507,6 +491,14 @@
 ''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES]);
   }
 
+  test_analyzer_strong_mode_unsupported_value() {
+    validate('''
+analyzer:
+  strong-mode:
+    implicit-dynamic: foo
+''', [AnalysisOptionsWarningCode.UNSUPPORTED_VALUE]);
+  }
+
   test_analyzer_supported_exclude() {
     validate('''
 analyzer:
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 5ea1a4a..dca43e9 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -181,7 +181,11 @@
           this,
           path,
           loadYamlDocument(
-              workspace.resourceProvider.getFile(path).readAsStringSync(),
+              workspace
+                  .getSession(path)!
+                  .resourceProvider
+                  .getFile(path)
+                  .readAsStringSync(),
               recover: true),
           0);
       _yamlFileEditBuilders[path] = builder;
diff --git a/tools/VERSION b/tools/VERSION
index f24b7e4..02e0b9d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 245
+PRERELEASE 246
 PRERELEASE_PATCH 0
\ No newline at end of file