Skip to content

Commit f72576a

Browse files
srawlinsCommit Queue
authored andcommitted
analyzer_plugin: Introduce messages/types for plugin analysis status
There is no code in this CL that _uses_ the new AnalysisStatus Notification or type, but landing it is important, so that I can test plugins which will use the analyzer_plugin package from pub. Change-Id: I31f835d5f7b8bda3781a6962d37f1f769b22852e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/404702 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent fa2f2dd commit f72576a

File tree

7 files changed

+241
-2
lines changed

7 files changed

+241
-2
lines changed

pkg/analyzer_plugin/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
- Remove `elementName()` from `RangeFactory`. Use `fragmentName()` instead.
33
- Breaking changes to `DartFileEditBuilder` and `DartEditBuilder`.
44
- Breaking changes to `AnalyzerConverter`.
5+
- Support for a plugin to send an `AnalysisStatus` notification, featuring an
6+
`isAnalyzing` `bool` field.
57

68
## 0.12.0
79
- Breaking changes to `DartFileEditBuilder`: `convertFunctionFromSyncToAsync`

pkg/analyzer_plugin/doc/api.html

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ <h2 class="domain"><a name="domain_plugin">plugin domain</a></h2>
138138

139139

140140

141+
141142
<h3>Requests</h3><dl><dt class="request"><a name="request_plugin.versionCheck">plugin.versionCheck</a></dt><dd><div class="box"><pre>request: {
142143
"id": String
143144
"method": "plugin.versionCheck"
@@ -262,6 +263,26 @@ <h4>parameters:</h4><dl><dt class="field"><b>isFatal: bool</b></dt><dd>
262263
The stack trace associated with the generation of the error, used for
263264
debugging the plugin.
264265
</p>
266+
</dd></dl></dd><dt class="notification"><a name="notification_plugin.status">plugin.status</a></dt><dd><div class="box"><pre>notification: {
267+
"event": "plugin.status"
268+
"params": {
269+
"<b>analysis</b>": <span style="color:#999999">optional</span> <a href="#type_AnalysisStatus">AnalysisStatus</a>
270+
}
271+
}</pre></div>
272+
<p>
273+
Reports the current status of the plugin. Parameters are omitted if there
274+
has been no change in the status represented by that parameter.
275+
</p>
276+
<p>
277+
Only used for "new" analyzer plugins. Legacy plugins should not use
278+
this type.
279+
</p>
280+
281+
<h4>parameters:</h4><dl><dt class="field"><b>analysis: <a href="#type_AnalysisStatus">AnalysisStatus</a><span style="color:#999999"> (optional)</span></b></dt><dd>
282+
283+
<p>
284+
The current status of analysis (whether analysis is being performed).
285+
</p>
265286
</dd></dl></dd></dl>
266287
<h2 class="domain"><a name="domain_analysis">analysis domain</a></h2>
267288
<p>
@@ -844,6 +865,7 @@ <h2 class="domain"><a name="types">Types</a></h2>
844865

845866

846867

868+
847869
<dl><dt class="typeDefinition"><a name="type_AddContentOverlay">AddContentOverlay: object</a></dt><dd>
848870
<p>
849871
A directive to begin overlaying the contents of a file. The supplied
@@ -957,7 +979,19 @@ <h2 class="domain"><a name="types">Types</a></h2>
957979
related to a specific list of files.
958980
</p>
959981

960-
<dl><dt class="value">FOLDING</dt><dt class="value">HIGHLIGHTS</dt><dt class="value">NAVIGATION</dt><dt class="value">OCCURRENCES</dt><dt class="value">OUTLINE</dt></dl></dd><dt class="typeDefinition"><a name="type_ChangeContentOverlay">ChangeContentOverlay: object</a></dt><dd>
982+
<dl><dt class="value">FOLDING</dt><dt class="value">HIGHLIGHTS</dt><dt class="value">NAVIGATION</dt><dt class="value">OCCURRENCES</dt><dt class="value">OUTLINE</dt></dl></dd><dt class="typeDefinition"><a name="type_AnalysisStatus">AnalysisStatus: object</a></dt><dd>
983+
<p>
984+
An indication of the current state of analysis.
985+
</p>
986+
<p>
987+
Only used for "new" analyzer plugins. Legacy plugins should not use
988+
this type.
989+
</p>
990+
991+
<dl><dt class="field"><b>isAnalyzing: bool</b></dt><dd>
992+
993+
<p>True if analysis is currently being performed.</p>
994+
</dd></dl></dd><dt class="typeDefinition"><a name="type_ChangeContentOverlay">ChangeContentOverlay: object</a></dt><dd>
961995
<p>
962996
A directive to modify an existing file content overlay. One or more ranges
963997
of text are deleted from the old file content overlay and replaced with
@@ -2379,6 +2413,6 @@ <h4>Feedback:</h4><dl><dt class="field"><b>offset: int</b></dt><dd>
23792413
</p>
23802414
</dd></dl></dd></dl>
23812415
<h2 class="domain"><a name="index">Index</a></h2>
2382-
<h3>Domains</h3><h4>plugin (<a href="#domain_plugin"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_plugin.versionCheck">versionCheck</a></li><li><a href="#request_plugin.shutdown">shutdown</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_plugin.error">error</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.handleWatchEvents">handleWatchEvents</a></li><li><a href="#request_analysis.setContextRoots">setContextRoots</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li></ul></div></div><h4>completion (<a href="#domain_completion"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li></ul></div><h4>edit (<a href="#domain_edit"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getFixes">getFixes</a></li></ul></div><h3>Types (<a href="#types"></a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextRoot">ContextRoot</a></li><li><a href="#type_DiagnosticMessage">DiagnosticMessage</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PrioritizedSourceChange">PrioritizedSourceChange</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_WatchEvent">WatchEvent</a></li><li><a href="#type_WatchEventType">WatchEventType</a></li></ul></div><h3>Refactorings (<a href="#refactorings"></a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
2416+
<h3>Domains</h3><h4>plugin (<a href="#domain_plugin"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_plugin.versionCheck">versionCheck</a></li><li><a href="#request_plugin.shutdown">shutdown</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_plugin.error">error</a></li><li><a href="#notification_plugin.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.handleWatchEvents">handleWatchEvents</a></li><li><a href="#request_analysis.setContextRoots">setContextRoots</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li></ul></div></div><h4>completion (<a href="#domain_completion"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li></ul></div><h4>edit (<a href="#domain_edit"></a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getFixes">getFixes</a></li></ul></div><h3>Types (<a href="#types"></a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextRoot">ContextRoot</a></li><li><a href="#type_DiagnosticMessage">DiagnosticMessage</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PrioritizedSourceChange">PrioritizedSourceChange</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_WatchEvent">WatchEvent</a></li><li><a href="#type_WatchEventType">WatchEventType</a></li></ul></div><h3>Refactorings (<a href="#refactorings"></a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
23832417
</body>
23842418
</html>

pkg/analyzer_plugin/lib/protocol/protocol_constants.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ const String PLUGIN_NOTIFICATION_ERROR = 'plugin.error';
8484
const String PLUGIN_NOTIFICATION_ERROR_IS_FATAL = 'isFatal';
8585
const String PLUGIN_NOTIFICATION_ERROR_MESSAGE = 'message';
8686
const String PLUGIN_NOTIFICATION_ERROR_STACK_TRACE = 'stackTrace';
87+
const String PLUGIN_NOTIFICATION_STATUS = 'plugin.status';
88+
const String PLUGIN_NOTIFICATION_STATUS_ANALYSIS = 'analysis';
8789
const String PLUGIN_REQUEST_SHUTDOWN = 'plugin.shutdown';
8890
const String PLUGIN_REQUEST_VERSION_CHECK = 'plugin.versionCheck';
8991
const String PLUGIN_REQUEST_VERSION_CHECK_BYTE_STORE_PATH = 'byteStorePath';

pkg/analyzer_plugin/lib/protocol/protocol_generated.dart

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,59 @@ class AnalysisSetSubscriptionsResult implements ResponseResult {
13371337
int get hashCode => 218088493;
13381338
}
13391339

1340+
/// AnalysisStatus
1341+
///
1342+
/// {
1343+
/// "isAnalyzing": bool
1344+
/// }
1345+
///
1346+
/// Clients may not extend, implement or mix-in this class.
1347+
class AnalysisStatus implements HasToJson {
1348+
/// True if analysis is currently being performed.
1349+
bool isAnalyzing;
1350+
1351+
AnalysisStatus(this.isAnalyzing);
1352+
1353+
factory AnalysisStatus.fromJson(
1354+
JsonDecoder jsonDecoder, String jsonPath, Object? json,
1355+
{ClientUriConverter? clientUriConverter}) {
1356+
json ??= {};
1357+
if (json is Map) {
1358+
bool isAnalyzing;
1359+
if (json.containsKey('isAnalyzing')) {
1360+
isAnalyzing = jsonDecoder.decodeBool(
1361+
'$jsonPath.isAnalyzing', json['isAnalyzing']);
1362+
} else {
1363+
throw jsonDecoder.mismatch(jsonPath, 'isAnalyzing');
1364+
}
1365+
return AnalysisStatus(isAnalyzing);
1366+
} else {
1367+
throw jsonDecoder.mismatch(jsonPath, 'AnalysisStatus', json);
1368+
}
1369+
}
1370+
1371+
@override
1372+
Map<String, Object> toJson({ClientUriConverter? clientUriConverter}) {
1373+
var result = <String, Object>{};
1374+
result['isAnalyzing'] = isAnalyzing;
1375+
return result;
1376+
}
1377+
1378+
@override
1379+
String toString() => json.encode(toJson(clientUriConverter: null));
1380+
1381+
@override
1382+
bool operator ==(other) {
1383+
if (other is AnalysisStatus) {
1384+
return isAnalyzing == other.isAnalyzing;
1385+
}
1386+
return false;
1387+
}
1388+
1389+
@override
1390+
int get hashCode => isAnalyzing.hashCode;
1391+
}
1392+
13401393
/// analysis.updateContent params
13411394
///
13421395
/// {
@@ -3623,6 +3676,74 @@ class PluginShutdownResult implements ResponseResult {
36233676
int get hashCode => 9389109;
36243677
}
36253678

3679+
/// plugin.status params
3680+
///
3681+
/// {
3682+
/// "analysis": optional AnalysisStatus
3683+
/// }
3684+
///
3685+
/// Clients may not extend, implement or mix-in this class.
3686+
class PluginStatusParams implements HasToJson {
3687+
/// The current status of analysis (whether analysis is being performed).
3688+
AnalysisStatus? analysis;
3689+
3690+
PluginStatusParams({this.analysis});
3691+
3692+
factory PluginStatusParams.fromJson(
3693+
JsonDecoder jsonDecoder, String jsonPath, Object? json,
3694+
{ClientUriConverter? clientUriConverter}) {
3695+
json ??= {};
3696+
if (json is Map) {
3697+
AnalysisStatus? analysis;
3698+
if (json.containsKey('analysis')) {
3699+
analysis = AnalysisStatus.fromJson(
3700+
jsonDecoder, '$jsonPath.analysis', json['analysis'],
3701+
clientUriConverter: clientUriConverter);
3702+
}
3703+
return PluginStatusParams(analysis: analysis);
3704+
} else {
3705+
throw jsonDecoder.mismatch(jsonPath, 'plugin.status params', json);
3706+
}
3707+
}
3708+
3709+
factory PluginStatusParams.fromNotification(Notification notification,
3710+
{ClientUriConverter? clientUriConverter}) {
3711+
return PluginStatusParams.fromJson(
3712+
ResponseDecoder(null), 'params', notification.params,
3713+
clientUriConverter: clientUriConverter);
3714+
}
3715+
3716+
@override
3717+
Map<String, Object> toJson({ClientUriConverter? clientUriConverter}) {
3718+
var result = <String, Object>{};
3719+
var analysis = this.analysis;
3720+
if (analysis != null) {
3721+
result['analysis'] =
3722+
analysis.toJson(clientUriConverter: clientUriConverter);
3723+
}
3724+
return result;
3725+
}
3726+
3727+
Notification toNotification({ClientUriConverter? clientUriConverter}) {
3728+
return Notification(
3729+
'plugin.status', toJson(clientUriConverter: clientUriConverter));
3730+
}
3731+
3732+
@override
3733+
String toString() => json.encode(toJson(clientUriConverter: null));
3734+
3735+
@override
3736+
bool operator ==(other) {
3737+
if (other is PluginStatusParams) {
3738+
return analysis == other.analysis;
3739+
}
3740+
return false;
3741+
}
3742+
3743+
@override
3744+
int get hashCode => analysis.hashCode;
3745+
}
3746+
36263747
/// plugin.versionCheck params
36273748
///
36283749
/// {

pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,22 @@ abstract class IntegrationTestMixin {
119119
/// Stream controller for [onPluginError].
120120
late StreamController<PluginErrorParams> _onPluginError;
121121

122+
/// Reports the current status of the plugin. Parameters are omitted if there
123+
/// has been no change in the status represented by that parameter.
124+
///
125+
/// Only used for "new" analyzer plugins. Legacy plugins should not use this
126+
/// type.
127+
///
128+
/// Parameters
129+
///
130+
/// analysis: AnalysisStatus (optional)
131+
///
132+
/// The current status of analysis (whether analysis is being performed).
133+
late Stream<PluginStatusParams> onPluginStatus;
134+
135+
/// Stream controller for [onPluginStatus].
136+
late StreamController<PluginStatusParams> _onPluginStatus;
137+
122138
/// Return the navigation information associated with the given region of the
123139
/// given file. If the navigation information for the given file has not yet
124140
/// been computed, or the most recently computed navigation information for
@@ -661,6 +677,8 @@ abstract class IntegrationTestMixin {
661677
void initializeInttestMixin() {
662678
_onPluginError = StreamController<PluginErrorParams>(sync: true);
663679
onPluginError = _onPluginError.stream.asBroadcastStream();
680+
_onPluginStatus = StreamController<PluginStatusParams>(sync: true);
681+
onPluginStatus = _onPluginStatus.stream.asBroadcastStream();
664682
_onAnalysisErrors = StreamController<AnalysisErrorsParams>(sync: true);
665683
onAnalysisErrors = _onAnalysisErrors.stream.asBroadcastStream();
666684
_onAnalysisFolding = StreamController<AnalysisFoldingParams>(sync: true);
@@ -688,6 +706,11 @@ abstract class IntegrationTestMixin {
688706
_onPluginError
689707
.add(PluginErrorParams.fromJson(decoder, 'params', params));
690708
break;
709+
case 'plugin.status':
710+
outOfTestExpect(params, isPluginStatusParams);
711+
_onPluginStatus
712+
.add(PluginStatusParams.fromJson(decoder, 'params', params));
713+
break;
691714
case 'analysis.errors':
692715
outOfTestExpect(params, isAnalysisErrorsParams);
693716
_onAnalysisErrors

0 commit comments

Comments
 (0)