Skip to content

Comments

Поддержка нескольких workspace в LSP#3662

Open
Copilot wants to merge 61 commits intodevelopfrom
copilot/support-multiple-workspaces
Open

Поддержка нескольких workspace в LSP#3662
Copilot wants to merge 61 commits intodevelopfrom
copilot/support-multiple-workspaces

Conversation

Copy link
Contributor

Copilot AI commented Dec 14, 2025

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 ServerContext with separate document collections, metadata, and configuration.

Status:All tests passing!

Architecture

Добавлено:

Core Multi-Workspace Infrastructure

  • ServerContextProvider - управляет ServerContext для каждого workspace, использует ObjectProvider<ServerContext> для получения prototype scope beans от Spring
  • Инициализация множественных workspace в BSLLanguageServer.initialize()
  • Обработка workspace/didChangeWorkspaceFolders в BSLWorkspaceService
  • Объявление workspace capabilities в server capabilities
  • BSLLSBinding.getServerContextProvider() для доступа к провайдеру контекстов

Per-Workspace Configuration Support

  • GlobalLanguageServerConfiguration - глобальная конфигурация для всего сервера
  • LanguageServerConfigurationFactory - фабрика для создания workspace-specific конфигураций
  • GlobalLanguageServerConfigurationChangedEvent - событие изменения глобальной конфигурации
  • Per-workspace LanguageServerConfiguration с изолированными настройками для каждого workspace
  • ConfigurationFileSystemWatcher расширен для отслеживания .bsl-language-server.json в каждом workspace отдельно

Workspace Events

  • WorkspaceAddedEvent - публикуется при добавлении нового workspace
  • WorkspaceRemovedEvent - публикуется после удаления workspace
  • BeforeWorkspaceRemovedEvent - публикуется перед удалением workspace для cleanup
  • ServerContextDocumentAddedEvent - публикуется при добавлении документа в контекст
  • EventPublisherAspect - AOP аспект для автоматической публикации событий через Spring
  • Pointcuts - определения pointcuts для AOP

Diagnostics Infrastructure Refactoring

  • DiagnosticInfosFactory - factory для создания DiagnosticInfo
  • DiagnosticObjectProvider - provider для получения diagnostic instances
  • Удалены DiagnosticBeanPostProcessor и DiagnosticInfosConfiguration (заменены на factory pattern)

Testing Infrastructure

  • ServerContextProviderTest - 5 тестов для основной функциональности provider
  • BSLWorkspaceServiceTest - 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 при закрытии документа
  • Workspace events testing infrastructure
  • TestApplicationContext.getBeanProvider() для получения ObjectProvider в тестах

Fallback Support

  • Fallback для старых LSP клиентов: если workspaceFolders не указаны, используется rootUri (LSP 3.0+) или rootPath (LSP 2.0)

Изменено:

ServerContext Management

  • ServerContext - добавлен @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) для создания множественных экземпляров через Spring
  • ServerContext теперь имеет reference на свой LanguageServerConfiguration
  • ServerContextProvider:
    • Использует ObjectProvider<ServerContext> для создания экземпляров
    • Использует Absolute.uri() для нормализации URI и Absolute.path(uri) для конвертации URI в Path
    • Убран фильтр по схеме file - поддерживаются все схемы включая untitled: (VSCode)
    • getServerContext() использует URI-based matching - работает со всеми схемами URI, избегает redundant нормализацию уже нормализованных URI
    • getDocument() возвращает Optional<DocumentContext> вместо @Nullable
    • Удалены методы hasWorkspaces() и isDocumentOpened() - нарушали инкапсуляцию

Thread Management

  • BSLLanguageServer.initialized():
    • Каждый workspace получает уникальное имя потока с хешем ServerContext для ForkJoinPool
    • Каждый workspace имеет свой ForkJoinPool с автоматическим shutdown после завершения populateContext

Document and Service Layer

  • BSLTextDocumentService:
    • Добавлен роутинг через getContextForDocument(String) с использованием Absolute.uri()
    • getContextForDocument() возвращает @Nullable вместо выброса исключения - более идиоматично
    • Все вызывающие места обновлены с null-проверками и логированием
    • reset() вызывает serverContextProvider.clear() вместо ручного перебора контекстов
  • BSLWorkspaceService - обработка файловых событий с учетом workspace
  • SymbolProvider - поиск символов по всем workspace contexts

