Class SymbolProvider

java.lang.Object
com.github._1c_syntax.bsl.languageserver.providers.SymbolProvider

@Component public class SymbolProvider extends Object
Провайдер для поиска символов в рабочей области.

Обрабатывает запросы workspace/symbol, делегируя поиск инкрементальному WorkspaceSymbolIndex: индекс хранит уже подготовленные записи символов, поэтому провайдер лишь маппит записи в WorkspaceSymbol без обхода всех документов.

Быстрая древесная выдача (WorkspaceSymbolIndex.search(String, CancelChecker)) отдаётся мгновенно. Если клиент поддерживает частичные результаты (прислал WorkDoneProgressAndPartialResultParams.getPartialResultToken()), и быстрая выдача, и нижнеранжированный «грязный» fuzzy-хвост (подстрока внутри слова и подпоследовательность вразброс, WorkspaceSymbolIndex.searchFuzzyTail(String, java.util.Collection, CancelChecker)) досылаются потоково чанками через $/progress (с проверкой отмены между чанками), а синхронный ответ возвращается ПУСТЫМ, чтобы не дублировать уже отправленные прогрессом чанки.

Без токена частичных результатов поведение определяется булевым флагом workspaceSymbol.syncFuzzySearch: при значении true к древесной выдаче синхронно дописывается результат блокирующего fuzzy-скана; при значении false (по умолчанию) ответом служит только древесная выдача — медленный скан НЕ запускается.

See Also:
  • Constructor Details

  • Method Details

    • getSymbols

      public List<? extends WorkspaceSymbol> getSymbols(WorkspaceSymbolParams params, CancelChecker cancelChecker)
      Выполняет поиск символов рабочей области по запросу workspace/symbol с поддержкой отмены и потоковой выдачи частичных результатов.

      Сначала из WorkspaceSymbolIndex.search(String, CancelChecker) берётся быстрая древесная выдача (точное совпадение, префикс полного имени, многословное camel-hump совпадение, префикс начала слова), ранжированная по релевантности.

      Если токен частичного результата есть (и запрос непуст, и клиент подключён), включается потоковая выдача: и быстрый набор, и fuzzy-хвост (WorkspaceSymbolIndex.searchFuzzyTail(String, java.util.Collection, CancelChecker) с быстрой выдачей в качестве exclude) досылаются $/progress-чанками по STREAM_BATCH_SIZE через streamInBatches(Either, List, CancelChecker). Чтобы не пересортировывать выдачу, быстрые чанки уходят ПЕРВЫМИ (клиент дописывает их в порядке прихода). Синхронный ответ при этом ПУСТ: клиент конкатенирует прогресс-чанки, и повторная отдача того же набора в ответе привела бы к дублям. Отмена проверяется индексом периодически и между чанками; при отмене бросается CancellationException.

      Если токена нет (либо запрос пуст, либо клиент не подключён), потоковая выдача невозможна. Тогда поведение определяется булевым флагом workspaceSymbol.syncFuzzySearch: при true к древесной выдаче синхронно дописывается результат блокирующего fuzzy-скана; при false (по умолчанию) возвращается только древесная выдача, медленный скан не выполняется.

      Parameters:
      params - Параметры запроса workspace/symbol, в т.ч. строка запроса и токен частичного результата
      cancelChecker - Проверяющий отмену запроса
      Returns:
      Полный список при синхронном пути; ПУСТОЙ список при потоковой выдаче (символы ушли в $/progress)