getCompletions method

Future<List<CompletionSuggestion>> getCompletions(
  1. SuggestionContext context, {
  2. int maxResults = 15,
  3. 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();
}