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) Добавить документ в контекст.voidclear()Удалить все документы из контекста.voidcloseDocument(DocumentContext documentContext) Закрыть документ и очистить его содержимое.findCommonModule(String name) Найти общий модуль по имени с мемоизацией (ограниченный кэшcommonModuleCache).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) getDocumentUnsafe(String uri) Получить документ по строковому URI с нормализацией.getDocumentUnsafe(URI uri) Получить документ по URI с нормализацией.Возвращает иммутабельный снимок открытых документов workspace (т.е.booleanisDocumentOpened(DocumentContext documentContext) Проверяет, открыт ли документ в редакторе.voidopenDocument(DocumentContext documentContext, String content, Integer version) Помечает документ как открытый и перестраивает его содержимоеvoidvoidpopulateContext(Collection<File> files) voidrebuildDocument(DocumentContext documentContext) Перестроить документ.voidrebuildDocument(DocumentContext documentContext, String content, Integer version) Перестроить документ, используя новое содержимое.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
-
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). -
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). -
rebuildDocument
Перестроить документ. В качестве содержимого будут использоваться данные, прочитанные из файла, с которым связан документ.- Parameters:
documentContext- документ, который необходимо перестроить.
-
rebuildDocument
Перестроить документ, используя новое содержимое.- Parameters:
documentContext- документ, который необходимо перестроить.content- новое содержимое документа.version- версия документа.
-
tryClearDocument
Попытаться очистить документ, если он не открыт.- Parameters:
documentContext- документ, который необходимо попытаться закрыть.- Returns:
true, если вторичные данные документа были реально освобождены;false, если документ открыт в редакторе и очистка пропущена.
-
closeDocument
Закрыть документ и очистить его содержимое.- Parameters:
documentContext- документ, который необходимо закрыть.
-
getConfiguration
-
findCommonModule
Найти общий модуль по имени с мемоизацией (ограниченный кэшcommonModuleCache). ЭквивалентноgetConfiguration().findCommonModule(name), но без повторного прохода по case-insensitive карте конфигурации на каждый вызов.Ключ кэша — сырой текст идентификатора (намеренно не нормализуется): на попадании это дешёвый lookup без сворачивания регистра — ровно то, ради чего кэш и нужен.
toLowerCaseна каждый вызов вернул бы посимвольное сворачивание + аллокацию строки на горячий путь, а экономия (схлопывание редких регистровых вариантов одного имени) — околонулевая. Сам резолв внутри остаётся регистронезависимым.- Parameters:
name- имя общего модуля- Returns:
- общий модуль или
Optional.empty(), если такого нет
-
getLanguageServerConfiguration
-
setLanguageServerConfiguration
-
getWorkspaceUri
-
setWorkspaceUri
-
setConfigurationRoot
-
getConfigurationRoot
-