Class ServerContextProvider
Управляет коллекцией экземпляров ServerContext (по одному на каждую workspace folder)
и обеспечивает маршрутизацию от URI документа к контексту сервера.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final URIСинтетический 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 и очистить ее контекст сервера.resolveContextForDocument(URI documentUri) Определить контекст сервера для документа с фолбэком на главный workspace.
-
Field Details
-
DEFAULT_WORKSPACE_URI
Синтетический URI дефолтного («безворкспейсного») контекста. Создаётся, когда клиент при инициализации не прислал ни одной workspace folder, ниrootUri/rootPath(режим открытия одиночного файла или untitled-буфера). Схема неfile— этот URI не должен попадать в код, приводящий URI к файловому пути (Absolute.path,Path.of).
-
-
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:
- созданный контекст сервера
-
registerDefaultWorkspace
Создать дефолтный («безворкспейсный») контекст сервера.Используется, когда при инициализации не переданы ни workspace folders, ни
rootUri/rootPath(открыт одиночный файл или untitled-буфер). Контекст создаётся сconfigurationRoot == null, поэтомуServerContext.populateContext()ничего не сканирует. Документы, не попавшие ни в один workspace, маршрутизируются в него (или в первый добавленный workspace) — см.resolveContextForDocument(URI).В отличие от
addWorkspace(URI, String), метод намеренно не публикуетWorkspaceAddedEvent: синтетический URI не является файловым, и подписчики, приводящие 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, если не найден
-
resolveContextForDocument
Определить контекст сервера для документа с фолбэком на главный workspace.Сначала ищет владеющий контекст по правилам
getServerContext(URI)(индекс, затем префикс URI workspace). Если документ не относится ни к одному корню (untitled-буфер, файл вне папок проекта, одиночный файл), маршрутизирует его в главный контекст (getPrimaryContext()). URI нормализуется черезAbsolute.uri(URI).- Parameters:
documentUri- URI документа (будет нормализован)- Returns:
- контекст сервера для документа (никогда не
null) - Throws:
IllegalStateException- если не зарегистрирован ни один контекст (провайдер используется доinitialize()или послеshutdown())
-
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
Обработчик события удаления документа из контекста. Удаляет документ из индекса.
-