4
4
5
5
import 'dart:async' ;
6
6
7
- import 'package:analysis_server/protocol/protocol.dart' ;
8
- import 'package:analysis_server/protocol/protocol_generated.dart' ;
7
+ import 'package:analysis_server/src/handler/legacy/completion_utils.dart' ;
9
8
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart' ;
10
9
import 'package:analysis_server/src/legacy_analysis_server.dart' ;
10
+ import 'package:analysis_server/src/protocol_server.dart' ;
11
11
import 'package:analysis_server/src/provisional/completion/completion_core.dart' ;
12
12
import 'package:analysis_server/src/request_handler_mixin.dart' ;
13
13
import 'package:analysis_server/src/services/completion/completion_performance.dart' ;
14
+ import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart' ;
14
15
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart' ;
15
- import 'package:analysis_server/src/services/completion/dart/fuzzy_filter_sort.dart' ;
16
16
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart' ;
17
17
import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart' ;
18
18
import 'package:analysis_server/src/services/completion/yaml/fix_data_generator.dart' ;
@@ -33,6 +33,36 @@ class CompletionGetSuggestions2Handler extends CompletionHandler
33
33
super .performance,
34
34
);
35
35
36
+ /// Computes completion results for [request] and append them to the stream.
37
+ ///
38
+ /// Clients should not call this method directly as it is
39
+ /// automatically called when a client listens to the stream returned by
40
+ /// 'results'. Subclasses should override this method, append at least one
41
+ /// result to the controller, and close the controller stream once complete.
42
+ Future <List <CandidateSuggestion >> computeFinalSuggestions ({
43
+ required CompletionBudget budget,
44
+ required OperationPerformanceImpl performance,
45
+ required DartCompletionRequest request,
46
+ required int maxSuggestions,
47
+ NotImportedSuggestions ? notImportedSuggestions,
48
+ required bool useFilter,
49
+ required DartCompletionManager manager,
50
+ }) async {
51
+ //
52
+ // Compute completions generated by server.
53
+ //
54
+ return await performance.runAsync ('computeSuggestions' , (
55
+ performance,
56
+ ) async {
57
+ var collector = await manager.computeFinalizedCandidateSuggestions (
58
+ request: request,
59
+ performance: performance,
60
+ maxSuggestions: maxSuggestions,
61
+ );
62
+ return collector.suggestions;
63
+ });
64
+ }
65
+
36
66
/// Computes completion results for [request] and append them to the stream.
37
67
///
38
68
/// Clients should not call this method directly as it is
@@ -193,9 +223,15 @@ class CompletionGetSuggestions2Handler extends CompletionHandler
193
223
setNewRequest (completionRequest);
194
224
195
225
var notImportedSuggestions = NotImportedSuggestions ();
196
- var suggestionBuilders = < CompletionSuggestionBuilder > [];
226
+ var candidateSuggestions = < CandidateSuggestion > [];
227
+ var suggestions = < CompletionSuggestion > [];
228
+ var manager = DartCompletionManager (
229
+ budget: budget,
230
+ notImportedSuggestions: notImportedSuggestions,
231
+ );
197
232
try {
198
- suggestionBuilders = await computeSuggestions (
233
+ candidateSuggestions = await computeFinalSuggestions (
234
+ manager: manager,
199
235
budget: budget,
200
236
performance: performance,
201
237
request: completionRequest,
@@ -213,27 +249,26 @@ class CompletionGetSuggestions2Handler extends CompletionHandler
213
249
).toResponse (request.id, clientUriConverter: server.uriConverter),
214
250
);
215
251
}
252
+ // Keep track of whether the set of results was truncated (because
253
+ // budget was exhausted).
254
+ bool isIncomplete =
255
+ (manager.notImportedSuggestions? .isIncomplete ?? false ) ||
256
+ manager.isTruncated;
216
257
217
- performance.run ('filter' , (performance) {
218
- performance.getDataInt ('count' ).add (suggestionBuilders.length);
219
- suggestionBuilders = fuzzyFilterSort (
220
- pattern: completionRequest.targetPrefix,
221
- suggestions: suggestionBuilders,
222
- );
223
- performance.getDataInt ('matchCount' ).add (suggestionBuilders.length);
224
- });
225
-
226
- var lengthRestricted =
227
- suggestionBuilders.take (params.maxResults).toList ();
228
- completionPerformance.computedSuggestionCount = suggestionBuilders.length;
229
258
completionPerformance.transmittedSuggestionCount =
230
- lengthRestricted.length;
231
-
232
- var suggestions = lengthRestricted.map ((e) => e.build ()).toList ();
259
+ candidateSuggestions.length;
233
260
234
- var isIncomplete =
235
- notImportedSuggestions.isIncomplete ||
236
- lengthRestricted.length < suggestionBuilders.length;
261
+ await performance.run ('mapSuggestions' , (performance) async {
262
+ for (var candidate in candidateSuggestions) {
263
+ var item = await candidateToCompletionSuggestion (
264
+ candidate,
265
+ completionRequest,
266
+ );
267
+ if (item != null ) {
268
+ suggestions.add (item);
269
+ }
270
+ }
271
+ });
237
272
238
273
performance.run ('sendResponse' , (_) {
239
274
sendResult (
0 commit comments