Class ServerContextProvider
Управляет коллекцией экземпляров ServerContext (по одному на каждую workspace folder)
и обеспечивает маршрутизацию от URI документа к контексту сервера.
-
Constructor Summary
ConstructorsConstructorDescriptionServerContextProvider(ObjectProvider<ServerContext> serverContextObjectProvider, LanguageServerConfiguration languageServerConfiguration, WorkspaceBeanScope workspaceScope) -
Method Summary
Modifier and TypeMethodDescriptionaddWorkspace(URI workspaceUri) Добавить workspace по URI и создать для нее контекст сервера.addWorkspace(URI workspaceUri, @Nullable String workspaceName) Добавить workspace по URI и создать для нее контекст сервера.addWorkspace(WorkspaceFolder workspaceFolder) Добавить workspace folder и создать для нее контекст сервера.voidclear()Очистить все workspaces.Получить все контексты серверов с их URI.getDocument(URI uri) Получить документ по нормализованному URI.getDocumentNoLock(URI uri) Получить документ по URI без захвата per-document RWLock.getDocumentUnsafe(String uri) Получить документ по строковому URI с нормализацией.getDocumentUnsafe(URI uri) Получить документ по URI с нормализацией.То же, чтоgetDocumentNoLock(URI), но с нормализацией.getServerContext(URI documentUri) Получить контекст сервера для URI документа.getServerContextUnsafe(URI documentUri) Получить контекст сервера для URI документа (с нормализацией URI).voidОбработчик события добавления документа в контекст.voidОбработчик события удаления документа из контекста.voidremoveWorkspace(WorkspaceFolder workspaceFolder) Удалить workspace folder и очистить ее контекст сервера.
-
Constructor Details
-
ServerContextProvider
public ServerContextProvider(ObjectProvider<ServerContext> serverContextObjectProvider, LanguageServerConfiguration languageServerConfiguration, WorkspaceBeanScope workspaceScope)
-
-
Method Details
-
addWorkspace
Добавить workspace folder и создать для нее контекст сервера.- Parameters:
workspaceFolder- информация о workspace folder- Returns:
- созданный контекст сервера
-
addWorkspace
Добавить workspace по URI и создать для нее контекст сервера.- Parameters:
workspaceUri- нормализованный черезAbsolute.uri(URI)URI корня workspace- Returns:
- созданный контекст сервера
-
addWorkspace
Добавить workspace по URI и создать для нее контекст сервера.workspaceUriдолжен быть нормализован черезAbsolute.uri(URI)— иначеclear()/removeWorkspace(WorkspaceFolder)не смогут найти запись по ключу (они ищут черезAbsolute.uri(...)ещё раз).- Parameters:
workspaceUri- нормализованный URI корня workspaceworkspaceName- имя workspace (если null — извлекается из URI)- Returns:
- созданный контекст сервера
-
removeWorkspace
Удалить workspace folder и очистить ее контекст сервера.- Parameters:
workspaceFolder- информация о workspace folder
-
getServerContextUnsafe
Получить контекст сервера для URI документа (с нормализацией URI).Используется для внешних вызовов, где URI может быть не нормализован.
- Parameters:
documentUri- URI документа (будет нормализован)- Returns:
- контекст сервера, содержащий документ, или пустой Optional, если не найден
-
getServerContext
Получить контекст сервера для URI документа.Сначала ищет в индексе документов (O(1)), затем по URI workspace (для новых документов). URI должен быть уже нормализован через
Absolute.uri(URI). ИспользуетсяAbsolute.uri(URI)для канонизации, что работает со всеми схемами URI.- Parameters:
documentUri- нормализованный URI документа- Returns:
- контекст сервера, содержащий документ, или пустой Optional, если не найден
-
getDocumentUnsafe
Получить документ по строковому URI с нормализацией.Ищет документ во всех зарегистрированных контекстах. Используется для внешних вызовов, где URI может быть не нормализован.
- Parameters:
uri- строковый URI документа- Returns:
- Контекст документа, если найден
-
getDocumentUnsafe
Получить документ по URI с нормализацией.Ищет документ во всех зарегистрированных контекстах. Используется для внешних вызовов, где URI может быть не нормализован.
- Parameters:
uri- URI документа (будет нормализован)- Returns:
- Контекст документа, если найден
-
getDocument
Получить документ по нормализованному URI.URI должен быть уже нормализован через
Absolute.uri(URI).- Parameters:
uri- нормализованный URI документа- Returns:
- Контекст документа, если найден
-
getDocumentNoLock
Получить документ по URI без захвата per-document RWLock.Используется горячими путями инференции (reference finders, type inferencer), которые массово опрашивают документы во время
populateContext. RWLock с queued writer'ом блокирует новых readers (fair-mode), что приводит к парку всех worker-потоков.Безопасно для read-only-доступа: документы не пересоздаются, они обновляются in-place под write-lock'ом; чтение без лока даёт snapshot текущего AST/symbol-tree, что допустимо для type-инференции (та и без того eventually-consistent относительно правок пользователя).
-
getDocumentUnsafeNoLock
То же, чтоgetDocumentNoLock(URI), но с нормализацией. АналогgetDocumentUnsafe(URI)для контекстов, где нельзя брать per-document RWLock (см. документацию кgetDocumentNoLock(URI)). -
getAllContexts
Получить все контексты серверов с их URI.- Returns:
- неизменяемая карта URI → контекст сервера
-
clear
public void clear()Очистить все workspaces. -
onDocumentAdded
Обработчик события добавления документа в контекст. Добавляет документ в индекс для быстрого поиска. -
onDocumentRemoved
Обработчик события удаления документа из контекста. Удаляет документ из индекса.
-