Class ServerContext
Управляет коллекцией всех документов проекта, метаданными конфигурации 1С, обеспечивает доступ к контекстам отдельных документов и их синхронизацию.
-
Constructor Summary
ConstructorsConstructorDescriptionServerContext(ObjectProvider<DocumentContext> documentContextProvider, WorkDoneProgressHelper workDoneProgressHelper, GlobalLanguageServerConfiguration globalConfiguration, ExecutorService computeConfigurationExecutor, ExecutorService populateContextExecutor, Cache<String, Optional<CommonModule>> commonModuleCache) Creates a newServerContextinstance. -
Method Summary
Modifier and TypeMethodDescriptionaddDocument(URI uri) Добавить документ в контекст.Метаданные конфигурации рабочей области, дождавшись их чтения.voidДождаться конца подготовки рабочей области, если она идёт в фоне: метаданные конфигурации прочитаны, её типы зарегистрированы.voidclear()Удалить все документы из контекста.voidcloseDocument(DocumentContext documentContext) Закрыть документ и очистить его содержимое.findCommonModule(String name) Найти общий модуль по имени с мемоизацией (ограниченный кэшcommonModuleCache).Найти общий модуль по полному имени типа.voidЗакончить подготовку рабочей области: заново привязать к конфигурации документы, заведённые за время подготовки, и отпустить тех, кто её ждёт.Метаданные конфигурации рабочей области; читаются при первом обращении.getDocument(String mdoRef, com.github._1c_syntax.bsl.types.ModuleType moduleType) getDocument(URI uri) Получить документ по URI.getDocumentLock(URI uri) Получить блокировку для выполнения операций над документом по URI.getDocumentNoLock(URI uri) Получить документ по URI без захвата блокировки.Map<com.github._1c_syntax.bsl.types.ModuleType, DocumentContext> getDocuments(String mdoRef) getDocumentState(DocumentContext documentContext) Состояние документа в контексте.getDocumentUnsafe(String uri) Получить документ по строковому URI с нормализацией.getDocumentUnsafe(URI uri) Получить документ по URI с нормализацией.Возвращает иммутабельный снимок открытых документов workspace (т.е.Язык исходников проекта: для конфигурации с заданнымScriptVariant— именно он (русский/английский); для проекта без mdclasses-конфы и при нераспознанном варианте —LanguageServerConfiguration.getLanguage().booleanОчищается ли контекст целиком.booleanisDocumentOpened(DocumentContext documentContext) Проверяет, открыт ли документ в редакторе.voidopenDocument(DocumentContext documentContext, String content, Integer version) Помечает документ как открытый и перестраивает его содержимоеvoidvoidpopulateContext(Collection<File> files) booleanrebindDocument(DocumentContext documentContext) Пересчитать привязку документа к метаданным текущей конфигурации — тип модуля, объект метаданных и ссылку на него (DocumentContext.rebindToConfiguration()) — и переложить документ в индексе по ссылке на объект метаданных.voidrebuildDocument(DocumentContext documentContext) Перестроить документ.voidrebuildDocument(DocumentContext documentContext, String content, Integer version) Перестроить документ, используя новое содержимое.voidПересчитать привязку к метаданным конфигурации у документов, заведённых, пока шла подготовка рабочей области в фоне: их тип модуля и ссылка на объект метаданных могли быть посчитаны без конфигурации (rebindDocument(DocumentContext)).voidremoveDocument(URI uri) Удалить документ из контекста.voidsetConfigurationRoot(@Nullable Path configurationRoot) voidsetLanguageServerConfiguration(LanguageServerConfiguration languageServerConfiguration) voidsetWorkspaceUri(URI workspaceUri) booleantryClearDocument(DocumentContext documentContext) Попытаться очистить документ, если он не открыт.
-
Constructor Details
-
ServerContext
@ConstructorProperties({"documentContextProvider","workDoneProgressHelper","globalConfiguration","computeConfigurationExecutor","populateContextExecutor","commonModuleCache"}) public ServerContext(ObjectProvider<DocumentContext> documentContextProvider, WorkDoneProgressHelper workDoneProgressHelper, GlobalLanguageServerConfiguration globalConfiguration, @Qualifier("computeConfigurationExecutor") ExecutorService computeConfigurationExecutor, @Qualifier("populateContextExecutor") ExecutorService populateContextExecutor, Cache<String, Optional<CommonModule>> commonModuleCache) Creates a newServerContextinstance.- Parameters:
documentContextProvider-workDoneProgressHelper-globalConfiguration-computeConfigurationExecutor-populateContextExecutor-commonModuleCache- Ограниченный кэш резолва общего модуля по имени (имя -> Optional<CommonModule>, кэшируются и промахи) — workspace-scoped бин (см.CacheConfiguration#commonModuleCache). Резолв зависит только от конфигурации воркспейса, аfindCommonModuleвызывается на каждый идентификатор при заполнении индекса ссылок — memo снимает повторное сворачивание регистра вCaseInsensitiveMapконфигурации. Сбрасывается вclear().
-
-
Method Details
-
finishPreparation
public void finishPreparation()Закончить подготовку рабочей области: заново привязать к конфигурации документы, заведённые за время подготовки, и отпустить тех, кто её ждёт.Берёт блокировки документов по одной, поэтому вызывающий поток не должен держать блокировку какого-либо документа.
-
awaitPreparation
public void awaitPreparation()Дождаться конца подготовки рабочей области, если она идёт в фоне: метаданные конфигурации прочитаны, её типы зарегистрированы. -
refreshDocumentsCreatedWhilePreparing
public void refreshDocumentsCreatedWhilePreparing()Пересчитать привязку к метаданным конфигурации у документов, заведённых, пока шла подготовка рабочей области в фоне: их тип модуля и ссылка на объект метаданных могли быть посчитаны без конфигурации (rebindDocument(DocumentContext)). Документы, пересчитанные раньше, повторно не трогаются.Берёт блокировки документов по одной, поэтому вызывающий поток не должен держать блокировку какого-либо документа.
-
populateContext
public void populateContext() -
populateContext
-
getDocuments
-
getDocument
public Optional<DocumentContext> getDocument(String mdoRef, com.github._1c_syntax.bsl.types.ModuleType moduleType) -
getDocument
Получить документ по URI.URI должен быть уже нормализован (например, получен из DocumentContext или через Absolute.uri).
- Parameters:
uri- нормализованный URI документа- Returns:
- Контекст документа или
null, если документ не найден
-
getDocumentNoLock
Получить документ по URI без захвата блокировки.Этот метод предоставляет прямой доступ к хранилищу документов без синхронизации. Используйте его только в случаях, когда:
- блокировка уже захвачена вызывающим кодом;
- операция только на чтение и допускается eventual consistency;
- критична производительность и накладные расходы на блокировку недопустимы.
Внимание: использование этого метода без внешней синхронизации может привести к состояниям гонки, если другой поток одновременно модифицирует документ или коллекцию.
- Parameters:
uri- нормализованный URI документа- Returns:
- Контекст документа или
null, если документ не найден - See Also:
-
getDocumentUnsafe
Получить документ по URI с нормализацией.Используется для внешних вызовов (CLI, Service), где URI может быть не нормализован.
- Parameters:
uri- URI документа (будет нормализован)- Returns:
- Контекст документа или
null, если документ не найден
-
getDocumentUnsafe
Получить документ по строковому URI с нормализацией.Используется для внешних вызовов (CLI, Service), где URI может быть не нормализован.
- Parameters:
uri- строковый URI документа- Returns:
- Контекст документа или
null, если документ не найден
-
getDocuments
-
addDocument
Добавить документ в контекст.URI должен быть уже нормализован.
- Parameters:
uri- нормализованный URI документа- Returns:
- Контекст документа
-
removeDocument
Удалить документ из контекста.URI должен быть уже нормализован.
- Parameters:
uri- нормализованный URI документа
-
clear
public void clear()Удалить все документы из контекста.Каждый документ удаляется через
removeDocument(URI)— это даётServerContextDocumentRemovedEventчерез AOP-аспект, на который подписаны downstream-индексы (ReferenceIndex,OScriptLibraryIndexи прочие singleton'ы со state, индексирующим документы).Open-документы сначала «закрываются» сбросом
openedDocuments, чтобыremoveDocument(URI)не падал на guard'е «document is opened». После — финальная очистка карт, не привязанных к конкретному URI (configurationMetadata).На всё время очистки
isClearing()отвечаетtrue. -
isClearing
public boolean isClearing()Очищается ли контекст целиком.Пока идёт
clear(), документы удаляются по одному и о каждом публикуется событие удаления, но к концу не останется ни одного. Подписчик, которому дорого удалять данные по документу, может по такому событию снести свои данные по контексту разом.- Returns:
true, пока идётclear().
-
getDocumentLock
Получить блокировку для выполнения операций над документом по URI.Может использоваться для операций, требующих долгосрочной установки блокировки на изменение объекта.
- Parameters:
uri- URI документа- Returns:
- блокировка, связанная с URI документа.
-
openDocument
Помечает документ как открытый и перестраивает его содержимоеДокументы, помеченные как открытые, не будут удаляться из контекста сервера при вызове
removeDocument(URI), а так же не будут очищаться при вызовеtryClearDocument(DocumentContext).Если вспомогательные данные документа был в "замороженном" состоянии, то перед перестроением документа они будут разморожены.
- Parameters:
documentContext- документ, который необходимо открыть.content- новое содержимое документа.version- версия документа.
-
isDocumentOpened
Проверяет, открыт ли документ в редакторе.Открытые документы управляются клиентом через события textDocument/didOpen, textDocument/didChange и textDocument/didClose. Для таких документов содержимое хранится в памяти сервера и может отличаться от содержимого файла на диске.
Открытые документы не будут удалены при вызове
removeDocument(URI)и не будут очищены при вызовеtryClearDocument(DocumentContext).- Parameters:
documentContext- документ для проверки- Returns:
true, если документ открыт в редакторе,falseв противном случае
-
getOpenedDocuments
Возвращает иммутабельный снимок открытых документов workspace (т.е. тех, для которых клиент прислалtextDocument/didOpenи не прислалtextDocument/didClose). -
getDocumentState
Состояние документа в контексте.Ответ действителен ровно до ближайшей операции над документом; чтобы он не устарел посреди работы, спрашивать состояние и читать вторичные данные надо под одной блокировкой (см.
getDocumentLock(URI)).- Parameters:
documentContext- документ.- Returns:
- состояние документа;
DocumentState.WITHOUT_CONTENTдля документа, о котором контексту ещё ничего не известно.
-
rebuildDocument
Перестроить документ. В качестве содержимого будут использоваться данные, прочитанные из файла, с которым связан документ.Если файл прочитать не удалось, состояние документа не меняется: документ без текста остаётся
DocumentState.WITHOUT_CONTENT, и следующий вызов прочитает файл снова.- Parameters:
documentContext- документ, который необходимо перестроить.
-
rebuildDocument
Перестроить документ, используя новое содержимое.- Parameters:
documentContext- документ, который необходимо перестроить.content- новое содержимое документа.version- версия документа.
-
tryClearDocument
Попытаться очистить документ, если он не открыт.- Parameters:
documentContext- документ, который необходимо попытаться закрыть.- Returns:
true, если вторичные данные документа были реально освобождены;false, если документ открыт в редакторе и очистка пропущена.
-
closeDocument
Закрыть документ и очистить его содержимое.- Parameters:
documentContext- документ, который необходимо закрыть.
-
getConfiguration
Метаданные конфигурации рабочей области; читаются при первом обращении.Пока рабочая область готовится в фоне (
beginPreparation()), а метаданные ещё не прочитаны, отвечает пустой конфигурацией, не дожидаясь чтения.- Returns:
- метаданные конфигурации; пустые, если конфигурации нет или она ещё читается.
-
awaitConfiguration
Метаданные конфигурации рабочей области, дождавшись их чтения. В отличие отgetConfiguration(), пустой конфигурацией, пока рабочая область готовится, не отвечает: метаданные читаются здесь же или дожидаются чтения, начатого раньше.- Returns:
- метаданные конфигурации; пустые, если конфигурации нет.
-
getScriptVariantLanguage
Язык исходников проекта: для конфигурации с заданнымScriptVariant— именно он (русский/английский); для проекта без mdclasses-конфы и при нераспознанном варианте —LanguageServerConfiguration.getLanguage().Этот язык — преобладающий в коде: на нём пишет пользователь и на нём же платформа заполняет то, что зависит от варианта языка. Не путать с языком интерфейса LS.
Расчёт живёт здесь, а не у документа, потому что зависит только от конфигурации рабочей области — его спрашивают и там, где документа нет (регистрация типов). У документа остаётся единственная своя поправка — OS-файл (см.
DocumentContext.getScriptVariantLanguage()).- Returns:
- язык исходников проекта.
-
findCommonModule
Найти общий модуль по имени с мемоизацией (ограниченный кэшcommonModuleCache). ЭквивалентноgetConfiguration().findCommonModule(name), но без повторного прохода по case-insensitive карте конфигурации на каждый вызов.Ключ кэша — сырой текст идентификатора (намеренно не нормализуется): на попадании это дешёвый lookup без сворачивания регистра — ровно то, ради чего кэш и нужен.
toLowerCaseна каждый вызов вернул бы посимвольное сворачивание + аллокацию строки на горячий путь, а экономия (схлопывание редких регистровых вариантов одного имени) — околонулевая. Сам резолв внутри остаётся регистронезависимым.- Parameters:
name- имя общего модуля- Returns:
- общий модуль или
Optional.empty(), если такого нет
-
findCommonModuleForTypeName
Найти общий модуль по полному имени типа.Составное имя отбрасывается только тогда, когда загруженный словарь гарантированно не содержит имён с точкой. Пока метаданные не прочитаны, действует обычный резолв.
- Parameters:
name- полное имя типа.- Returns:
- общий модуль с совпадающим именем либо пустой результат.
-
rebindDocument
Пересчитать привязку документа к метаданным текущей конфигурации — тип модуля, объект метаданных и ссылку на него (DocumentContext.rebindToConfiguration()) — и переложить документ в индексе по ссылке на объект метаданных.Берёт блокировку документа на запись.
- Parameters:
documentContext- документ.- Returns:
true, если дерево символов документа построено заново;false, если документ уже снят с рабочей области или у него нет текста.
-
getLanguageServerConfiguration
-
setLanguageServerConfiguration
-
getWorkspaceUri
-
setWorkspaceUri
-
setConfigurationRoot
-
getConfigurationRoot
-