References and Annotations

  • AnnotationReferenceFinder:
    • Данные аннотаций перенесены в AnnotationRepository внутри ReferenceContext
    • Удалена per-workspace map registeredAnnotations — данные хранятся в ReferenceContext.annotations()
    • Удалён handleBeforeWorkspaceRemoved — очистка происходит автоматически при уничтожении ServerContext
    • findReference() использует getDocument() вместо getDocumentUnsafe() (URI уже нормализован из LSP слоя)
    • getAnnotationSymbol() — статический метод, навигирует по object graph через DocumentContext
  • AnnotationRepository — новый класс-репозиторий для хранения зарегистрированных аннотаций workspace (register, findByName, removeByUri, clear)
  • ReferenceContext — расширен третьим компонентом AnnotationRepository (ранее содержал только SymbolOccurrenceRepository и LocationRepository)
  • SourceDefinedSymbolDeclarationReferenceFinder - обновлен для работы с Optional API
  • ReferenceIndex - переменная documentOpt переименована в maybeDocument для читаемости

Configuration Management

  • LanguageServerConfiguration - рефакторинг для поддержки как глобальной, так и per-workspace конфигурации (удалён inner class LoadedConfiguration, восстановлена десериализация через PropertyUtils.copyProperties)
  • GlobalLanguageServerConfiguration - исправлена стратегия поиска конфигурационного файла: CWD → $HOME → defaults (регрессия при разделении)
  • ConfigurationFileChangeListener - обновлен для работы с per-workspace конфигурациями
  • ConfigurationFileSystemWatcher - расширен для отслеживания конфигурационных файлов в каждом workspace

Cleanup and Resource Management

  • AbstractComplexityInlayHintSupplier — добавлен handleDocumentClosed event listener для очистки enabledMethods при закрытии документа
  • Все providers (CodeLensProvider, FormatProvider, InlayHintProvider) обновлены для работы через documentContext.getServerContext() вместо injected singleton
  • Code actions suppliers обновлены для получения конфигурации из document context
  • Color suppliers обновлены для per-workspace configuration

CLI Commands

  • AnalyzeCommand, FormatCommand обновлены для создания workspace-specific contexts
  • Singleton configuration заменена на per-context configuration где необходимо

Diagnostics

  • BSLDiagnostic базовый класс обновлен для работы с per-workspace configuration
  • Все diagnostic классы обновлены для получения metadata через documentContext.getServerContext().getConfiguration()
  • Infrastructure refactored для использования factory pattern вместо bean post processors

Core Classes

  • BSLLanguageServer - логирование fallback на rootUri/rootPath использует debug level (LSP соответствие)
  • BSLLSBinding - добавлен метод getServerContextProvider() для доступа к провайдеру
  • DocumentContext:
    • Удален @Autowired из поля context, ServerContext передается как явный параметр конструктора (критическое исправление для prototype scope)
    • Добавлен @SuppressWarnings("NullAway.Init") на все поля с @Autowired для подавления NullAway warnings
  • ServerContext.createDocumentContext() - передает this при создании DocumentContext

Testing

  • BSLTextDocumentServiceTest - добавлен @BeforeEach для регистрации workspace
  • BSLWorkspaceServiceTest - добавлен @BeforeEach для регистрации workspace + 3 новых теста для coverage
  • SymbolProviderTest - добавлен @BeforeEach для регистрации workspace
  • BSLLanguageServerTest - добавлены 4 новых теста для fallback логики
  • ServerContextProviderTest - обновлены тесты для использования getAllContexts().isEmpty() вместо hasWorkspaces()
  • TestUtils - использует ObjectProvider<ServerContext> для получения новых экземпляров
  • TestRunnerAdapterTest - обновлен для получения конфигурации из documentContext

