Skip to content

Commit e7c0452

Browse files
srawlinsCommit Queue
authored andcommitted
analyzer: Privatize YAML validation classes
Change-Id: I2703c01736f3b3ae74a33474551d6ebfe282cf13 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/393942 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent 2726227 commit e7c0452

File tree

1 file changed

+133
-127
lines changed

1 file changed

+133
-127
lines changed

pkg/analyzer/lib/src/task/options.dart

Lines changed: 133 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:analyzer/src/lint/registry.dart';
1616
import 'package:analyzer/src/plugin/options.dart';
1717
import 'package:analyzer/src/util/yaml.dart';
1818
import 'package:analyzer/src/utilities/extensions/string.dart';
19+
import 'package:meta/meta.dart';
1920
import 'package:pub_semver/pub_semver.dart';
2021
import 'package:source_span/source_span.dart';
2122
import '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

Comments
 (0)