Move AnalysisOptionsFile (yaml keys and values) out of validator file.

Change-Id: I978acaac38a502fbd97683d1dc3631617924d720
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/443420
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart b/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
index 91b6ba0..056a674 100644
--- a/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
+++ b/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
@@ -8,7 +8,7 @@
 import 'package:analyzer/dart/analysis/formatter_options.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/analysis_options/options_file_validator.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/lint/registry.dart';
 
diff --git a/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart b/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart
index c9759e9..de5fe7c 100644
--- a/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/analysis_options/options_file_validator.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/test_utilities/lint_registration_mixin.dart';
 import 'package:linter/src/rules.dart';
diff --git a/pkg/analyzer/lib/source/error_processor.dart b/pkg/analyzer/lib/source/error_processor.dart
index 0ef1d20..eaffd4c 100644
--- a/pkg/analyzer/lib/source/error_processor.dart
+++ b/pkg/analyzer/lib/source/error_processor.dart
@@ -4,7 +4,7 @@
 
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/analysis_options/options_file_validator.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_file.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_file.dart
new file mode 100644
index 0000000..6a6d291
--- /dev/null
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_file.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2025, 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:analyzer/source/error_processor.dart';
+import 'package:analyzer/src/utilities/extensions/string.dart';
+
+/// Options (keys) that can be specified in an analysis options file.
+final class AnalysisOptionsFile {
+  // Top-level options.
+  static const String analyzer = 'analyzer';
+  static const String codeStyle = 'code-style';
+  static const String formatter = 'formatter';
+  static const String linter = 'linter';
+
+  /// The shared key for top-level plugins and `analyzer`-level plugins.
+  static const String plugins = 'plugins';
+
+  // `analyzer` analysis options.
+  static const String cannotIgnore = 'cannot-ignore';
+  static const String enableExperiment = 'enable-experiment';
+  static const String errors = 'errors';
+  static const String exclude = 'exclude';
+  static const String include = 'include';
+  static const String language = 'language';
+  static const String optionalChecks = 'optional-checks';
+  static const String strongMode = 'strong-mode';
+
+  // Optional checks options.
+  static const String chromeOsManifestChecks = 'chrome-os-manifest-checks';
+
+  // Strong mode options (see AnalysisOptionsImpl for documentation).
+  static const String declarationCasts = 'declaration-casts';
+  static const String implicitCasts = 'implicit-casts';
+  static const String implicitDynamic = 'implicit-dynamic';
+
+  // Language options (see AnalysisOptionsImpl for documentation).
+  static const String strictCasts = 'strict-casts';
+  static const String strictInference = 'strict-inference';
+  static const String strictRawTypes = 'strict-raw-types';
+
+  // Code style options.
+  static const String format = 'format';
+
+  /// Ways to say `ignore`.
+  static const List<String> ignoreSynonyms = ['ignore', 'false'];
+
+  /// Valid error `severity`s.
+  static final List<String> severities = List.unmodifiable(severityMap.keys);
+
+  /// Ways to say `include`.
+  static const List<String> includeSynonyms = ['include', 'true'];
+
+  // Formatter options.
+  static const String pageWidth = 'page_width';
+  static const String trailingCommas = 'trailing_commas';
+
+  // Linter options.
+  static const String rules = 'rules';
+
+  // Plugins options.
+  static const String diagnostics = 'diagnostics';
+  static const String path = 'path';
+  static const String version = 'version';
+
+  /// Supported 'plugins' options.
+  static const Set<String> pluginsOptions = {diagnostics, path, version};
+
+  static const String propagateLinterExceptions = 'propagate-linter-exceptions';
+
+  /// Ways to say `true` or `false`.
+  static const List<String> trueOrFalse = ['true', 'false'];
+
+  /// Supported top-level `analyzer` options.
+  static const Set<String> analyzerOptions = {
+    cannotIgnore,
+    enableExperiment,
+    errors,
+    exclude,
+    language,
+    optionalChecks,
+    plugins,
+    strongMode,
+  };
+
+  /// Supported `analyzer` strong-mode options.
+  ///
+  /// This section is deprecated.
+  static const Set<String> strongModeOptions = {
+    declarationCasts,
+    implicitCasts,
+    implicitDynamic,
+  };
+
+  /// Supported `analyzer` language options.
+  static const Set<String> languageOptions = {
+    strictCasts,
+    strictInference,
+    strictRawTypes,
+  };
+
+  /// Supported 'linter' options.
+  static const Set<String> linterOptions = {rules};
+
+  /// Supported 'analyzer' optional checks options.
+  static const Set<String> optionalChecksOptions = {
+    chromeOsManifestChecks,
+    propagateLinterExceptions,
+  };
+
+  /// Proposed values for a `true` or `false` option.
+  static String get trueOrFalseProposal =>
+      AnalysisOptionsFile.trueOrFalse.quotedAndCommaSeparatedWithAnd;
+}
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index ca6defe..b6ed248 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/file_source.dart';
 import 'package:analyzer/source/source.dart';
