Fix NoSuchElementException in MissingCommonModuleMethodDiagnostic#3636
Fix NoSuchElementException in MissingCommonModuleMethodDiagnostic#3636
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the You can disable this status message by setting the Comment |
Changed getMethodNameByLocation to return Optional<String> instead of throwing when terminal node at position is not found. Updated caller to handle empty Optional gracefully. Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
|
@copilot в какой момент может произойти рассинхронизация? Проведи детальный анализ многопоточного взаимодействия с учётом блокировок |
Анализ многопоточного взаимодействия: Рассинхронизация между 1. Race condition при обновлении документа (наиболее вероятный сценарий) 2. Архитектурная особенность:
3. Блокировки в DocumentContext:
Вывод:
|
|
@copilot ситуация рассинхронизации на ast частая. Попадает ли reference index filler с эвента под computeLock, стоящий вокруг rebuild? Ну и DiagnosticsComputer закрыт diagnostic compute lock'ом |
Проанализировал детальнее: ReferenceIndexFiller и computeLock:
Проблема в другом:
Сценарий:
|
|
@copilot тот момент, когда начнёт выполняться второй ребилд, будет висеть computeLock, diagnostics не смогут запросить старый ast |
Согласен — Однако ошибка реально происходит (Sentry). Возможные сценарии:
Независимо от причины, |
Описание
NoSuchElementExceptionвозникала вgetMethodNameByLocation()при вызовеorElseThrow()когдаfindTerminalNodeContainsPosition()возвращал пустой Optional (при рассинхронизации индекса ссылок и AST).Изменения:
getMethodNameByLocation()теперь возвращаетOptional<String>вместо выброса исключенияgetReferenceToMethodCall()используетflatMapдля корректной обработки пустого результатаСвязанные задачи
Closes https://1c-syntax.sentry.io/issues/7081340854/
Чеклист
Общие
gradlew precommit)Для диагностик
Дополнительно
Все 963 теста проходят успешно. CodeQL проверка не выявила проблем безопасности.
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.