Skip to content

Commit 7f5485d

Browse files
srawlinsCommit Queue
authored andcommitted
DAS plugins: report early when a fix or assist does not have a fixKind or assistKind
Change-Id: I83a147adc4740d1a8891faa06d35c4901cf568b2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/417943 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent f0c2fa7 commit 7f5485d

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

pkg/analysis_server_plugin/lib/src/registry.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
56
import 'package:analysis_server_plugin/registry.dart';
67
import 'package:analysis_server_plugin/src/correction/assist_generators.dart';
78
import 'package:analysis_server_plugin/src/correction/fix_generators.dart';
@@ -16,11 +17,29 @@ final class PluginRegistryImpl implements PluginRegistry {
1617

1718
@override
1819
void registerAssist(ProducerGenerator generator) {
20+
var producer = generator(context: StubCorrectionProducerContext.instance);
21+
if (producer.assistKind == null) {
22+
throw ArgumentError.value(
23+
generator,
24+
'generator',
25+
"Assist producer '${producer.runtimeType}' must declare a non-null "
26+
"'assistKind'.",
27+
);
28+
}
1929
registeredAssistGenerators.registerGenerator(generator);
2030
}
2131

2232
@override
2333
void registerFixForRule(LintCode code, ProducerGenerator generator) {
34+
var producer = generator(context: StubCorrectionProducerContext.instance);
35+
if (producer.fixKind == null) {
36+
throw ArgumentError.value(
37+
generator,
38+
'generator',
39+
"Fix producer '${producer.runtimeType}' must declare a non-null "
40+
"'fixKind'.",
41+
);
42+
}
2443
registeredFixGenerators.registerFixForLint(code, generator);
2544
}
2645

pkg/analysis_server_plugin/test/src/plugin_server_error_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,26 @@ plugins:
158158
.having((e) => e.stackTrace, 'stackTrace', isNotNull),
159159
);
160160
}
161+
162+
Future<void> test_registerAssistWithoutAssistKind() async {
163+
expect(
164+
() => pluginServer = PluginServer(
165+
resourceProvider: resourceProvider,
166+
plugins: [_PluginWithAssistWithNoAssistKind()],
167+
),
168+
throwsArgumentError,
169+
);
170+
}
171+
172+
Future<void> test_registerFixWithoutFixKind() async {
173+
expect(
174+
() => pluginServer = PluginServer(
175+
resourceProvider: resourceProvider,
176+
plugins: [_PluginWithFixWithNoFixKind()],
177+
),
178+
throwsArgumentError,
179+
);
180+
}
161181
}
162182

163183
class _FixThrowsAsyncErrorPlugin extends Plugin {
@@ -176,6 +196,33 @@ class _FixThrowsSyncErrorPlugin extends Plugin {
176196
}
177197
}
178198

199+
/// A correction producer with a `null` `fixKind`.
200+
class _MissingFixKindFix extends ResolvedCorrectionProducer {
201+
_MissingFixKindFix({required super.context});
202+
203+
@override
204+
CorrectionApplicability get applicability =>
205+
CorrectionApplicability.acrossFiles;
206+
207+
@override
208+
Future<void> compute(ChangeBuilder builder) async {}
209+
}
210+
211+
class _PluginWithAssistWithNoAssistKind extends Plugin {
212+
@override
213+
void register(PluginRegistry registry) {
214+
registry.registerAssist(_ThrowsSyncErrorFix.new);
215+
}
216+
}
217+
218+
class _PluginWithFixWithNoFixKind extends Plugin {
219+
@override
220+
void register(PluginRegistry registry) {
221+
registry.registerWarningRule(NoBoolsRule());
222+
registry.registerFixForRule(NoBoolsRule.code, _MissingFixKindFix.new);
223+
}
224+
}
225+
179226
class _RuleThrowsAsyncErrorPlugin extends Plugin {
180227
@override
181228
void register(PluginRegistry registry) {

0 commit comments

Comments
 (0)