Проблема
В MCP-режиме suppress-комментарий // BSLLS:<Diagnostic>-off / -on подавляет диагностику только если он присутствует в файле уже на самом ПЕРВОМ вызове analyze_file для этого файла в рамках жизни процесса сервера. Если файл сначала был проанализирован без комментария, а затем комментарий добавлен, и analyze_file вызван повторно (без перезапуска сервера) — диагностика продолжает срабатывать, как будто suppress-комментария нет.
Сама диагностика при этом пересчитывается корректно (её появление/исчезновение по правкам кода отслеживается верно) — не работает только карта игнорирования (DiagnosticIgnorance/аналог), похоже, она кэшируется на первом анализе файла в процессе и не инвалидируется при последующих вызовах analyze_file для того же файла.
Окружение
- BSL Language Server: воспроизведено на
1.0.7 (stdio и streamable) и 1.1.0-rc.4 (streamable)
- Транспорт: и
stdio, и streamable (--protocol streamable --server.port=8080) — не влияет
- Клиент: Claude Code, инструмент
analyze_file
Воспроизведение (подтверждено дважды, включая контрольный эксперимент)
Сценарий А — диагностика уже анализировалась без suppress:
- Открыть файл, вызвать
analyze_file — 0 диагностик.
- Добавить конструкцию
Если...ИначеЕсли...КонецЕсли без Иначе. Вызвать analyze_file — диагностика IfElseIfEndsWithElse появляется (ожидаемо).
- Обернуть конструкцию в
// BSLLS:IfElseIfEndsWithElse-off / -on. Вызвать analyze_file ещё раз (тот же процесс) — диагностика всё ещё присутствует.
Сценарий Б — контрольный эксперимент, suppress с самого начала:
- Взять файл, который этот процесс сервера ещё ни разу не анализировал.
- Сразу добавить в него ту же конструкцию, уже обёрнутую в
// BSLLS:IfElseIfEndsWithElse-off / -on.
- Впервые вызвать
analyze_file для этого файла — диагностика IfElseIfEndsWithElse отсутствует (суппресс сработал корректно).
Разница между А и Б — только порядок: было ли у сервера уже закэшировано состояние анализа файла ДО появления suppress-комментария.
Наблюдение
Похоже на смежную, но самостоятельную проблему по отношению к #4463 / #4464 (там теряется регистрация workspace при пересоздании клиентом stdio-процесса). Здесь сам процесс не пересоздаётся и остаётся живым в течение всего эксперимента — переход на streamable-транспорт (обходной путь из #4464) эту проблему не решает, она не связана с транспортом или жизненным циклом клиента.
Ожидаемое поведение
Suppress-комментарий должен подавлять диагностику при следующем вызове analyze_file после его добавления в файл, независимо от того, анализировался ли этот файл ранее в рамках текущего процесса.
Вопросы
- Кэшируется ли карта игнорирования диагностик на уровне документа/файла между вызовами
analyze_file, и не инвалидируется ли этот кэш при повторном анализе изменённого файла?
- Если да — можно ли добавить принудительную инвалидацию (например, по изменению содержимого/хэша файла), не дожидаясь полной переиндексации workspace?
Проблема
В MCP-режиме suppress-комментарий
// BSLLS:<Diagnostic>-off/-onподавляет диагностику только если он присутствует в файле уже на самом ПЕРВОМ вызовеanalyze_fileдля этого файла в рамках жизни процесса сервера. Если файл сначала был проанализирован без комментария, а затем комментарий добавлен, иanalyze_fileвызван повторно (без перезапуска сервера) — диагностика продолжает срабатывать, как будто suppress-комментария нет.Сама диагностика при этом пересчитывается корректно (её появление/исчезновение по правкам кода отслеживается верно) — не работает только карта игнорирования (DiagnosticIgnorance/аналог), похоже, она кэшируется на первом анализе файла в процессе и не инвалидируется при последующих вызовах
analyze_fileдля того же файла.Окружение
1.0.7(stdio и streamable) и1.1.0-rc.4(streamable)stdio, иstreamable(--protocol streamable --server.port=8080) — не влияетanalyze_fileВоспроизведение (подтверждено дважды, включая контрольный эксперимент)
Сценарий А — диагностика уже анализировалась без suppress:
analyze_file— 0 диагностик.Если...ИначеЕсли...КонецЕслибезИначе. Вызватьanalyze_file— диагностикаIfElseIfEndsWithElseпоявляется (ожидаемо).// BSLLS:IfElseIfEndsWithElse-off/-on. Вызватьanalyze_fileещё раз (тот же процесс) — диагностика всё ещё присутствует.Сценарий Б — контрольный эксперимент, suppress с самого начала:
// BSLLS:IfElseIfEndsWithElse-off/-on.analyze_fileдля этого файла — диагностикаIfElseIfEndsWithElseотсутствует (суппресс сработал корректно).Разница между А и Б — только порядок: было ли у сервера уже закэшировано состояние анализа файла ДО появления suppress-комментария.
Наблюдение
Похоже на смежную, но самостоятельную проблему по отношению к #4463 / #4464 (там теряется регистрация workspace при пересоздании клиентом stdio-процесса). Здесь сам процесс не пересоздаётся и остаётся живым в течение всего эксперимента — переход на
streamable-транспорт (обходной путь из #4464) эту проблему не решает, она не связана с транспортом или жизненным циклом клиента.Ожидаемое поведение
Suppress-комментарий должен подавлять диагностику при следующем вызове
analyze_fileпосле его добавления в файл, независимо от того, анализировался ли этот файл ранее в рамках текущего процесса.Вопросы
analyze_file, и не инвалидируется ли этот кэш при повторном анализе изменённого файла?