@@ -16,6 +16,7 @@ import 'package:analyzer/src/lint/registry.dart';
1616import 'package:analyzer/src/plugin/options.dart' ;
1717import 'package:analyzer/src/util/yaml.dart' ;
1818import 'package:analyzer/src/utilities/extensions/string.dart' ;
19+ import 'package:meta/meta.dart' ;
1920import 'package:pub_semver/pub_semver.dart' ;
2021import 'package:source_span/source_span.dart' ;
2122import 'package:yaml/yaml.dart' ;
@@ -232,7 +233,8 @@ List<AnalysisError> _validatePluginsOption(
232233}) {
233234 RecordingErrorListener recorder = RecordingErrorListener ();
234235 ErrorReporter reporter = ErrorReporter (recorder, source);
235- PluginsOptionValidator (firstEnabledPluginName).validate (reporter, options);
236+ _LegacyPluginsOptionValidator (firstEnabledPluginName)
237+ .validate (reporter, options);
236238 return recorder.errors;
237239}
238240
@@ -340,24 +342,60 @@ class AnalyzerOptions {
340342}
341343
342344/// Validates `analyzer` options.
343- class AnalyzerOptionsValidator extends CompositeValidator {
345+ class AnalyzerOptionsValidator extends _CompositeValidator {
344346 AnalyzerOptionsValidator ()
345347 : super ([
346- TopLevelAnalyzerOptionsValidator (),
347- StrongModeOptionValueValidator (),
348- ErrorFilterOptionValidator (),
349- EnabledExperimentsValidator (),
350- LanguageOptionValidator (),
351- OptionalChecksValueValidator (),
352- CannotIgnoreOptionValidator (),
348+ _TopLevelAnalyzerOptionsValidator (),
349+ _StrongModeOptionValueValidator (),
350+ _ErrorFilterOptionValidator (),
351+ _EnabledExperimentsValidator (),
352+ _LanguageOptionValidator (),
353+ _OptionalChecksValueValidator (),
354+ _CannotIgnoreOptionValidator (),
353355 ]);
354356}
355357
358+ /// Validates options defined in an analysis options file.
359+ @visibleForTesting
360+ class OptionsFileValidator {
361+ /// The source being validated.
362+ final Source _source;
363+
364+ final List <OptionsValidator > _validators;
365+
366+ OptionsFileValidator (
367+ this ._source, {
368+ required VersionConstraint ? sdkVersionConstraint,
369+ required bool sourceIsOptionsForContextRoot,
370+ LintRuleProvider ? provider,
371+ }) : _validators = [
372+ AnalyzerOptionsValidator (),
373+ _CodeStyleOptionsValidator (),
374+ _FormatterOptionsValidator (),
375+ _LinterOptionsValidator (),
376+ LinterRuleOptionsValidator (
377+ provider: provider,
378+ sdkVersionConstraint: sdkVersionConstraint,
379+ sourceIsOptionsForContextRoot: sourceIsOptionsForContextRoot,
380+ ),
381+ // TODO(srawlins): validate the top-level 'plugins' section.
382+ ];
383+
384+ List <AnalysisError > validate (YamlMap options) {
385+ RecordingErrorListener recorder = RecordingErrorListener ();
386+ ErrorReporter reporter = ErrorReporter (recorder, _source);
387+ for (var validator in _validators) {
388+ validator.validate (reporter, options);
389+ }
390+ return recorder.errors;
391+ }
392+ }
393+
356394/// Validates the `analyzer` `cannot-ignore` option.
357395///
358396/// This includes the format of the `cannot-ignore` section, the format of
359397/// values in the section, and whether each value is a valid string.
360- class CannotIgnoreOptionValidator extends OptionsValidator {
398+ class _CannotIgnoreOptionValidator extends OptionsValidator {
361399 /// Lazily populated set of error codes.
362400 static final Set <String > _errorCodes =
363401 errorCodeValues.map ((ErrorCode code) => code.name).toSet ();
@@ -423,7 +461,7 @@ class CannotIgnoreOptionValidator extends OptionsValidator {
423461}
424462
425463/// Validates `code-style` options.
426- class CodeStyleOptionsValidator extends OptionsValidator {
464+ class _CodeStyleOptionsValidator extends OptionsValidator {
427465 @override
428466 void validate (ErrorReporter reporter, YamlMap options) {
429467 var codeStyle = options.valueAt (AnalyzerOptions .codeStyle);
@@ -486,10 +524,10 @@ class CodeStyleOptionsValidator extends OptionsValidator {
486524}
487525
488526/// Convenience class for composing validators.
489- class CompositeValidator extends OptionsValidator {
527+ class _CompositeValidator extends OptionsValidator {
490528 final List <OptionsValidator > validators;
491529
492- CompositeValidator (this .validators);
530+ _CompositeValidator (this .validators);
493531
494532 @override
495533 void validate (ErrorReporter reporter, YamlMap options) {
@@ -499,8 +537,8 @@ class CompositeValidator extends OptionsValidator {
499537 }
500538}
501539
502- /// Validates `analyzer` language configuration options.
503- class EnabledExperimentsValidator extends OptionsValidator {
540+ /// Validates `analyzer` enabled experiments configuration options.
541+ class _EnabledExperimentsValidator extends OptionsValidator {
504542 @override
505543 void validate (ErrorReporter reporter, YamlMap options) {
506544 var analyzer = options.valueAt (AnalyzerOptions .analyzer);
@@ -541,7 +579,7 @@ class EnabledExperimentsValidator extends OptionsValidator {
541579}
542580
543581/// Builds error reports with value proposals.
544- class ErrorBuilder {
582+ class _ErrorBuilder {
545583 static AnalysisOptionsWarningCode get noProposalCode =>
546584 AnalysisOptionsWarningCode .UNSUPPORTED_OPTION_WITHOUT_VALUES ;
547585
@@ -556,18 +594,18 @@ class ErrorBuilder {
556594 final AnalysisOptionsWarningCode code;
557595
558596 /// Create a builder for the given [supportedOptions] .
559- factory ErrorBuilder (List <String > supportedOptions) {
597+ factory _ErrorBuilder (List <String > supportedOptions) {
560598 var proposal = supportedOptions.quotedAndCommaSeparatedWithAnd;
561599 if (supportedOptions.isEmpty) {
562- return ErrorBuilder ._(proposal: proposal, code: noProposalCode);
600+ return _ErrorBuilder ._(proposal: proposal, code: noProposalCode);
563601 } else if (supportedOptions.length == 1 ) {
564- return ErrorBuilder ._(proposal: proposal, code: singularProposalCode);
602+ return _ErrorBuilder ._(proposal: proposal, code: singularProposalCode);
565603 } else {
566- return ErrorBuilder ._(proposal: proposal, code: pluralProposalCode);
604+ return _ErrorBuilder ._(proposal: proposal, code: pluralProposalCode);
567605 }
568606 }
569607
570- ErrorBuilder ._({
608+ _ErrorBuilder ._({
571609 required this .proposal,
572610 required this .code,
573611 });
@@ -591,7 +629,7 @@ class ErrorBuilder {
591629}
592630
593631/// Validates `analyzer` error filter options.
594- class ErrorFilterOptionValidator extends OptionsValidator {
632+ class _ErrorFilterOptionValidator extends OptionsValidator {
595633 /// Legal values.
596634 static final List <String > legalValues =
597635 List .from (AnalyzerOptions .ignoreSynonyms)
@@ -671,7 +709,7 @@ class ErrorFilterOptionValidator extends OptionsValidator {
671709}
672710
673711/// Validates `formatter` options.
674- class FormatterOptionsValidator extends OptionsValidator {
712+ class _FormatterOptionsValidator extends OptionsValidator {
675713 @override
676714 void validate (ErrorReporter reporter, YamlMap options) {
677715 var formatter = options.valueAt (AnalyzerOptions .formatter);
@@ -717,8 +755,8 @@ class FormatterOptionsValidator extends OptionsValidator {
717755}
718756
719757/// Validates `analyzer` language configuration options.
720- class LanguageOptionValidator extends OptionsValidator {
721- final ErrorBuilder _builder = ErrorBuilder (AnalyzerOptions .languageOptions);
758+ class _LanguageOptionValidator extends OptionsValidator {
759+ final _ErrorBuilder _builder = _ErrorBuilder (AnalyzerOptions .languageOptions);
722760
723761 @override
724762 void validate (ErrorReporter reporter, YamlMap options) {
@@ -772,106 +810,14 @@ class LanguageOptionValidator extends OptionsValidator {
772810 }
773811}
774812
775- /// Validates `linter` top-level options.
776- // TODO(pq): move into `linter` package and plugin.
777- class LinterOptionsValidator extends TopLevelOptionValidator {
778- LinterOptionsValidator () : super ('linter' , AnalyzerOptions .linterOptions);
779- }
780-
781- /// Validates `analyzer` optional-checks value configuration options.
782- class OptionalChecksValueValidator extends OptionsValidator {
783- final ErrorBuilder _builder =
784- ErrorBuilder (AnalyzerOptions .optionalChecksOptions);
785-
786- @override
787- void validate (ErrorReporter reporter, YamlMap options) {
788- var analyzer = options.valueAt (AnalyzerOptions .analyzer);
789- if (analyzer is YamlMap ) {
790- var v = analyzer.valueAt (AnalyzerOptions .optionalChecks);
791- if (v is YamlScalar ) {
792- var value = toLowerCase (v.value);
793- if (value != AnalyzerOptions .chromeOsManifestChecks) {
794- _builder.reportError (
795- reporter, AnalyzerOptions .chromeOsManifestChecks, v);
796- }
797- } else if (v is YamlMap ) {
798- v.nodes.forEach ((k, v) {
799- String ? key, value;
800- if (k is YamlScalar ) {
801- key = k.value? .toString ();
802- if (key != AnalyzerOptions .chromeOsManifestChecks) {
803- _builder.reportError (
804- reporter, AnalyzerOptions .chromeOsManifestChecks, k);
805- } else {
806- value = toLowerCase (v.value);
807- if (! AnalyzerOptions .trueOrFalse.contains (value)) {
808- reporter.atSourceSpan (
809- v.span,
810- AnalysisOptionsWarningCode .UNSUPPORTED_VALUE ,
811- arguments: [
812- key! ,
813- v.valueOrThrow,
814- AnalyzerOptions .trueOrFalseProposal
815- ],
816- );
817- }
818- }
819- }
820- });
821- } else if (v != null ) {
822- reporter.atSourceSpan (
823- v.span,
824- AnalysisOptionsWarningCode .INVALID_SECTION_FORMAT ,
825- arguments: [AnalyzerOptions .enableExperiment],
826- );
827- }
828- }
829- }
830- }
831-
832- /// Validates options defined in an analysis options file.
833- class OptionsFileValidator {
834- /// The source being validated.
835- final Source source;
836-
837- final List <OptionsValidator > _validators;
838-
839- OptionsFileValidator (
840- this .source, {
841- required VersionConstraint ? sdkVersionConstraint,
842- required bool sourceIsOptionsForContextRoot,
843- LintRuleProvider ? provider,
844- }) : _validators = [
845- AnalyzerOptionsValidator (),
846- CodeStyleOptionsValidator (),
847- FormatterOptionsValidator (),
848- LinterOptionsValidator (),
849- LinterRuleOptionsValidator (
850- provider: provider,
851- sdkVersionConstraint: sdkVersionConstraint,
852- sourceIsOptionsForContextRoot: sourceIsOptionsForContextRoot,
853- ),
854- // TODO(srawlins): validate the top-level 'plugins' section.
855- ];
856-
857- List <AnalysisError > validate (YamlMap options) {
858- RecordingErrorListener recorder = RecordingErrorListener ();
859- ErrorReporter reporter = ErrorReporter (recorder, source);
860- for (var validator in _validators) {
861- validator.validate (reporter, options);
862- }
863- return recorder.errors;
864- }
865- }
866-
867813/// Validates `analyzer` plugins configuration options.
868- class PluginsOptionValidator extends OptionsValidator {
869- /// The name of the first included plugin, if there is one.
814+ class _LegacyPluginsOptionValidator extends OptionsValidator {
815+ /// The name of the first included legacy plugin, if there is one.
870816 ///
871- /// If there are no included plugins, this is `null` .
817+ /// If there are no included legacy plugins, this is `null` .
872818 final String ? _firstIncludedPluginName;
873819
874- PluginsOptionValidator (this ._firstIncludedPluginName);
820+ _LegacyPluginsOptionValidator (this ._firstIncludedPluginName);
875821
876822 @override
877823 void validate (ErrorReporter reporter, YamlMap options) {
@@ -961,9 +907,66 @@ class PluginsOptionValidator extends OptionsValidator {
961907 }
962908}
963909
910+ /// Validates `linter` top-level options.
911+ class _LinterOptionsValidator extends _TopLevelOptionValidator {
912+ _LinterOptionsValidator () : super ('linter' , AnalyzerOptions .linterOptions);
913+ }
914+
915+ /// Validates `analyzer` optional-checks value configuration options.
916+ class _OptionalChecksValueValidator extends OptionsValidator {
917+ final _ErrorBuilder _builder =
918+ _ErrorBuilder (AnalyzerOptions .optionalChecksOptions);
919+
920+ @override
921+ void validate (ErrorReporter reporter, YamlMap options) {
922+ var analyzer = options.valueAt (AnalyzerOptions .analyzer);
923+ if (analyzer is YamlMap ) {
924+ var v = analyzer.valueAt (AnalyzerOptions .optionalChecks);
925+ if (v is YamlScalar ) {
926+ var value = toLowerCase (v.value);
927+ if (value != AnalyzerOptions .chromeOsManifestChecks) {
928+ _builder.reportError (
929+ reporter, AnalyzerOptions .chromeOsManifestChecks, v);
930+ }
931+ } else if (v is YamlMap ) {
932+ v.nodes.forEach ((k, v) {
933+ String ? key, value;
934+ if (k is YamlScalar ) {
935+ key = k.value? .toString ();
936+ if (key != AnalyzerOptions .chromeOsManifestChecks) {
937+ _builder.reportError (
938+ reporter, AnalyzerOptions .chromeOsManifestChecks, k);
939+ } else {
940+ value = toLowerCase (v.value);
941+ if (! AnalyzerOptions .trueOrFalse.contains (value)) {
942+ reporter.atSourceSpan (
943+ v.span,
944+ AnalysisOptionsWarningCode .UNSUPPORTED_VALUE ,
945+ arguments: [
946+ key! ,
947+ v.valueOrThrow,
948+ AnalyzerOptions .trueOrFalseProposal
949+ ],
950+ );
951+ }
952+ }
953+ }
954+ });
955+ } else if (v != null ) {
956+ reporter.atSourceSpan (
957+ v.span,
958+ AnalysisOptionsWarningCode .INVALID_SECTION_FORMAT ,
959+ arguments: [AnalyzerOptions .enableExperiment],
960+ );
961+ }
962+ }
963+ }
964+ }
965+
964966/// Validates `analyzer` strong-mode value configuration options.
965- class StrongModeOptionValueValidator extends OptionsValidator {
966- final ErrorBuilder _builder = ErrorBuilder (AnalyzerOptions .strongModeOptions);
967+ class _StrongModeOptionValueValidator extends OptionsValidator {
968+ final _ErrorBuilder _builder =
969+ _ErrorBuilder (AnalyzerOptions .strongModeOptions);
967970
968971 @override
969972 void validate (ErrorReporter reporter, YamlMap options) {
@@ -1022,21 +1025,24 @@ class StrongModeOptionValueValidator extends OptionsValidator {
10221025}
10231026
10241027/// Validates `analyzer` top-level options.
1025- class TopLevelAnalyzerOptionsValidator extends TopLevelOptionValidator {
1026- TopLevelAnalyzerOptionsValidator ()
1028+ class _TopLevelAnalyzerOptionsValidator extends _TopLevelOptionValidator {
1029+ _TopLevelAnalyzerOptionsValidator ()
10271030 : super (AnalyzerOptions .analyzer, AnalyzerOptions .topLevel);
10281031}
10291032
10301033/// Validates top-level options. For example,
1034+ ///
1035+ /// ```yaml
10311036/// plugin:
10321037/// top-level-option: true
1033- class TopLevelOptionValidator extends OptionsValidator {
1038+ /// ```
1039+ class _TopLevelOptionValidator extends OptionsValidator {
10341040 final String pluginName;
10351041 final List <String > supportedOptions;
10361042 final String _valueProposal;
10371043 final AnalysisOptionsWarningCode _warningCode;
10381044
1039- TopLevelOptionValidator (this .pluginName, this .supportedOptions)
1045+ _TopLevelOptionValidator (this .pluginName, this .supportedOptions)
10401046 : assert (supportedOptions.isNotEmpty),
10411047 _valueProposal = supportedOptions.quotedAndCommaSeparatedWithAnd,
10421048 _warningCode = supportedOptions.length == 1
0 commit comments