From 7a672b40f433c38ee64ebb93998077a9183b97bc Mon Sep 17 00:00:00 2001 From: Jens Johansen Date: Mon, 24 Feb 2025 00:58:48 -0800 Subject: [PATCH] [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 Commit-Queue: Jens Johansen --- .../src/dart/analysis/analysis_options.dart | 11 +-- .../src/options/analysis_options_test.dart | 67 +++++++++++++++++++ 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart index 2fbf31a6c1d..c13374bfa27 100644 --- a/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart +++ b/pkg/analyzer/lib/src/dart/analysis/analysis_options.dart @@ -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); diff --git a/pkg/analyzer/test/src/options/analysis_options_test.dart b/pkg/analyzer/test/src/options/analysis_options_test.dart index 8e3ee8e2070..f88fe52da2f 100644 --- a/pkg/analyzer/test/src/options/analysis_options_test.dart +++ b/pkg/analyzer/test/src/options/analysis_options_test.dart @@ -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);