[analyzer] Sort input for analysis_options signature calculation

This, too, would have fixed the issue fixed in
https://dart-review.googlesource.com/c/sdk/+/410700.

This CL furthermore means that changing the order of the "analyzer:
errors:" entries (or "plugins:" entries) doesn't change the signature.

Change-Id: I6439f985260545dfc2c7e0a75b353b5324ef8f88
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/411040
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
This commit is contained in:
Jens Johansen
2025-02-24 00:58:48 -08:00
committed by Commit Queue
parent 3df3d4fab4
commit 7a672b40f4
2 changed files with 74 additions and 4 deletions
@@ -20,6 +20,7 @@ import 'package:analyzer/src/lint/registry.dart';
import 'package:analyzer/src/summary/api_signature.dart';
import 'package:analyzer/src/task/options.dart';
import 'package:analyzer/src/util/yaml.dart';
import 'package:collection/collection.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:yaml/yaml.dart';
@@ -524,25 +525,27 @@ class AnalysisOptionsImpl implements AnalysisOptions {
// Append error processors.
buffer.addInt(errorProcessors.length);
for (ErrorProcessor processor in errorProcessors) {
for (ErrorProcessor processor
in errorProcessors.sortedBy((processor) => processor.description)) {
buffer.addString(processor.description);
}
// Append lints.
buffer.addInt(lintRules.length);
for (var lintRule in lintRules) {
for (var lintRule in lintRules.sortedBy((lintRule) => lintRule.name)) {
buffer.addString(lintRule.name);
}
// Append legacy plugin names.
buffer.addInt(enabledLegacyPluginNames.length);
for (var enabledLegacyPluginName in enabledLegacyPluginNames) {
for (var enabledLegacyPluginName in enabledLegacyPluginNames.sorted()) {
buffer.addString(enabledLegacyPluginName);
}
// Append plugin configurations.
buffer.addInt(pluginConfigurations.length);
for (var pluginConfiguration in pluginConfigurations) {
for (var pluginConfiguration in pluginConfigurations
.sortedBy((pluginConfiguration) => pluginConfiguration.name)) {
buffer.addString(pluginConfiguration.name);
buffer.addBool(pluginConfiguration.isEnabled);
buffer.addInt(pluginConfiguration.diagnosticConfigs.length);
@@ -10,6 +10,8 @@ import 'package:analyzer/src/dart/analysis/analysis_options.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/file_system/file_system.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/lint/registry.dart';
import 'package:linter/src/rules.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -417,6 +419,71 @@ code-style:
expect(analysisOptions.codeStyleOptions.useFormatter, true);
}
test_signature_on_different_error_ordering() {
var options = parseOptions('''
analyzer:
errors:
a: warning
b: ignore
c: ignore
''');
var sig1 = options.signature;
for (var i = 0; i < 10; i++) {
var options2 = parseOptions('''
analyzer:
errors:
b: ignore
a: warning
c: ignore
''');
var sig2 = options2.signature;
expect(sig1, sig2);
}
}
test_signature_on_different_lints_ordering() {
registerLintRules();
var knownRules = Registry.ruleRegistry.rules
.map((rule) => " - ${rule.name}")
.toList(growable: false);
var options = parseOptions('''
linter:
rules:
${knownRules.reversed.join("\n")}
''');
var sig1 = options.signature;
for (var i = 0; i < 10; i++) {
knownRules.shuffle();
var options2 = parseOptions('''
linter:
rules:
${knownRules.join("\n")}
''');
var sig2 = options2.signature;
expect(sig1, sig2);
}
}
test_signature_on_different_plugin_ordering() {
var options = parseOptions('''
plugins:
plugin_one: ^1.2.3
plugin_two: ^1.2.3
plugin_three: ^1.2.3
''');
var sig1 = options.signature;
for (var i = 0; i < 10; i++) {
var options2 = parseOptions('''
plugins:
plugin_three: ^1.2.3
plugin_one: ^1.2.3
plugin_two: ^1.2.3
''');
var sig2 = options2.signature;
expect(sig1, sig2);
}
}
test_signature_on_merge() {
var sourceFactory = SourceFactory([ResourceUriResolver(resourceProvider)]);
var optionsProvider = AnalysisOptionsProvider(sourceFactory);