Удалено:

  • Поля ServerContext context из BSLLanguageServer, BSLTextDocumentService, BSLWorkspaceService, SymbolProvider
  • @Autowired аннотация из поля context в DocumentContext (заменено на explicit constructor parameter)
  • Workaround documentContext.setContext(this) в ServerContext.createDocumentContext()
  • Фильтр !"file".equalsIgnoreCase(documentUri.getScheme()) - теперь поддерживаются все схемы URI
  • Path-based comparison в getServerContext() - заменено на URI-based matching через уже нормализованные URI
  • Redundant Absolute.uri() call на уже нормализованные URI в getServerContext()
  • Методы hasWorkspaces() и isDocumentOpened() из ServerContextProvider - нарушали инкапсуляцию
  • @Nullable аннотации из методов getDocument*() в ServerContextProvider - заменено на Optional<DocumentContext>
  • IllegalStateException в getContextForDocument() - заменено на @Nullable return
  • Вызовы URI.create() и new URI() (заменены на Absolute.uri())
  • Ручные конструкции путей через new File().getCanonicalFile().toPath() (заменены на Absolute.path())
  • Логирование из методов addWorkspace/removeWorkspace, вызываемых во время initialize (соответствие LSP спецификации)
  • Дублирующиеся вызовы Absolute.uri() (переиспользуются уже созданные объекты)
  • Неиспользуемые imports (URISyntaxException)
  • Прямое создание ServerContext через конструктор (заменено на ObjectProvider.getObject())
  • Global registeredAnnotations map и handleBeforeWorkspaceRemoved в AnnotationReferenceFinder — данные перенесены в AnnotationRepository внутри ReferenceContext
  • Shared ForkJoinPool для всех workspace в BSLLanguageServer.initialized() - теперь каждый workspace имеет свой pool
  • DiagnosticBeanPostProcessor и DiagnosticInfosConfiguration (заменены на factory pattern)
  • Singleton LanguageServerConfiguration references в большинстве классов (заменены на per-workspace references)

Управление экземплярами ServerContext

ServerContext теперь имеет @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE), что позволяет Spring создавать новые экземпляры для каждого workspace. ServerContextProvider использует ObjectProvider<ServerContext> для получения настроенных экземпляров от Spring container, обеспечивая правильную инициализацию всех зависимостей и управление жизненным циклом.

Критическое исправление: ServerContext теперь передается как явный параметр конструктора в DocumentContext, вместо использования @Autowired field injection. Это решает проблему с prototype scope, когда Spring пытался инжектировать новый экземпляр при каждом обращении, вместо использования workspace-specific контекста.

Per-Workspace Configuration

Архитектура конфигурации:

  • GlobalLanguageServerConfiguration - глобальная конфигурация сервера, singleton bean
  • LanguageServerConfiguration - workspace-specific конфигурация, создается для каждого workspace
  • LanguageServerConfigurationFactory - фабрика для создания workspace-specific конфигураций
  • Каждый workspace имеет свой .bsl-language-server.json файл или наследует глобальную конфигурацию
  • ConfigurationFileSystemWatcher отслеживает изменения конфигурационных файлов в каждом workspace независимо
  • При изменении конфигурации workspace публикуется LanguageServerConfigurationChangedEvent
  • При изменении глобальной конфигурации публикуется GlobalLanguageServerConfigurationChangedEvent

Workspace Events System

Event-Driven Architecture:

  • EventPublisherAspect - AOP аспект автоматически публикует события через Spring ApplicationEventPublisher
  • Events публикуются для ключевых операций workspace lifecycle:
    • WorkspaceAddedEvent - после добавления workspace
    • BeforeWorkspaceRemovedEvent - перед удалением workspace (для cleanup)
    • WorkspaceRemovedEvent - после удаления workspace
    • ServerContextDocumentAddedEvent - при добавлении документа
    • GlobalLanguageServerConfigurationChangedEvent - изменение глобальной конфигурации
    • LanguageServerConfigurationChangedEvent - изменение workspace конфигурации
  • События позволяют компонентам реагировать на изменения workspace без tight coupling

NullAway Compatibility

Добавлены @SuppressWarnings("NullAway.Init") аннотации на все поля DocumentContext с @Autowired setter injection для подавления false-positive warnings от NullAway статического анализатора.

Workspace Isolation

