Skip to content

Commit 34bb197

Browse files
DanTupCommit Queue
authored andcommitted
[analysis_server] Fix duplicate diagnostic/lint names in analysis_options completion
Some of the diagnostic names are used by multiple diagnostics (for example `extendsDeferredClass` and `implementsDeferredClass` both use `SUBTYPE_OF_DEFERRED_CLASS` so they need to be de-duped when adding to code completion. Fixes #61434 Change-Id: Ie0875c8aadb5543b524fc8730c2860e9ac73d496 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448040 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent 57771cd commit 34bb197

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,13 @@ class _ErrorProducer extends KeyValueProducer {
7373

7474
@override
7575
Iterable<CompletionSuggestion> suggestions(YamlCompletionRequest request) {
76-
return [
76+
// There may be overlaps in these names, so use a set.
77+
var names = {
7778
for (var diagnostic in diagnosticCodeValues)
78-
identifier('${diagnostic.name.toLowerCase()}: '),
79-
for (var rule in Registry.ruleRegistry.rules)
80-
identifier('${rule.name}: '),
81-
];
79+
diagnostic.name.toLowerCase(),
80+
for (var rule in Registry.ruleRegistry.rules) rule.name,
81+
};
82+
return {for (var name in names) identifier('$name: ')};
8283
}
8384
}
8485

pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analyzer/error/error.dart';
88
import 'package:analyzer/src/analysis_options/analysis_options_file.dart';
99
import 'package:analyzer/src/lint/linter.dart';
1010
import 'package:analyzer/src/test_utilities/lint_registration_mixin.dart';
11+
import 'package:collection/collection.dart';
1112
import 'package:linter/src/rules.dart';
1213
import 'package:test/test.dart';
1314
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -77,7 +78,7 @@ analyzer:
7778
assertSuggestion('annotate_overrides: ');
7879
}
7980

80-
void test_analyzer_errors_nonDuplicate() {
81+
void test_analyzer_errors_excludesExisting() {
8182
getCompletions('''
8283
analyzer:
8384
errors:
@@ -87,6 +88,20 @@ analyzer:
8788
assertNoSuggestion('dead_code');
8889
}
8990

91+
void test_analyzer_errors_noDuplicates() {
92+
getCompletions('''
93+
analyzer:
94+
errors:
95+
^
96+
''');
97+
var duplicateCompletions =
98+
groupBy(
99+
results.map((result) => result.completion),
100+
(result) => result,
101+
).entries.where((entry) => entry.value.length > 1).keys;
102+
expect(duplicateCompletions, isEmpty);
103+
}
104+
90105
void test_analyzer_errors_severity() {
91106
getCompletions('''
92107
analyzer:

0 commit comments

Comments
 (0)