fix(types): тип элемента коллекции доезжает до возвращаемого значения метода - #4379
Conversation
… метода Обход результата вызова — «Для Каждого Строка Из НоваяТаблица() Цикл» — не знал типа элемента: элементы-по-умолчанию из реестра прикреплялись у потребителей объявленного типа поодиночке, и путь через возврат метода остался непокрытым. Прикрепление перенесено в разбор объявления: там, где объявленный тип рождается, один раз для переменной, параметра и возвращаемого значения. Коллекционная запись исключена — в ней элементы перечислил автор.
|
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
ChangesElement Type Inference
Estimated code review effort: 3 (Moderate) | ~15–30 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 |
|



Симптом
Обход результата вызова не знал типа элемента коллекции, хотя обход переменной с тем же значением знал:
Разбор показал, что дело не в конкретном типе и не в способе его записи: то же самое было и у соответствия, и когда тип возврата записан именем, и когда он задан ссылкой
См..Причина
ExpressionTypeInferencer#elementTypesOfCollectionберёт у типа коллекцииgetElementTypes(). Тип элемента реестр знает сам (TypeRegistry#getDefaultElementTypes:КлючИЗначениеу соответствия, строка у табличной части), но в набор он попадает только явным прикреплениемattachDefaultElementTypes.Прикрепление стояло у потребителей объявленного типа поодиночке — у конструктора, у вызова члена, у переменной, — и путь «объявленный тип возврата метода» остался непокрытым. Это четвёртый дефект этого вида, и причина у всех одна: о прикреплении должен помнить каждый новый потребитель.
Исправление
Прикрепление перенесено туда, где объявленный тип рождается, — в разбор описания (
SymbolTypeIndex#resolveTypes). Оттуда тип уходит и в переменную, и в параметр, и в возвращаемое значение, поэтому обход коллекции видит элемент везде одинаково, а новым потребителям помнить об этом уже не нужно.Две границы:
Массив из Строка,Массив из См. Метод) исключена — в ней элементы перечислил автор, и подставлять вместо неразрешившейся ссылки умолчание реестра нельзя (это ломало быNestedSeeRefInferenceTest);Более широкая централизация — прикрепление на общем стыке вывода выражений (
ExpressionTypeInferencer#inferInternal) — проверена и отклонена: она меняет поведение индексного доступа (Элементы["НетТакого"]начинает отдавать все виды элементов формы вместо пустоты,FormModuleInferenceTest#unknownItemNameLeavesTheGeneralPath).Проверки
Новый
CallResultElementTypeInferenceTest: обход результата вызова даёт колонки строки табличной части иКлючИЗначениеу соответствия. Оба теста красные до правки.Прогоны без правок ожиданий:
*types.*,*hover.*,*Completion*(1900 тестов) и*providers.*,*diagnostics.*— зелёные.Summary by CodeRabbit