Class DocumentChangeExecutor

java.lang.Object
com.github._1c_syntax.bsl.languageserver.context.DocumentChangeExecutor

public final class DocumentChangeExecutor extends Object
Управляет последовательной обработкой изменений документа для одного DocumentContext.

Задачи попадают в приоритетную очередь и выполняются строго в порядке возрастания версии, что позволяет консистентно накапливать изменения и применять их одним вызовом обработчика. Дополнительно класс предоставляет барьер awaitLatest(), позволяющий клиентским потокам дождаться применения всех поставленных изменений и тем самым читать консистентное состояние документа.

  • Constructor Details

    • DocumentChangeExecutor

      public DocumentChangeExecutor(DocumentContext documentContext, BiFunction<String, List<TextDocumentContentChangeEvent>, String> changeApplier, DocumentChangeExecutor.DocumentChangeListener changeListener, String threadName)
      Создаёт executor для конкретного документа и запускает рабочий поток.
      Parameters:
      documentContext - контекст документа, для которого обрабатываются изменения
      changeApplier - функция, применяющая набор изменений к переданному тексту
      changeListener - слушатель, вызываемый после накопления изменений и перед rebuild
      threadName - префикс имени потока, чтобы упростить отладку
  • Method Details

    • submit

      public void submit(int version, List<TextDocumentContentChangeEvent> contentChanges)
      Помещает задачу в очередь на обработку.
      Parameters:
      version - версия документа, полученная от клиента LSP
      contentChanges - список изменений, которые необходимо применить
    • shutdown

      public void shutdown()
      Завершает работу executor'а, дожидаясь обработки уже поставленных задач.
    • shutdownNow

      public void shutdownNow()
      Немедленно останавливает executor и очищает очередь.
    • awaitTermination

      public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
      Ожидает завершения рабочего потока в течение указанного таймаута.
      Parameters:
      timeout - длительность ожидания
      unit - единица измерения таймаута
      Returns:
      true, если поток завершился за отведённое время; иначе false
      Throws:
      InterruptedException - если ожидание было прервано
    • awaitLatest

      public CompletableFuture<Void> awaitLatest()
      Дожидается применения всех изменений, поставленных на момент вызова.

      Метод безопасно вызывается из любых потоков: если все изменения уже применены, возвращает немедленно завершённый CompletableFuture, иначе регистрирует ожидание и завершит его, как только рабочий поток применит соответствующую версию.

      Returns:
      future, завершающийся после применения всех накопленных изменений.