Полная изоляция per-workspace:

  • Каждый workspace имеет свою изолированную коллекцию документов
  • Каждый workspace имеет свою конфигурацию (LanguageServerConfiguration)
  • Каждый workspace имеет свою коллекцию метаданных (CF)
  • AnnotationReferenceFinder — данные аннотаций хранятся в AnnotationRepository внутри ReferenceContext (компонент ServerContext), автоматическая очистка при уничтожении workspace
  • Каждый workspace имеет свой ConfigurationFileSystemWatcher для отслеживания .bsl-language-server.json
  • AbstractComplexityInlayHintSupplier — очистка enabledMethods при закрытии документа
  • Удаление аннотаций при изменении/удалении документа корректно обрабатывается через AnnotationRepository.removeByUri()

Thread isolation per workspace:

  • Каждый workspace в BSLLanguageServer.initialized() получает свой ForkJoinPool
  • Имена потоков уникальны: populate-context-{serverContext.hashCode()}-
  • Каждый pool автоматически завершается после populateContext для своего workspace

API Changes

ServerContextProvider.getDocument() возвращает Optional<DocumentContext>:

  • Чище API, соответствует ServerContext.getDocument() который возвращает Optional
  • Все вызывающие места обновлены для использования Optional API
  • Удалены @Nullable аннотации

BSLTextDocumentService.getContextForDocument() возвращает @Nullable:

  • Более идиоматичный подход - не бросает исключения
  • Все 5 вызывающих мест обновлены с null-проверками и логированием
  • Graceful degradation вместо падения с exception

Удалены методы, нарушающие инкапсуляцию:

  • hasWorkspaces() - использовался только в тестах
  • isDocumentOpened(DocumentContext) - вызывающий код должен получить ServerContext и проверить сам

Configuration API:

  • Введено разделение между глобальной (GlobalLanguageServerConfiguration) и workspace-specific (LanguageServerConfiguration) конфигурацией
  • Все компоненты теперь получают конфигурацию через documentContext.getServerContext().getConfiguration()
  • Удалены singleton injections LanguageServerConfiguration из большинства классов

Обратная совместимость

Добавлена поддержка старых LSP клиентов в BSLLanguageServer.setConfigurationRoot():

  1. Если workspaceFolders не передан или пуст, проверяется rootUri (LSP 3.0+)
  2. Если rootUri также пуст, используется rootPath (LSP 2.0)
  3. Из полученного пути создается один workspace folder с именем "root"

Поддержка всех URI схем

Убран фильтр по схеме file и Path-based comparison - теперь ServerContextProvider корректно обрабатывает документы с любыми схемами URI:

  • file: - обычные файлы
  • untitled: - новые несохраненные документы в VSCode
  • Любые другие схемы, поддерживаемые LSP клиентами

Optimized URI-based matching:

  • getServerContext() принимает уже нормализованный URI (через Absolute.uri() на вызывающей стороне)
  • Избегает redundant вызовов Absolute.uri() на уже нормализованные URI
  • Прямое сравнение строковых представлений URI для поиска workspace

Улучшенная обработка событий

Event-driven architecture:

  • EventPublisherAspect автоматически публикует workspace lifecycle events
  • AnnotationReferenceFinder.handleContextRefresh() получает конкретный ServerContext из события
  • Очищает и заново регистрирует аннотации только для этого workspace через AnnotationRepository
  • Полная изоляция между workspace — аннотации одного workspace не влияют на другой
  • Компоненты могут подписываться на события для реакции на изменения workspace и конфигурации

Features

✅ 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

Документация

  • Весь JavaDoc в новых классах написан на русском языке в соответствии со стандартами проекта.
  • Обновлена таблица поддерживаемых операций протокола: didChangeWorkspaceFolders отмечен как поддерживаемый (RU/EN).
  • В список возможностей сервера добавлены: семантическая подсветка синтаксиса, inlay hints, поддержка нескольких рабочих областей (RU/EN).
  • Переписана страница конфигурационного файла: описана двухуровневая система конфигурации (глобальная/локальная), стратегии поиска файла, отслеживание изменений (RU/EN).
  • В раздел CLI добавлено описание поведения ключа -c и автоматического поиска конфигурационного файла (RU/EN).
Original prompt

Поддержка нескольких workspace в lsp.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 14, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • 🔍 Trigger a full review

Comment @coderabbitai help to get the list of available commands and usage tips.

Copilot AI and others added 5 commits December 14, 2025 09:37
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>
Copilot AI changed the title [WIP] Add support for multiple workspaces in LSP Поддержка нескольких workspace в LSP Dec 14, 2025
Copilot AI requested a review from nixel2007 December 14, 2025 10:17
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>
- 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
@nixel2007
Copy link
Member

