Skip to content

Commit 069e30a

Browse files
keertipCommit Queue
authored andcommitted
[Completion] Move the legacy completion handler to using SuggestionCollector.
As discussed, test results have changed to - include all suggestions containing the prefix instead of starting with the prefix - suggestion kind is now 'prefix' instead of 'library' Change-Id: Ica5fe62eaf8d4d0741af112810977f122457759f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439345 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Keerti Parthasarathy <[email protected]>
1 parent 7ffd9cd commit 069e30a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1608
-120
lines changed

pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestions2.dart

Lines changed: 58 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
import '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';
98
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
109
import 'package:analysis_server/src/legacy_analysis_server.dart';
10+
import 'package:analysis_server/src/protocol_server.dart';
1111
import 'package:analysis_server/src/provisional/completion/completion_core.dart';
1212
import 'package:analysis_server/src/request_handler_mixin.dart';
1313
import 'package:analysis_server/src/services/completion/completion_performance.dart';
14+
import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart';
1415
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
15-
import 'package:analysis_server/src/services/completion/dart/fuzzy_filter_sort.dart';
1616
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
1717
import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart';
1818
import '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

Comments
 (0)