Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the You can disable this status message by setting the
Comment |
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
…xtProvider Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContextProvider.java
Show resolved
Hide resolved
src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SymbolProvider.java
Outdated
Show resolved
Hide resolved
src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java
Outdated
Show resolved
Hide resolved
src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java
Outdated
Show resolved
Hide resolved
src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java
Outdated
Show resolved
Hide resolved
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java
Show resolved
Hide resolved
- Create ReferenceContext record wrapping SymbolOccurrenceRepository + LocationRepository - Remove @component from LocationRepository and SymbolOccurrenceRepository - Add referenceContext field to ServerContext (Bounded Context pattern) - Create ReferenceContext per workspace in ServerContextProvider.addWorkspace() - Refactor ReferenceIndex to resolve repos via ServerContextProvider.getServerContext(uri) - Make repository access Optional-safe for graceful degradation during populateContext - Fix MissingCommonModuleMethodDiagnostic to get LocationRepository from ServerContext - Add crossWorkspaceIsolation test verifying separate repos per workspace
- Replace isEmpty()+get() with map()+orElse() in getReferencesTo - Inline getRepositories().ifPresent() in add* methods - Extract saveOccurrence() helper to DRY up add* methods
|
/buildJar |
|
✅ Собраны JAR-файлы для этого PR по команде Артефакт: 5428374501 Файлы внутри:
|
…known file Verify that each method gracefully returns empty/null result when called with a URI not registered in any workspace.
There was a problem hiding this comment.
Pull request overview
PR добавляет полноценную поддержку нескольких workspace folders в BSL Language Server (LSP), обеспечивая изоляцию данных и конфигурации на уровне workspace через отдельные ServerContext.
Changes:
- Введён
ServerContextProviderи переведены ключевые компоненты на получениеServerContext/конфигурации изDocumentContext(per-workspace). - Переработана инфраструктура диагностик (инициализация/конфигурация/рефреш) под per-workspace конфигурацию (factory/provider-подход).
- Существенно обновлены тесты и CLI/репортёры под новую модель workspaces и конфигураций.
Reviewed changes
Copilot reviewed 155 out of 155 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| src/test/java/com/github/_1c_syntax/bsl/languageserver/util/TestApplicationContext.java | Добавлен доступ к ObjectProvider для тестовой инфраструктуры. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/util/AbstractDirtyContextTestExecutionListener.java | Очистка ServerContextProvider между тестами. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/reporters/SarifReporterTest.java | Перевод теста на AbstractServerContextAwareTest и per-workspace контекст. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/reporters/GenericReporterTest.java | Адаптация теста под per-workspace контекст и очистку между тестами. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/reporters/CodeQualityReporterTest.java | Адаптация теста под per-workspace контекст. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/reporters/CodeQualityReportEntryTest.java | Инициализация per-workspace контекста перед тестами. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexReferenceFinderTest.java | Переход с injected ServerContext на базовый тестовый контекст. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinderTest.java | Уточнение поведения после refresh контекста (перезагрузка документа в новом контексте). |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/SymbolProviderTest.java | Регистрация workspace через ServerContextProvider для теста. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/SemanticTokensProviderTest.java | Создание workspace через ServerContextProvider в тест-кейсе. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java | Переход на AbstractServerContextAwareTest + per-workspace init. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/ReferencesProviderTest.java | Переход на AbstractServerContextAwareTest + per-workspace init. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/InlayHintProviderTest.java | Тестирование inlay hints через конфигурацию workspace, без provider-бины “enabled suppliers”. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/FormatProviderTest.java | Использование конфигурации из documentContext.getServerContext() вместо singleton конфигурации. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/DocumentLinkProviderTest.java | Настройка document link options через per-workspace конфигурацию. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/DefinitionProviderTest.java | Переход на AbstractServerContextAwareTest + per-workspace init. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeLensProviderTest.java | Получение конфигурации из per-workspace контекста для событий refresh. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProviderTest.java | Создание DiagnosticInfo на основе per-workspace конфигурации. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/SourceDefinedMethodCallInlayHintSupplierTest.java | Перенос конфигурации параметров supplier в per-workspace контекст. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java | Переход на AbstractServerContextAwareTest. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilderTest.java | Переход на AbstractServerContextAwareTest. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java | Переход на AbstractServerContextAwareTest. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/documentlink/DiagnosticDescriptionDocumentLinkSupplierTest.java | Настройка через per-workspace конфигурацию + очистка контекста между тестами. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfoTest.java | Инициализация per-workspace контекста, получение конфигурации из контекста. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfoOverrideTest.java | Инициализация per-workspace контекста, получение конфигурации из контекста. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/MinimumLSPDiagnosticLevelTest.java | Адаптация к per-workspace DocumentContext/ServerContext. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java | Переход на per-workspace контекст, получение diagnostic infos из контекста. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryToMissingMetadataDiagnosticTest.java | Явная инициализация пустого контекста без метаданных. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/OrdinaryAppSupportDiagnosticTest.java | Перенос настройки опции в per-workspace конфигурацию. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DiagnosticInfosTest.java | Получение diagnostic infos/config из per-workspace контекста. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DenyIncompleteValuesDiagnosticTest.java | Переход на initServerContext(...) вместо ручной установки root. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractDiagnosticTest.java | Перевод получения diagnostic instance на DiagnosticObjectProvider.get(info, configuration). |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputerTest.java | Создание workspace через ServerContextProvider перед проверками. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContextTest.java | Переход на AbstractServerContextAwareTest и per-workspace контекст. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/context/AbstractServerContextAwareTest.java | Базовый хелпер для тестов с ServerContextProvider/workspace init. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/configuration/watcher/ConfigurationFileSystemWatcherTest.java | Разделение тестов на global vs workspace конфиг и добавление @TempDir. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/configuration/LanguageServerConfigurationFactoryTest.java | Новые тесты фабрики per-workspace конфигурации. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/configuration/GlobalConfigurationTest.java | Проверка fallback/загрузки через factory вместо singleton конфигурации. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/configuration/ConfigurationTest.java | Проверка загрузки через factory вместо singleton конфигурации. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/color/WebColorPresentationSupplierTest.java | Использование per-workspace конфигурации языка. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/color/ConstructorColorPresentationSupplierTest.java | Использование per-workspace конфигурации языка. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codelenses/testrunner/TestRunnerAdapterTest.java | Использование per-workspace конфигурации. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codelenses/DebugTestCodeLensSupplierTest.java | Конфигурация CodeLens теперь берётся из DocumentContext/workspace. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codelenses/CyclomaticComplexityCodeLensSupplierTest.java | Настройки порога сложности через per-workspace конфигурацию. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codelenses/CognitiveComplexityCodeLensSupplierTest.java | Настройки порога сложности через per-workspace конфигурацию. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codelenses/AbstractRunTestsCodeLensSupplierTest.java | Переход на supplier без injected configuration + явный resolve override. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/QuickFixSupplierTest.java | Обновление API: передача ServerContext в QuickFixSupplier. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateStandardRegionsSupplierTest.java | Язык задаётся через per-workspace конфигурацию. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/ExtractStructureConstructorSupplierTest.java | Язык задаётся через per-workspace конфигурацию + очистка контекста. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/DisableDiagnosticTriggeringSupplierTest.java | Язык задаётся через per-workspace конфигурацию + очистка контекста. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/cli/WebsocketCommandTest.java | Переход CLI-конфига на GlobalLanguageServerConfiguration. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/aop/sentry/SentryScopeConfigurerTest.java | Переход на global конфигурацию. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/aop/sentry/PermissionFilterBeforeSendCallbackTest.java | Переход на global конфигурацию. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/aop/measures/MeasuresSubsystemTest.java | Pереход на per-workspace контекст и создание DocumentContext с контекстом. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServerTest.java | Добавлены тесты fallback-инициализации (rootUri/rootPath/empty/no info). |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLLSBindingTest.java | Обновление API binding: diagnostic infos фабрика/конфиг фабрика. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/AnalyzeProjectOnStartTest.java | Переход на ServerContextProvider и spy контекста per-workspace. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Resources.java | Перевод instance-ресурсов на global конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/semantictokens/StringSemanticTokensSupplier.java | Чтение настроек semantic tokens из per-workspace конфигурации через DocumentContext. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/SarifReporter.java | Перевод репортёра на получение данных из workspace ServerContext по AnalysisInfo. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/GenericIssueReporter.java | Аналогично: репортёр получает diagnostic infos из workspace контекста. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/CodeQualityReporter.java | Аналогично: репортёр получает diagnostic infos из workspace контекста. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/AbstractDiagnosticReporter.java | Новая базовая логика поиска ServerContext по AnalysisInfo.sourceDir. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/SymbolOccurrenceRepository.java | Репозиторий больше не Spring bean (используется per-workspace). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/ReferenceContext.java | Новый per-workspace контейнер репозиториев references. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/LocationRepository.java | Репозиторий больше не Spring bean (используется per-workspace). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/references/SourceDefinedSymbolDeclarationReferenceFinder.java | Маршрутизация поиска документа через ServerContextProvider/Optional API. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java | Переход references-настроек на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinder.java | Изоляция registeredAnnotations по workspace (ServerContext). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SymbolProvider.java | Поиск символов по всем workspace контекстам через provider. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/InlayHintProvider.java | Фильтрация suppliers на лету по per-workspace конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeLensProvider.java | Фильтрация suppliers на лету по per-workspace конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/infrastructure/InlayHintsConfiguration.java | Упрощение конфигурации: статическая проверка enabled. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/SourceDefinedMethodCallInlayHintSupplier.java | Получение параметров inlay hints из per-workspace конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/documentlink/DiagnosticDescriptionDocumentLinkSupplier.java | Получение опций document links из per-workspace конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticsConfiguration.java | Создание диагностик на основе per-workspace DiagnosticInfo и конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticObjectProvider.java | Новый способ инициализации diagnostic beans (set info + initAfterInfoSet + configure). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticInfoRefresher.java | Рефреш diagnostic infos по всем workspace контекстам. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/OrdinaryAppSupportDiagnostic.java | Чтение опций диагностики из per-workspace конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedStatementsDiagnostic.java | Переход с @PostConstruct на initAfterInfoSet(). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedConstructorsInStructureDeclarationDiagnostic.java | Переход с @PostConstruct на initAfterInfoSet(). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingCommonModuleMethodDiagnostic.java | Использование per-workspace ReferenceContext.locations(). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/InvalidCharacterInFileDiagnostic.java | Переход с @PostConstruct на initAfterInfoSet(). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IfElseDuplicatedConditionDiagnostic.java | Переход с @PostConstruct на initAfterInfoSet(). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IfElseDuplicatedCodeBlockDiagnostic.java | Переход с @PostConstruct на initAfterInfoSet(). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IdenticalExpressionsDiagnostic.java | Проброс per-workspace конфигурации в форматирование. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ForbiddenMetadataNameDiagnostic.java | Удаление injected конфигурации (переход на контекст). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameWordsDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameServerCallDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameGlobalDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameGlobalClientDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameFullAccessDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameClientServerDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameClientDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleNameCachedDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommonModuleInvalidTypeDiagnostic.java | Удаление dependency на singleton конфигурацию (ctor без параметров). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/BSLDiagnostic.java | Добавлен lifecycle-хук initAfterInfoSet(). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractCommonModuleNameDiagnostic.java | Перевод логики на чтение per-workspace конфигурации через DocumentContext. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/context/events/WorkspaceRemovedEvent.java | Новое событие жизненного цикла workspace (после удаления). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/context/events/WorkspaceAddedEvent.java | Новое событие жизненного цикла workspace (после добавления). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/context/events/ServerContextDocumentAddedEvent.java | Новое событие добавления документа в контекст. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/context/events/BeforeWorkspaceRemovedEvent.java | Новое событие жизненного цикла workspace (перед удалением). |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java | Прототипный scope + per-workspace конфигурация/diagnostic infos/reference context. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.java | Передача ServerContext через конструктор, чтение настроек через контекст. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/watcher/ConfigurationFileChangeListener.java | Разделение обработки global и workspace конфигов. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/events/GlobalLanguageServerConfigurationChangedEvent.java | Новое событие изменения глобальной конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/LanguageServerConfigurationFactory.java | Создание per-workspace конфигурации с fallback-иерархией. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/color/WebColorPresentationSupplier.java | Перевод языка на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/color/ConstructorColorPresentationSupplier.java | Перевод языка на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/testrunner/TestRunnerAdapter.java | Перевод чтения опций на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/infrastructure/CodeLensesConfiguration.java | supplierIsEnabled сделан публичным и используется в provider. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/RunTestCodeLensSupplier.java | Перевод опций на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/RunAllTestsCodeLensSupplier.java | Перевод опций на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/DebugTestCodeLensSupplier.java | Перевод опций на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/CyclomaticComplexityCodeLensSupplier.java | Удаление dependency на singleton конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/CognitiveComplexityCodeLensSupplier.java | Удаление dependency на singleton конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/AbstractRunTestsCodeLensSupplier.java | Передача конфигурации в getTestSources(...) для per-workspace настроек. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/AbstractMethodComplexityCodeLensSupplier.java | Получение порога/опций из per-workspace конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/QuickFixSupplier.java | API обновлён: получение quick fixes с учётом ServerContext. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/QuickFixCodeActionSupplier.java | Проброс ServerContext в QuickFixSupplier. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateStandardRegionsSupplier.java | Перевод языка на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/FixAllCodeActionSupplier.java | Проброс ServerContext в QuickFixSupplier. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/ExtractStructureConstructorSupplier.java | Перевод языка на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/DisableDiagnosticTriggeringSupplier.java | Перевод языка на per-workspace конфигурацию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/lsp/FileAwarePrintWriter.java | Слушатель переведён на событие global конфигурации. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/WebsocketCommand.java | CLI обновляет global конфигурацию вместо workspace. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/LanguageServerStartCommand.java | CLI обновляет global конфигурацию вместо workspace. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/FormatCommand.java | Форматирование через workspace ServerContextProvider. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java | Анализ выполняется в per-workspace контексте + глобальная конфигурация. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/sentry/PermissionFilterBeforeSendCallback.java | Использование global конфигурации для выбора языка/режима. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/Pointcuts.java | Добавлены pointcuts для global конфигурации и ServerContextProvider. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLSBinding.java | Binding расширен фабриками и доступом к ServerContextProvider. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/AnalyzeProjectOnStart.java | Анализ на старте читает per-workspace конфигурацию из ServerContext. |
| private final ServerContextProvider serverContextProvider; | ||
| // Map: ServerContext -> (AnnotationName -> AnnotationSymbol) | ||
| private final Map<ServerContext, Map<String, AnnotationSymbol>> registeredAnnotations = new ConcurrentHashMap<>(); | ||
|
|
||
| @EventListener | ||
| public void handleContextRefresh(ServerContextPopulatedEvent event) { | ||
| registeredAnnotations.clear(); | ||
| var serverContext = event.getSource(); | ||
| // Очищаем аннотации для этого workspace и регистрируем заново | ||
| registeredAnnotations.put(serverContext, new ConcurrentHashMap<>()); | ||
| serverContext.getDocuments() |
There was a problem hiding this comment.
registeredAnnotations хранит ключи ServerContext и никогда не очищается при удалении workspace. При remove/re-add воркспейсов это оставит «осиротевшие» записи и может привести к росту памяти и кэшам со старыми аннотациями. Добавьте обработчик BeforeWorkspaceRemovedEvent/WorkspaceRemovedEvent (или вызов из ServerContextProvider.clear/removeWorkspace) чтобы удалять запись для соответствующего ServerContext/workspaceUri.
| private final DiagnosticInfosFactory diagnosticInfosFactory; | ||
| private final DiagnosticObjectProvider diagnosticObjectProvider; |
There was a problem hiding this comment.
Поле diagnosticInfosFactory внедряется, но дальше в классе не используется. Лишняя зависимость усложняет граф бинов и вводит в заблуждение (сейчас данные берутся из serverContext). Удалите поле/конструкторный параметр или используйте фабрику по назначению.
| private static final String ALL_DIAGNOSTIC_NAME = ""; | ||
| private final LanguageServerConfiguration languageServerConfiguration; | ||
| private final Resources resources; | ||
|
|
||
| public DisableDiagnosticTriggeringSupplier(LanguageServerConfiguration languageServerConfiguration) { | ||
| this.languageServerConfiguration = languageServerConfiguration; | ||
| public DisableDiagnosticTriggeringSupplier(Resources resources) { | ||
| this.resources = resources; | ||
| } |
There was a problem hiding this comment.
Поле resources сохраняется в классе, но нигде не используется (все вызовы идут через статический Resources.getResourceString(...)). Это лишняя зависимость/шум. Уберите поле и конструкторный параметр либо используйте resources для получения строк (без static).
| private String getMessage(String key) { | ||
| return Resources.getResourceString(languageServerConfiguration.getLanguage(), getClass(), key); | ||
| return Resources.getResourceString(globalConfiguration.getLanguage(), getClass(), key); | ||
| } |
There was a problem hiding this comment.
ServerContext.getMessage() берёт язык из GlobalLanguageServerConfiguration, игнорируя per-workspace languageServerConfiguration. В multi-workspace режиме это приведёт к сообщениям/прогрессу на неправильном языке, если workspace переопределяет language. Используйте languageServerConfiguration.getLanguage() (с fallback на global только если per-workspace конфигурация ещё не установлена).
| if (files.isEmpty()) { | ||
| return 1; | ||
| } | ||
|
|
||
| // Create workspace based on first file path | ||
| Path srcDir = Absolute.path(filePaths[0]); | ||
| if (!srcDir.toFile().isDirectory()) { | ||
| srcDir = srcDir.getParent(); | ||
| } | ||
| serverContext = serverContextProvider.addWorkspace(srcDir.toUri()); | ||
|
|
||
| if (files.isEmpty()) { | ||
| return 1; | ||
| } |
There was a problem hiding this comment.
В call() дважды проверяется files.isEmpty() (вторая проверка после создания workspace никогда не изменит результат). Уберите дубликат, чтобы не запутывать контроль потока.
| void testDidChangeWorkspaceFolders_AddWorkspace() throws IOException { | ||
| // given | ||
| var newWorkspaceDir = tempDir.resolve("new-workspace").toFile(); | ||
| newWorkspaceDir.mkdir(); |
There was a problem hiding this comment.
Method testDidChangeWorkspaceFolders_AddWorkspace ignores exceptional return value of File.mkdir.
| void testDidChangeWorkspaceFolders_AddAndRemove() throws IOException { | ||
| // given | ||
| var newWorkspaceDir = tempDir.resolve("new-workspace-2").toFile(); | ||
| newWorkspaceDir.mkdir(); |
There was a problem hiding this comment.
Method testDidChangeWorkspaceFolders_AddAndRemove ignores exceptional return value of File.mkdir.
| /** | ||
| * Вспомогательный класс для десериализации конфигурации из JSON. | ||
| */ | ||
| @Data |
There was a problem hiding this comment.
Default toString(): SemanticTokensOptions inherits toString() from Object, and so is not suitable for printing.
| ENTRY_DELETE, | ||
| ENTRY_MODIFY | ||
| }, | ||
| SensitivityWatchEventModifier.HIGH |
There was a problem hiding this comment.
Access to unsupported JDK-internal API 'com.sun.nio.file.SensitivityWatchEventModifier'.
- Remove unused imports (7 test files, ReferenceIndex) - Make saveOccurrence, getSourceDefinedSymbol, getFromSymbol static - Move range/occurrenceType declarations closer to usage in buildReference - Specify explicit lambda parameter types (S2211) - Fix assertion style: isPresent()/isEmpty()/isZero(), join chains - Remove unused throws IOException
Add EventListener for BeforeWorkspaceRemovedEvent to remove registeredAnnotations entry when workspace is removed.
…ом в home Регрессия: при разделении на Global/per-workspace потерялся поиск configurationFilePath (app.configuration.path, default .bsl-language-server.json в CWD). Добавлен unit-тест GlobalLanguageServerConfigurationTest с тремя сценариями: - CWD config существует — загружается из него - CWD config отсутствует — fallback на global path - Оба отсутствуют — используются дефолтные значения
… закрытии документа и удалении workspace Добавлены @eventlistener на ServerContextDocumentClosedEvent и BeforeWorkspaceRemovedEvent для предотвращения утечки памяти. Тесты: testCleanupOnDocumentClosed, testCleanupOnWorkspaceRemoved
- Create AnnotationRepository class with register/findByName/removeByUri/clear - Add AnnotationRepository as third component of ReferenceContext record - Refactor AnnotationReferenceFinder to use ReferenceContext.annotations() - Remove per-workspace map and handleBeforeWorkspaceRemoved from AnnotationReferenceFinder - Add 6 unit tests for AnnotationRepository
- Mark didChangeWorkspaceFolders as supported in capabilities table (RU/EN) - Add semantic highlighting, inlay hints, multi-workspace to features list (RU/EN) - Rewrite ConfigurationFile.md: global/local config split, search strategy, file watching (RU/EN) - Add -c flag behavior description to CLI section (RU/EN)
- Create ExecutorConfiguration with 8 executor beans:
- ThreadPoolTaskExecutor for async tasks (text-document-service, workspace-service, sentry)
with composite TaskDecorator (Sentry + ContextPropagating)
- ForkJoinPool for parallelStream tasks (populate-context, compute-configuration,
diagnostic-computer, analyze-on-start, semantic-tokens) wrapped in
ContextPropagatingExecutorService for Sentry/MDC context propagation
- Add ContextPropagatingExecutorService: ExecutorService wrapper that captures
ContextSnapshot before task submission and restores ThreadLocals in executor threads
- Add io.micrometer:context-propagation dependency
- Migrate all 8 consumers to use injected executor beans via ExecutorService interface
- Remove NamedForkJoinWorkerThreadFactory (inlined into ExecutorConfiguration)
- Spring manages executor lifecycle (shutdown on destroy)
Split single 'inlay hints' bullet into 'Code lenses' (cyclomatic/cognitive complexity) and 'Inlay hints' (method call parameters) in both Russian and English documentation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The second check was dead code — files collection doesn't change between the two checks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Change Resources from singleton to @scope(PROTOTYPE) with LanguageServerConfiguration as constructor argument - Add Resources field to ServerContext (per-workspace) - Create Resources via ObjectProvider in ServerContextProvider.addWorkspace() - Update all consumers (code lenses, code actions, hover, description formatter) to obtain Resources from ServerContext - SentryAspect uses GlobalLanguageServerConfiguration with static methods since it has no access to DocumentContext Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Implement custom Spring @scope("workspace") with ThreadLocal-based resolution. LSC and Resources are now workspace-scoped beans with CGLIB proxies, enabling @Autowired injection in consumers. Infrastructure: - WorkspaceContextHolder: ThreadLocal<String> for workspace URI - WorkspaceScope: Spring Scope impl with ConcurrentHashMap store - WorkspaceScopeConfiguration: registers scope via CustomScopeConfigurer - WorkspaceThreadLocalAccessor: Micrometer SPI for context propagation Bean changes: - LanguageServerConfiguration: prototype -> workspace scope with @PostConstruct init() that finds config file from workspace root - Resources: prototype -> workspace scope ServerContextProvider.addWorkspace() sets WorkspaceContextHolder before accessing scoped proxies, stores resolved instances on ServerContext for backward-compatible navigation (serverContext.getXxx()). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…wired Replace serverContext.getLanguageServerConfiguration() navigation with direct field injection using workspace-scoped proxy in 24 consumer files. Skip list (need serverContext navigation): - AnalyzeCommand, AnalyzeProjectOnStart (CLI/event context) - DocumentContext (tightly coupled) - ConfigurationFileChangeListener/Watcher (separate threads) - DiagnosticsConfiguration (multiple serverContext uses) - SarifReporter (CLI reporter context) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace serverContext.getResources() navigation with direct field injection using workspace-scoped proxy in 7 consumer files: - DisableDiagnosticTriggeringSupplier - DebugTestCodeLensSupplier, RunAllTestsCodeLensSupplier, RunTestCodeLensSupplier - DescriptionFormatter, ModuleSymbolMarkupContentBuilder, VariableSymbolMarkupContentBuilder Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|




Multi-Workspace Support Implementation - COMPLETED ✅
Summary
Successfully implemented full support for multiple workspace folders in BSL Language Server according to LSP specification. Each workspace folder gets its own isolated
ServerContextwith separate document collections, metadata, and configuration.Status: ✅ All tests passing!
Architecture
Добавлено:
Core Multi-Workspace Infrastructure
ServerContextProvider- управляетServerContextдля каждого workspace, используетObjectProvider<ServerContext>для получения prototype scope beans от SpringBSLLanguageServer.initialize()workspace/didChangeWorkspaceFoldersвBSLWorkspaceServiceBSLLSBinding.getServerContextProvider()для доступа к провайдеру контекстовPer-Workspace Configuration Support
GlobalLanguageServerConfiguration- глобальная конфигурация для всего сервераLanguageServerConfigurationFactory- фабрика для создания workspace-specific конфигурацийGlobalLanguageServerConfigurationChangedEvent- событие изменения глобальной конфигурацииLanguageServerConfigurationс изолированными настройками для каждого workspaceConfigurationFileSystemWatcherрасширен для отслеживания.bsl-language-server.jsonв каждом workspace отдельноWorkspace Events
WorkspaceAddedEvent- публикуется при добавлении нового workspaceWorkspaceRemovedEvent- публикуется после удаления workspaceBeforeWorkspaceRemovedEvent- публикуется перед удалением workspace для cleanupServerContextDocumentAddedEvent- публикуется при добавлении документа в контекстEventPublisherAspect- AOP аспект для автоматической публикации событий через SpringPointcuts- определения pointcuts для AOPDiagnostics Infrastructure Refactoring
DiagnosticInfosFactory- factory для создания DiagnosticInfoDiagnosticObjectProvider- provider для получения diagnostic instancesDiagnosticBeanPostProcessorиDiagnosticInfosConfiguration(заменены на factory pattern)Testing Infrastructure
ServerContextProviderTest- 5 тестов для основной функциональности providerBSLWorkspaceServiceTest- 3 новых теста дляdidChangeWorkspaceFolders(add, remove, add+remove)BSLLanguageServerTest- 4 новых теста для fallback логики инициализации (rootUri, rootPath, empty list, no info)LanguageServerConfigurationFactoryTest- тесты для per-workspace конфигурацииGlobalLanguageServerConfigurationTest- 3 unit-теста для стратегии поиска конфигурационного файла (CWD → $HOME → defaults)AnnotationRepositoryTest- 6 unit-тестов для нового репозитория аннотаций (register, findByName, removeByUri, clear)CognitiveComplexityInlayHintSupplierTest- тест очисткиenabledMethodsпри закрытии документаTestApplicationContext.getBeanProvider()для полученияObjectProviderв тестахFallback Support
workspaceFoldersне указаны, используетсяrootUri(LSP 3.0+) илиrootPath(LSP 2.0)Изменено:
ServerContext Management
ServerContext- добавлен@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)для создания множественных экземпляров через SpringServerContextтеперь имеет reference на свойLanguageServerConfigurationServerContextProvider:ObjectProvider<ServerContext>для создания экземпляровAbsolute.uri()для нормализации URI иAbsolute.path(uri)для конвертации URI в Pathfile- поддерживаются все схемы включаяuntitled:(VSCode)getServerContext()использует URI-based matching - работает со всеми схемами URI, избегает redundant нормализацию уже нормализованных URIgetDocument()возвращаетOptional<DocumentContext>вместо@NullablehasWorkspaces()иisDocumentOpened()- нарушали инкапсуляциюThread Management
BSLLanguageServer.initialized():ServerContextдля ForkJoinPoolDocument and Service Layer
BSLTextDocumentService:getContextForDocument(String)с использованиемAbsolute.uri()getContextForDocument()возвращает@Nullableвместо выброса исключения - более идиоматичноreset()вызываетserverContextProvider.clear()вместо ручного перебора контекстовBSLWorkspaceService- обработка файловых событий с учетом workspaceSymbolProvider- поиск символов по всем workspace contextsReferences and Annotations
AnnotationReferenceFinder:AnnotationRepositoryвнутриReferenceContextregisteredAnnotations— данные хранятся вReferenceContext.annotations()handleBeforeWorkspaceRemoved— очистка происходит автоматически при уничтоженииServerContextfindReference()используетgetDocument()вместоgetDocumentUnsafe()(URI уже нормализован из LSP слоя)getAnnotationSymbol()— статический метод, навигирует по object graph черезDocumentContextAnnotationRepository— новый класс-репозиторий для хранения зарегистрированных аннотаций workspace (register, findByName, removeByUri, clear)ReferenceContext— расширен третьим компонентомAnnotationRepository(ранее содержал толькоSymbolOccurrenceRepositoryиLocationRepository)SourceDefinedSymbolDeclarationReferenceFinder- обновлен для работы с Optional APIReferenceIndex- переменнаяdocumentOptпереименована вmaybeDocumentдля читаемостиConfiguration Management
LanguageServerConfiguration- рефакторинг для поддержки как глобальной, так и per-workspace конфигурации (удалён inner classLoadedConfiguration, восстановлена десериализация черезPropertyUtils.copyProperties)GlobalLanguageServerConfiguration- исправлена стратегия поиска конфигурационного файла: CWD →$HOME→ defaults (регрессия при разделении)ConfigurationFileChangeListener- обновлен для работы с per-workspace конфигурациямиConfigurationFileSystemWatcher- расширен для отслеживания конфигурационных файлов в каждом workspaceCleanup and Resource Management
AbstractComplexityInlayHintSupplier— добавленhandleDocumentClosedevent listener для очисткиenabledMethodsпри закрытии документаdocumentContext.getServerContext()вместо injected singletonCLI Commands
AnalyzeCommand,FormatCommandобновлены для создания workspace-specific contextsDiagnostics
BSLDiagnosticбазовый класс обновлен для работы с per-workspace configurationdocumentContext.getServerContext().getConfiguration()Core Classes
BSLLanguageServer- логирование fallback на rootUri/rootPath использует debug level (LSP соответствие)BSLLSBinding- добавлен методgetServerContextProvider()для доступа к провайдеруDocumentContext:@Autowiredиз поляcontext,ServerContextпередается как явный параметр конструктора (критическое исправление для prototype scope)@SuppressWarnings("NullAway.Init")на все поля с@Autowiredдля подавления NullAway warningsServerContext.createDocumentContext()- передаетthisпри созданииDocumentContextTesting
BSLTextDocumentServiceTest- добавлен@BeforeEachдля регистрации workspaceBSLWorkspaceServiceTest- добавлен@BeforeEachдля регистрации workspace + 3 новых теста для coverageSymbolProviderTest- добавлен@BeforeEachдля регистрации workspaceBSLLanguageServerTest- добавлены 4 новых теста для fallback логикиServerContextProviderTest- обновлены тесты для использованияgetAllContexts().isEmpty()вместоhasWorkspaces()TestUtils- используетObjectProvider<ServerContext>для получения новых экземпляровTestRunnerAdapterTest- обновлен для получения конфигурации из documentContextУдалено:
ServerContext contextизBSLLanguageServer,BSLTextDocumentService,BSLWorkspaceService,SymbolProvider@Autowiredаннотация из поляcontextвDocumentContext(заменено на explicit constructor parameter)documentContext.setContext(this)вServerContext.createDocumentContext()!"file".equalsIgnoreCase(documentUri.getScheme())- теперь поддерживаются все схемы URIgetServerContext()- заменено на URI-based matching через уже нормализованные URIAbsolute.uri()call на уже нормализованные URI вgetServerContext()hasWorkspaces()иisDocumentOpened()изServerContextProvider- нарушали инкапсуляцию@Nullableаннотации из методовgetDocument*()вServerContextProvider- заменено наOptional<DocumentContext>getContextForDocument()- заменено на@NullablereturnURI.create()иnew URI()(заменены наAbsolute.uri())new File().getCanonicalFile().toPath()(заменены наAbsolute.path())addWorkspace/removeWorkspace, вызываемых во время initialize (соответствие LSP спецификации)Absolute.uri()(переиспользуются уже созданные объекты)URISyntaxException)ServerContextчерез конструктор (заменено наObjectProvider.getObject())registeredAnnotationsmap иhandleBeforeWorkspaceRemovedвAnnotationReferenceFinder— данные перенесены вAnnotationRepositoryвнутриReferenceContextBSLLanguageServer.initialized()- теперь каждый workspace имеет свой poolDiagnosticBeanPostProcessorиDiagnosticInfosConfiguration(заменены на factory pattern)LanguageServerConfigurationreferences в большинстве классов (заменены на per-workspace references)Управление экземплярами ServerContext
ServerContextтеперь имеет@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE), что позволяет Spring создавать новые экземпляры для каждого workspace.ServerContextProviderиспользуетObjectProvider<ServerContext>для получения настроенных экземпляров от Spring container, обеспечивая правильную инициализацию всех зависимостей и управление жизненным циклом.Критическое исправление:
ServerContextтеперь передается как явный параметр конструктора вDocumentContext, вместо использования@Autowiredfield injection. Это решает проблему с prototype scope, когда Spring пытался инжектировать новый экземпляр при каждом обращении, вместо использования workspace-specific контекста.Per-Workspace Configuration
Архитектура конфигурации:
GlobalLanguageServerConfiguration- глобальная конфигурация сервера, singleton beanLanguageServerConfiguration- workspace-specific конфигурация, создается для каждого workspaceLanguageServerConfigurationFactory- фабрика для создания workspace-specific конфигураций.bsl-language-server.jsonфайл или наследует глобальную конфигурациюConfigurationFileSystemWatcherотслеживает изменения конфигурационных файлов в каждом workspace независимоLanguageServerConfigurationChangedEventGlobalLanguageServerConfigurationChangedEventWorkspace Events System
Event-Driven Architecture:
EventPublisherAspect- AOP аспект автоматически публикует события через Spring ApplicationEventPublisherWorkspaceAddedEvent- после добавления workspaceBeforeWorkspaceRemovedEvent- перед удалением workspace (для cleanup)WorkspaceRemovedEvent- после удаления workspaceServerContextDocumentAddedEvent- при добавлении документаGlobalLanguageServerConfigurationChangedEvent- изменение глобальной конфигурацииLanguageServerConfigurationChangedEvent- изменение workspace конфигурацииNullAway Compatibility
Добавлены
@SuppressWarnings("NullAway.Init")аннотации на все поляDocumentContextс@Autowiredsetter injection для подавления false-positive warnings от NullAway статического анализатора.Workspace Isolation
Полная изоляция per-workspace:
LanguageServerConfiguration)AnnotationReferenceFinder— данные аннотаций хранятся вAnnotationRepositoryвнутриReferenceContext(компонентServerContext), автоматическая очистка при уничтожении workspaceConfigurationFileSystemWatcherдля отслеживания.bsl-language-server.jsonAbstractComplexityInlayHintSupplier— очисткаenabledMethodsпри закрытии документаAnnotationRepository.removeByUri()Thread isolation per workspace:
BSLLanguageServer.initialized()получает свой ForkJoinPoolpopulate-context-{serverContext.hashCode()}-API Changes
ServerContextProvider.getDocument()возвращаетOptional<DocumentContext>:ServerContext.getDocument()который возвращаетOptional@NullableаннотацииBSLTextDocumentService.getContextForDocument()возвращает@Nullable:Удалены методы, нарушающие инкапсуляцию:
hasWorkspaces()- использовался только в тестахisDocumentOpened(DocumentContext)- вызывающий код должен получитьServerContextи проверить самConfiguration API:
GlobalLanguageServerConfiguration) и workspace-specific (LanguageServerConfiguration) конфигурациейdocumentContext.getServerContext().getConfiguration()LanguageServerConfigurationиз большинства классовОбратная совместимость
Добавлена поддержка старых LSP клиентов в
BSLLanguageServer.setConfigurationRoot():workspaceFoldersне передан или пуст, проверяетсяrootUri(LSP 3.0+)rootUriтакже пуст, используетсяrootPath(LSP 2.0)Поддержка всех URI схем
Убран фильтр по схеме
fileи Path-based comparison - теперьServerContextProviderкорректно обрабатывает документы с любыми схемами URI:file:- обычные файлыuntitled:- новые несохраненные документы в VSCodeOptimized URI-based matching:
getServerContext()принимает уже нормализованный URI (черезAbsolute.uri()на вызывающей стороне)Absolute.uri()на уже нормализованные URIУлучшенная обработка событий
Event-driven architecture:
EventPublisherAspectавтоматически публикует workspace lifecycle eventsAnnotationReferenceFinder.handleContextRefresh()получает конкретныйServerContextиз событияAnnotationRepositoryFeatures
✅ Multiple workspace folders support
✅ Backward compatibility with rootUri/rootPath
✅ Dynamic workspace add/remove at runtime
✅ Per-workspace configuration support (.bsl-language-server.json per workspace)
✅ Global server configuration (GlobalLanguageServerConfiguration)
✅ Workspace lifecycle events (WorkspaceAddedEvent, WorkspaceRemovedEvent, BeforeWorkspaceRemovedEvent)
✅ Configuration change events (per-workspace and global)
✅ Event-driven architecture with AOP-based event publishing
✅ Isolated document collections per workspace
✅ Isolated metadata (CF) per workspace
✅ Isolated configuration per workspace
✅ Isolated annotation registrations per workspace
✅ Unique thread pools per workspace with hash-based naming
✅ Per-workspace configuration file watching
✅ Workspace-wide symbol search
✅ Async parallel context population
✅ Consistent URI/Path normalization with Absolute utilities
✅ Optimized URI-based workspace matching (avoids redundant normalization)
✅ Spring-managed ServerContext lifecycle with prototype scope
✅ LSP-compliant logging (debug level in initialize phase)
✅ Proper dependency injection (explicit constructor parameters for prototype beans)
✅ Support for all URI schemes (file, untitled, etc.)
✅ Clean Optional API instead of nullable returns
✅ Idiomatic @nullable returns where appropriate
✅ Proper event-driven architecture per workspace
✅ NullAway static analysis compatibility
✅ Refactored diagnostics infrastructure (factory pattern)
✅ Complete test coverage for new functionality
✅ All tests pass
Документация
didChangeWorkspaceFoldersотмечен как поддерживаемый (RU/EN).-cи автоматического поиска конфигурационного файла (RU/EN).Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.