/buildJar

@nixel2007 nixel2007 marked this pull request as ready for review February 9, 2026 07:37
Copilot AI review requested due to automatic review settings February 9, 2026 07:37
@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

✅ Собраны JAR-файлы для этого PR по команде /buildJar.

Артефакт: 5428374501

Файлы внутри:

  • bsl-language-server-copilot-support-multiple-workspaces-a88d7f4-exec.jar

…known file

Verify that each method gracefully returns empty/null result
when called with a URI not registered in any workspace.
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines 65 to 74
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()
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

registeredAnnotations хранит ключи ServerContext и никогда не очищается при удалении workspace. При remove/re-add воркспейсов это оставит «осиротевшие» записи и может привести к росту памяти и кэшам со старыми аннотациями. Добавьте обработчик BeforeWorkspaceRemovedEvent/WorkspaceRemovedEvent (или вызов из ServerContextProvider.clear/removeWorkspace) чтобы удалять запись для соответствующего ServerContext/workspaceUri.

Copilot uses AI. Check for mistakes.
Comment on lines +46 to 47
private final DiagnosticInfosFactory diagnosticInfosFactory;
private final DiagnosticObjectProvider diagnosticObjectProvider;
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поле diagnosticInfosFactory внедряется, но дальше в классе не используется. Лишняя зависимость усложняет граф бинов и вводит в заблуждение (сейчас данные берутся из serverContext). Удалите поле/конструкторный параметр или используйте фабрику по назначению.

Copilot uses AI. Check for mistakes.
Comment on lines 58 to 63
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;
}
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поле resources сохраняется в классе, но нигде не используется (все вызовы идут через статический Resources.getResourceString(...)). Это лишняя зависимость/шум. Уберите поле и конструкторный параметр либо используйте resources для получения строк (без static).

Copilot uses AI. Check for mistakes.
Comment on lines 483 to 485
private String getMessage(String key) {
return Resources.getResourceString(languageServerConfiguration.getLanguage(), getClass(), key);
return Resources.getResourceString(globalConfiguration.getLanguage(), getClass(), key);
}
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ServerContext.getMessage() берёт язык из GlobalLanguageServerConfiguration, игнорируя per-workspace languageServerConfiguration. В multi-workspace режиме это приведёт к сообщениям/прогрессу на неправильном языке, если workspace переопределяет language. Используйте languageServerConfiguration.getLanguage() (с fallback на global только если per-workspace конфигурация ещё не установлена).

Copilot uses AI. Check for mistakes.
Comment on lines 108 to 121
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;
}
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В call() дважды проверяется files.isEmpty() (вторая проверка после создания workspace никогда не изменит результат). Уберите дубликат, чтобы не запутывать контроль потока.

Copilot uses AI. Check for mistakes.
void testDidChangeWorkspaceFolders_AddWorkspace() throws IOException {
// given
var newWorkspaceDir = tempDir.resolve("new-workspace").toFile();
newWorkspaceDir.mkdir();
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Method testDidChangeWorkspaceFolders_AddWorkspace ignores exceptional return value of File.mkdir.

Copilot uses AI. Check for mistakes.
void testDidChangeWorkspaceFolders_AddAndRemove() throws IOException {
// given
var newWorkspaceDir = tempDir.resolve("new-workspace-2").toFile();
newWorkspaceDir.mkdir();
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Method testDidChangeWorkspaceFolders_AddAndRemove ignores exceptional return value of File.mkdir.

Copilot uses AI. Check for mistakes.
/**
* Вспомогательный класс для десериализации конфигурации из JSON.
*/
@Data
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Default toString(): SemanticTokensOptions inherits toString() from Object, and so is not suitable for printing.

Copilot uses AI. Check for mistakes.
ENTRY_DELETE,
ENTRY_MODIFY
},
SensitivityWatchEventModifier.HIGH
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Access to unsupported JDK-internal API 'com.sun.nio.file.SensitivityWatchEventModifier'.

Copilot uses AI. Check for mistakes.
nixel2007 and others added 16 commits February 9, 2026 09:25
- 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>
@sonarqubecloud
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
B Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants