feat(types): общий модуль, полученный по имени, выводится в свой тип - #4438
Conversation
У получателя вида ОбщегоНазначения.ОбщийМодуль("ИмяМодуля") объявленный возврат
обобщённый — ОбщийМодуль, а у части вариантов ещё и МодульМенеджераОбъекта, — то есть
«какой-то модуль», без единого прикладного члена. Имя при этом названо строковым
литералом, то есть известно статически. Индекс ссылок это давно понимает (utils/ModuleReference,
настройка references.commonModuleAccessors) — потому F12 и ведёт в нужный модуль, — а
система типов про такой вызов не знала вовсе: в пакете types на ModuleReference не было
ни одной ссылки.
Из-за этого любое обращение через такой получатель упиралось в тип «общий модуль вообще»
и давало UnknownMember. На ssl_3_1 таких замечаний 4961 из 35 337 — 14 % всех.
Теперь тип берётся у названного модуля. Знание о конструкции лежит в отдельном компоненте
CommonModuleByNameInference, инференсер остаётся диспетчером по узлам: вызов без получателя
уточняется в inferMethodCall, вызов у получателя — в refinedCallTypes.
На ssl_3_1: 35 337 → 31 585 замечаний, убрано 4054, добавилось 302 — это цепочки, которые
раньше обрывались на обобщённом модуле, а теперь доходят до следующего пробела (в основном
непараметризованные менеджеры вроде ПланОбменаМенеджер и поля структур). Время не изменилось.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
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 (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughAdds configured name-based common module type inference. The resolver handles receiver and local calls, validates string-literal module names, integrates before existing fallbacks, and includes tests and documentation. ChangesCommon module inference
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant ExpressionTypeInferencer
participant CommonModuleByNameInference
participant TypeRegistry
ExpressionTypeInferencer->>CommonModuleByNameInference: inspect configured common-module call
CommonModuleByNameInference->>TypeRegistry: resolve string-literal module name
TypeRegistry-->>ExpressionTypeInferencer: return resolved module TypeSet
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 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 |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md`:
- Around line 100-104: Update the CommonModuleByNameInference documentation in
CLAUDE.md to include the receiver-free local BСП call form ОбщийМодуль("Х").
State that references.commonModuleAccessors accepts both local accessor names
and qualified module-method pairs, while preserving the existing receiver-based
example and guidance.
🪄 Autofix
❌ Autofix failed (check again to retry)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 15c05102-5c34-4c05-9cda-f90990258db2
⛔ Files ignored due to path filters (1)
src/test/resources/types/CommonModuleByName.bslis excluded by!src/test/resources/**
📒 Files selected for processing (4)
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.mdsrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/CommonModuleByNameInference.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/ExpressionTypeInferencer.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java
По замечанию в ревью: было сказано только про вызов у получателя, тогда как компонент
уточняет и локальный `ОбщийМодуль("Х")` внутри самой БСП. Заодно сказано, что в настройке
`references.commonModuleAccessors` лежат оба вида образцов — голые имена методов и пары
`Модуль.Метод`, — и в каком месте инференсера уточняется каждая форма.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Поправил: в описании компонента названы обе формы вызова — и |
|
|
Autofix skipped. No unresolved CodeRabbit review comments with fix instructions found. |



Проблема
У получателя вида
ОбщегоНазначения.ОбщийМодуль("ИмяМодуля")объявленный тип возврата обобщённый —ОбщийМодуль, а у части вариантов ещё иМодульМенеджераОбъекта. То есть «какой-то модуль», без единого прикладного члена. Имя при этом стоит строковым литералом, то есть известно статически.Индекс ссылок это давно понимает:
utils/ModuleReferenceразбираетОбщийМодуль("Имя").Метод(…)по настраиваемому спискуreferences.commonModuleAccessors, поэтому F12 ведёт в конкретный модуль. А система типов про такой вызов не знала вовсе — в пакетеtypes/не было ни одной ссылки наModuleReference. Любое обращение через такой получатель упиралось в тип «общий модуль вообще» и давалоUnknownMember.На ssl_3_1 таких замечаний 4961 из 35 337 — 14 % всех:
Что сделано
Тип берётся у названного модуля. Знание о конструкции 1С вынесено в отдельный компонент
CommonModuleByNameInference, инференсер остаётся диспетчером по узлам выражения (как требуетtypes/CLAUDE.md):ОбщийМодуль("Х")внутри самой БСП) уточняется вinferMethodCall— до общего резолва метода, иначе выиграл бы обобщённый возврат;ОбщегоНазначения.ОбщийМодуль("Х")) — вrefinedCallTypes, куда приходит тип получателя.Образцы вызовов-получателей берутся из той же настройки
references.commonModuleAccessors, что и у индекса ссылок, — значит поведение F12 и вывода типов настраивается одним списком и не разъезжается.Замеры на ssl_3_1
ОбщийМодульУбрано 4054, добавилось 302. Добавленные — не регресс правил, а следствие того, что цепочки теперь доходят дальше и упираются в следующий пробел: в основном непараметризованные менеджеры (
ПланОбменаМенеджер.НайтиПоКоду— платформа объявляет метод уПланОбменаМенеджер.<Имя>, а не у голого) и поля структур. Время прогона не изменилось: 63 с против 62 с.Оставшиеся 1067 — те случаи, где имя модуля не литерал либо модуль вне рабочей области; там сузить тип нечем.
Тесты
В
CommonModuleCallInferenceTestдобавлены две проверки на тестовой конфигурации: тип выраженияОбщегоНазначения.ОбщийМодуль("ПервыйОбщийМодуль")— этоПервыйОбщийМодуль, и обращение к методу такого модуля разрешается в метод именно этого модуля. Обе до правки красные (тип выходил["ОбщийМодуль", "Неопределено"]).Summary by CodeRabbit
New Features
Bug Fixes