-import 'package:analyzer/src/analysis_options/options_file_validator.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/generated/source.dart' show SourceFactory;
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/yaml.dart';
diff --git a/pkg/analyzer/lib/src/analysis_options/options_file_validator.dart b/pkg/analyzer/lib/src/analysis_options/options_file_validator.dart
index 42ab71f..2157816 100644
--- a/pkg/analyzer/lib/src/analysis_options/options_file_validator.dart
+++ b/pkg/analyzer/lib/src/analysis_options/options_file_validator.dart
@@ -6,8 +6,8 @@
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/source/source.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/analysis_options/error/option_codes.dart';
 import 'package:analyzer/src/analysis_options/options_validator.dart';
@@ -260,114 +260,6 @@
   return recorder.diagnostics;
 }
 
-/// Options (keys) that can be specified in an analysis options file.
-final class AnalysisOptionsFile {
-  // Top-level options.
-  static const String analyzer = 'analyzer';
-  static const String codeStyle = 'code-style';
-  static const String formatter = 'formatter';
-  static const String linter = 'linter';
-
-  /// The shared key for top-level plugins and `analyzer`-level plugins.
-  static const String plugins = 'plugins';
-
-  // `analyzer` analysis options.
-  static const String cannotIgnore = 'cannot-ignore';
-  static const String enableExperiment = 'enable-experiment';
-  static const String errors = 'errors';
-  static const String exclude = 'exclude';
-  static const String include = 'include';
-  static const String language = 'language';
-  static const String optionalChecks = 'optional-checks';
-  static const String strongMode = 'strong-mode';
-
-  // Optional checks options.
-  static const String chromeOsManifestChecks = 'chrome-os-manifest-checks';
-
-  // Strong mode options (see AnalysisOptionsImpl for documentation).
-  static const String declarationCasts = 'declaration-casts';
-  static const String implicitCasts = 'implicit-casts';
-  static const String implicitDynamic = 'implicit-dynamic';
-
-  // Language options (see AnalysisOptionsImpl for documentation).
-  static const String strictCasts = 'strict-casts';
-  static const String strictInference = 'strict-inference';
-  static const String strictRawTypes = 'strict-raw-types';
-
-  // Code style options.
-  static const String format = 'format';
-
-  /// Ways to say `ignore`.
-  static const List<String> ignoreSynonyms = ['ignore', 'false'];
-
-  /// Valid error `severity`s.
-  static final List<String> severities = List.unmodifiable(severityMap.keys);
-
-  /// Ways to say `include`.
-  static const List<String> includeSynonyms = ['include', 'true'];
-
-  // Formatter options.
-  static const String pageWidth = 'page_width';
-  static const String trailingCommas = 'trailing_commas';
-
-  // Linter options.
-  static const String rules = 'rules';
-
-  // Plugins options.
-  static const String diagnostics = 'diagnostics';
-  static const String path = 'path';
-  static const String version = 'version';
-
-  /// Supported 'plugins' options.
-  static const Set<String> _pluginsOptions = {diagnostics, path, version};
-
-  static const String propagateLinterExceptions = 'propagate-linter-exceptions';
-
-  /// Ways to say `true` or `false`.
-  static const List<String> _trueOrFalse = ['true', 'false'];
-
-  /// Supported top-level `analyzer` options.
-  static const Set<String> _analyzerOptions = {
-    cannotIgnore,
-    enableExperiment,
-    errors,
-    exclude,
-    language,
-    optionalChecks,
-    plugins,
-    strongMode,
-  };
-
-  /// Supported `analyzer` strong-mode options.
-  ///
-  /// This section is deprecated.
-  static const Set<String> _strongModeOptions = {
-    declarationCasts,
-    implicitCasts,
-    implicitDynamic,
-  };
-
-  /// Supported `analyzer` language options.
-  static const Set<String> _languageOptions = {
-    strictCasts,
-    strictInference,
-    strictRawTypes,
-  };
-
-  /// Supported 'linter' options.
-  static const Set<String> _linterOptions = {rules};
-
-  /// Supported 'analyzer' optional checks options.
-  static const Set<String> _optionalChecksOptions = {
-    chromeOsManifestChecks,
-    propagateLinterExceptions,
-  };
-
-  /// Proposed values for a `true` or `false` option.
-  static String get _trueOrFalseProposal =>
-      AnalysisOptionsFile._trueOrFalse.quotedAndCommaSeparatedWithAnd;
-}
-
 /// Validates `analyzer` options.
 class AnalyzerOptionsValidator extends _CompositeValidator {
   AnalyzerOptionsValidator()
@@ -419,7 +311,7 @@
 /// Validates `analyzer` top-level options.
 class _AnalyzerTopLevelOptionsValidator extends _TopLevelOptionValidator {
   _AnalyzerTopLevelOptionsValidator()
-    : super(AnalysisOptionsFile.analyzer, AnalysisOptionsFile._analyzerOptions);
+    : super(AnalysisOptionsFile.analyzer, AnalysisOptionsFile.analyzerOptions);
 }
 
 /// Validates the `analyzer` `cannot-ignore` option.
@@ -540,7 +432,7 @@
         arguments: [
           AnalysisOptionsFile.format,
           format.valueOrThrow,
-          AnalysisOptionsFile._trueOrFalseProposal,
+          AnalysisOptionsFile.trueOrFalseProposal,
         ],
       );
     }
