fix(types): объявленные типы пересобираются после наполнения области - #4445
Conversation
Имя типа в описании метода разрешается в момент разбора его документа, а до части модулей области очередь тогда ещё не дошла: такое имя никуда не ведёт, и объявленный тип выходит беднее написанного. Кому не повезло — решает порядок обхода файлов, то есть результат анализа от него и зависит. Теперь по наполнению области объявленные типы пересобираются целиком. Разбор документов для этого не нужен: они читаются по дереву символов, которое переживает освобождение вторичных данных. Порядок слушателя — раньше MethodReturnTypeIndexer: расчёт по телу читает объявленные типы вызванных методов. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017cu7S3zYn7n6GMsdYf5v1q
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthrough
ChangesDeclared return-type indexing
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|



Проблема
Имя типа в описании метода (
// Возвращаемое значение: см. Модуль.Метод, имя типа конфигурации) разрешается в момент разбора его документа. Пока рабочая область наполняется, до части модулей очередь ещё не дошла — такое имя никуда не ведёт, и объявленный тип выходит беднее написанного.Кому не повезло, решает порядок обхода файлов. То есть это прямая причина того, что результат анализа зависит от порядка: один и тот же код при повторном запуске даёт другой набор замечаний.
Что сделано
По событию наполнения рабочей области объявленные типы пересобираются целиком — теперь все имена разрешаются при одинаковом состоянии реестра.
Разбор документов для этого не нужен: объявленные типы читаются по дереву символов, которое переживает освобождение вторичных данных. Слушатель идёт раньше
MethodReturnTypeIndexer(@Order(100)): расчёт типов по телу читает объявленные типы вызванных методов, поэтому пересобрать их надо до него.Замеры на ssl_3_1
Пакетный анализ, репортер SARIF,
mode: onlyсUnknownMember+EventHandlerInvalidSignature. Метрика — расхождение отсортированной подписи замечаний между прогонами одной и той же сборки на одной и той же кодовой базе; в идеале ноль.Прогоны вперемежку, по три на сборку:
Отдельная серия по четыре прогона на сборку, там же считалось устойчивое ядро (замечания, встретившиеся во всех четырёх):
Мерцание втрое меньше, расхождения — вчетверо. Направление воспроизвелось в обеих сериях.
Замечаний становится больше (30200 → 30600): объявленные типы теперь разрешаются полнее, и диагностика судит там, где раньше молчала из-за невыведенного типа. Полнота выводимых наборов полей — отдельная задача, здесь она не решается.
По времени вывода нет: на моей машине результаты противоречивы (в одной серии разницы нет, в другой ветка на 9–23 секунды медленнее из ~75), а машина шумит — прогоны одной сборки давали от 35 до 98 секунд. Ориентируюсь на бенчмарк CI.
Тесты
SymbolTypeIndexDeclaredTypesTest: документ разобран, когда имя типа реестру ещё неизвестно; после наполнения области объявленный тип пересобран по нынешнему состоянию реестра. Отдельно закреплено, что перечитывание того же текста объявленные типы не роняет.Связанные задачи
Часть работы по #4429.
Summary by CodeRabbit