getCompletions method
Future<List<CompletionSuggestion> >
getCompletions(
- SuggestionContext context, {
- int maxResults = 15,
- Duration debounce = const Duration(milliseconds: 150),
Get completions for the current input.
Implementation
Future<List<CompletionSuggestion>> getCompletions(
SuggestionContext context, {
int maxResults = 15,
Duration debounce = const Duration(milliseconds: 150),
}) async {
final input = context.currentInput;
if (input.isEmpty) return [];
// Determine the word being completed.
final wordStart = _findWordStart(input, context.cursorPosition);
final query = input.substring(wordStart, context.cursorPosition);
if (query.isEmpty) return [];
// Collect suggestions from all applicable providers.
final allSuggestions = <CompletionSuggestion>[];
for (final provider in _providers) {
if (provider.canHandle(query, context)) {
try {
final suggestions = await provider.getSuggestions(query, context);
allSuggestions.addAll(suggestions);
} catch (_) {
// Skip failed providers.
}
}
}
// Add recent input matches.
if (!query.startsWith('/') &&
!query.startsWith('@') &&
!query.startsWith('#')) {
for (final recent in _recentInputs) {
if (_fuzzyMatch(recent, query) && recent != input) {
allSuggestions.add(
CompletionSuggestion(
value: recent,
displayText: recent.length > 60
? '${recent.substring(0, 60)}...'
: recent,
description: 'Recent input',
type: SuggestionType.historyEntry,
icon: 'history',
score: _fuzzyScore(recent, query) * 0.5, // Lower priority
),
);
}
}
}
// Sort by score and deduplicate.
allSuggestions.sort((a, b) => b.score.compareTo(a.score));
final seen = <String>{};
return allSuggestions
.where((s) => seen.add(s.value))
.take(maxResults)
.toList();
}