@@ -812,7 +704,7 @@
 /// Validates `analyzer` language configuration options.
 class _LanguageOptionValidator extends OptionsValidator {
   final _ErrorBuilder _builder = _ErrorBuilder(
-    AnalysisOptionsFile._languageOptions,
+    AnalysisOptionsFile.languageOptions,
   );
 
   @override
@@ -826,7 +718,7 @@
           bool validKey = false;
           if (k is YamlScalar) {
             key = k.value?.toString();
-            if (!AnalysisOptionsFile._languageOptions.contains(key)) {
+            if (!AnalysisOptionsFile.languageOptions.contains(key)) {
               _builder.reportError(reporter, AnalysisOptionsFile.language, k);
             } else {
               // If we have a valid key, go on and check the value.
@@ -837,14 +729,14 @@
             value = toLowerCase(v.value);
             // `null` is not a valid key, so we can safely assume `key` is
             // non-`null`.
-            if (!AnalysisOptionsFile._trueOrFalse.contains(value)) {
+            if (!AnalysisOptionsFile.trueOrFalse.contains(value)) {
               reporter.atSourceSpan(
                 v.span,
                 AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
                 arguments: [
                   key!,
                   v.valueOrThrow,
-                  AnalysisOptionsFile._trueOrFalseProposal,
+                  AnalysisOptionsFile.trueOrFalseProposal,
                 ],
               );
             }
@@ -967,13 +859,13 @@
 /// Validates `linter` top-level options.
 class _LinterTopLevelOptionsValidator extends _TopLevelOptionValidator {
   _LinterTopLevelOptionsValidator()
-    : super(AnalysisOptionsFile.linter, AnalysisOptionsFile._linterOptions);
+    : super(AnalysisOptionsFile.linter, AnalysisOptionsFile.linterOptions);
 }
 
 /// Validates `analyzer` optional-checks value configuration options.
 class _OptionalChecksValueValidator extends OptionsValidator {
   final _ErrorBuilder _builder = _ErrorBuilder(
-    AnalysisOptionsFile._optionalChecksOptions,
+    AnalysisOptionsFile.optionalChecksOptions,
   );
 
   @override
@@ -1003,14 +895,14 @@
               );
             } else {
               value = toLowerCase(v.value);
-              if (!AnalysisOptionsFile._trueOrFalse.contains(value)) {
+              if (!AnalysisOptionsFile.trueOrFalse.contains(value)) {
                 reporter.atSourceSpan(
                   v.span,
                   AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
                   arguments: [
                     key!,
                     v.valueOrThrow,
-                    AnalysisOptionsFile._trueOrFalseProposal,
+                    AnalysisOptionsFile.trueOrFalseProposal,
                   ],
                 );
               }
@@ -1031,7 +923,7 @@
 /// Validates options for each `plugins` map value.
 class _PluginsOptionsValidator extends OptionsValidator {
   final _ErrorBuilder _builder = _ErrorBuilder(
-    AnalysisOptionsFile._pluginsOptions,
+    AnalysisOptionsFile.pluginsOptions,
   );
 
   @override
@@ -1082,7 +974,7 @@
   ) {
     pluginValue.nodes.forEach((pluginMapKeyNode, pluginMapValueNode) {
       if (pluginMapKeyNode case YamlScalar(value: String pluginMapKey)) {
-        if (!AnalysisOptionsFile._pluginsOptions.contains(pluginMapKey)) {
+        if (!AnalysisOptionsFile.pluginsOptions.contains(pluginMapKey)) {
           _builder.reportError(
             reporter,
             '${AnalysisOptionsFile.plugins}/$pluginName',
@@ -1100,7 +992,7 @@
 /// Validates `analyzer` strong-mode value configuration options.
 class _StrongModeOptionValueValidator extends OptionsValidator {
   final _ErrorBuilder _builder = _ErrorBuilder(
-    AnalysisOptionsFile._strongModeOptions,
+    AnalysisOptionsFile.strongModeOptions,
   );
 
   @override
@@ -1127,7 +1019,7 @@
     strongModeNode.nodes.forEach((k, v) {
       if (k is YamlScalar) {
         var key = k.value?.toString();
-        if (!AnalysisOptionsFile._strongModeOptions.contains(key)) {
+        if (!AnalysisOptionsFile.strongModeOptions.contains(key)) {
           _builder.reportError(reporter, AnalysisOptionsFile.strongMode, k);
         } else if (key == AnalysisOptionsFile.declarationCasts) {
           reporter.atSourceSpan(
@@ -1136,21 +1028,21 @@
             arguments: [
               AnalysisOptionsFile.strongMode,
               v.valueOrThrow,
-              AnalysisOptionsFile._trueOrFalseProposal,
+              AnalysisOptionsFile.trueOrFalseProposal,
             ],
           );
         } else {
           // The key is valid.
           if (v is YamlScalar) {
             var value = toLowerCase(v.value);
-            if (!AnalysisOptionsFile._trueOrFalse.contains(value)) {
+            if (!AnalysisOptionsFile.trueOrFalse.contains(value)) {
               reporter.atSourceSpan(
                 v.span,
                 AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
                 arguments: [
                   key!,
                   v.valueOrThrow,
-                  AnalysisOptionsFile._trueOrFalseProposal,
+                  AnalysisOptionsFile.trueOrFalseProposal,
                 ],
               );
             }
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart
index e237687..eceb9d5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart
@@ -11,8 +11,8 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/error_processor.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/analysis_options/code_style_options.dart';
-import 'package:analyzer/src/analysis_options/options_file_validator.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/utilities_general.dart' show toBool;
 import 'package:analyzer/src/lint/config.dart';
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 97d9be1..6fc80def9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -6,8 +6,8 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart'
     show PhysicalResourceProvider;
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
-import 'package:analyzer/src/analysis_options/options_file_validator.dart';
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/analysis_options.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
diff --git a/pkg/analyzer/lib/src/lint/config.dart b/pkg/analyzer/lib/src/lint/config.dart
index c001572..6f9bae4 100644
--- a/pkg/analyzer/lib/src/lint/config.dart
+++ b/pkg/analyzer/lib/src/lint/config.dart
@@ -2,7 +2,7 @@
 // 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:analyzer/src/analysis_options/options_file_validator.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:yaml/yaml.dart';