Skip to content

MCP: analyze_file не подхватывает suppress-комментарий (// BSLLS:<Diagnostic>-off/-on), добавленный после первого анализа файла в рамках сессии сервера #4509

Description

@VVi3ard

Проблема

В 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:

  1. Открыть файл, вызвать analyze_file — 0 диагностик.
  2. Добавить конструкцию Если...ИначеЕсли...КонецЕсли без Иначе. Вызвать analyze_file — диагностика IfElseIfEndsWithElse появляется (ожидаемо).
  3. Обернуть конструкцию в // BSLLS:IfElseIfEndsWithElse-off / -on. Вызвать analyze_file ещё раз (тот же процесс) — диагностика всё ещё присутствует.

Сценарий Б — контрольный эксперимент, suppress с самого начала:

  1. Взять файл, который этот процесс сервера ещё ни разу не анализировал.
  2. Сразу добавить в него ту же конструкцию, уже обёрнутую в // BSLLS:IfElseIfEndsWithElse-off / -on.
  3. Впервые вызвать analyze_file для этого файла — диагностика IfElseIfEndsWithElse отсутствует (суппресс сработал корректно).

Разница между А и Б — только порядок: было ли у сервера уже закэшировано состояние анализа файла ДО появления suppress-комментария.

Наблюдение

Похоже на смежную, но самостоятельную проблему по отношению к #4463 / #4464 (там теряется регистрация workspace при пересоздании клиентом stdio-процесса). Здесь сам процесс не пересоздаётся и остаётся живым в течение всего эксперимента — переход на streamable-транспорт (обходной путь из #4464) эту проблему не решает, она не связана с транспортом или жизненным циклом клиента.

Ожидаемое поведение

Suppress-комментарий должен подавлять диагностику при следующем вызове analyze_file после его добавления в файл, независимо от того, анализировался ли этот файл ранее в рамках текущего процесса.

Вопросы

  1. Кэшируется ли карта игнорирования диагностик на уровне документа/файла между вызовами analyze_file, и не инвалидируется ли этот кэш при повторном анализе изменённого файла?
  2. Если да — можно ли добавить принудительную инвалидацию (например, по изменению содержимого/хэша файла), не дожидаясь полной переиндексации workspace?

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions