44
55import 'dart:async' ;
66
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' ;
98import 'package:analysis_server/src/handler/legacy/legacy_handler.dart' ;
109import 'package:analysis_server/src/legacy_analysis_server.dart' ;
10+ import 'package:analysis_server/src/protocol_server.dart' ;
1111import 'package:analysis_server/src/provisional/completion/completion_core.dart' ;
1212import 'package:analysis_server/src/request_handler_mixin.dart' ;
1313import 'package:analysis_server/src/services/completion/completion_performance.dart' ;
14+ import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart' ;
1415import 'package:analysis_server/src/services/completion/dart/completion_manager.dart' ;
15- import 'package:analysis_server/src/services/completion/dart/fuzzy_filter_sort.dart' ;
1616import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart' ;
1717import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart' ;
1818import 'package:analysis_server/src/services/completion/yaml/fix_data_generator.dart' ;
@@ -33,6 +33,36 @@ class CompletionGetSuggestions2Handler extends CompletionHandler
3333 super .performance,
3434 );
3535
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+
3666 /// Computes completion results for [request] and append them to the stream.
3767 ///
3868 /// Clients should not call this method directly as it is
@@ -193,9 +223,15 @@ class CompletionGetSuggestions2Handler extends CompletionHandler
193223 setNewRequest (completionRequest);
194224
195225 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+ );
197232 try {
198- suggestionBuilders = await computeSuggestions (
233+ candidateSuggestions = await computeFinalSuggestions (
234+ manager: manager,
199235 budget: budget,
200236 performance: performance,
201237 request: completionRequest,
@@ -213,27 +249,26 @@ class CompletionGetSuggestions2Handler extends CompletionHandler
213249 ).toResponse (request.id, clientUriConverter: server.uriConverter),
214250 );
215251 }
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;
216257
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;
229258 completionPerformance.transmittedSuggestionCount =
230- lengthRestricted.length;
231-
232- var suggestions = lengthRestricted.map ((e) => e.build ()).toList ();
259+ candidateSuggestions.length;
233260
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+ });
237272
238273 performance.run ('sendResponse' , (_) {
239274 sendResult (
0 commit comments