Skip to content

feat(types): общий модуль, полученный по имени, выводится в свой тип - #4438

Merged
nixel2007 merged 2 commits into
developfrom
feat/common-module-by-name
Aug 10, 2026
Merged

feat(types): общий модуль, полученный по имени, выводится в свой тип#4438
nixel2007 merged 2 commits into
developfrom
feat/common-module-by-name

Conversation

@nixel2007

@nixel2007 nixel2007 commented Aug 10, 2026

Copy link
Copy Markdown
Member

Проблема

У получателя вида ОбщегоНазначения.ОбщийМодуль("ИмяМодуля") объявленный тип возврата обобщённый — ОбщийМодуль, а у части вариантов ещё и МодульМенеджераОбъекта. То есть «какой-то модуль», без единого прикладного члена. Имя при этом стоит строковым литералом, то есть известно статически.

Индекс ссылок это давно понимает: utils/ModuleReference разбирает ОбщийМодуль("Имя").Метод(…) по настраиваемому списку references.commonModuleAccessors, поэтому F12 ведёт в конкретный модуль. А система типов про такой вызов не знала вовсе — в пакете types/ не было ни одной ссылки на ModuleReference. Любое обращение через такой получатель упиралось в тип «общий модуль вообще» и давало UnknownMember.

На ssl_3_1 таких замечаний 4961 из 35 337 — 14 % всех:

3846  У типа "ОбщийМодуль, МодульМенеджераОбъекта" нет метода или свойства …
1065  У типа "ОбщийМодуль" нет метода или свойства …

Что сделано

Тип берётся у названного модуля. Знание о конструкции 1С вынесено в отдельный компонент CommonModuleByNameInference, инференсер остаётся диспетчером по узлам выражения (как требует types/CLAUDE.md):

  • вызов без получателя (ОбщийМодуль("Х") внутри самой БСП) уточняется в inferMethodCall — до общего резолва метода, иначе выиграл бы обобщённый возврат;
  • вызов у получателя (ОбщегоНазначения.ОбщийМодуль("Х")) — в refinedCallTypes, куда приходит тип получателя.

Образцы вызовов-получателей берутся из той же настройки references.commonModuleAccessors, что и у индекса ссылок, — значит поведение F12 и вывода типов настраивается одним списком и не разъезжается.

Замеры на ssl_3_1

всего замечаний из них с получателем ОбщийМодуль
develop 35 337 4961
ветка 31 585 1067

Убрано 4054, добавилось 302. Добавленные — не регресс правил, а следствие того, что цепочки теперь доходят дальше и упираются в следующий пробел: в основном непараметризованные менеджеры (ПланОбменаМенеджер.НайтиПоКоду — платформа объявляет метод у ПланОбменаМенеджер.<Имя>, а не у голого) и поля структур. Время прогона не изменилось: 63 с против 62 с.

Оставшиеся 1067 — те случаи, где имя модуля не литерал либо модуль вне рабочей области; там сузить тип нечем.

Тесты

В CommonModuleCallInferenceTest добавлены две проверки на тестовой конфигурации: тип выражения ОбщегоНазначения.ОбщийМодуль("ПервыйОбщийМодуль") — это ПервыйОбщийМодуль, и обращение к методу такого модуля разрешается в метод именно этого модуля. Обе до правки красные (тип выходил ["ОбщийМодуль", "Неопределено"]).

Summary by CodeRabbit

  • New Features

    • Improved recognition of common modules referenced by name in code.
    • Provides more accurate type information and member completion for these module calls.
    • Supports configured common-module accessors and validates referenced module methods.
    • Resolves module references from literal names in both local and member calls.
  • Bug Fixes

    • Corrected type inference for literal-name common-module access calls.
    • Prevented unresolved or invalid module references from producing incorrect type information.

У получателя вида ОбщегоНазначения.ОбщийМодуль("ИмяМодуля") объявленный возврат
обобщённый — ОбщийМодуль, а у части вариантов ещё и МодульМенеджераОбъекта, — то есть
«какой-то модуль», без единого прикладного члена. Имя при этом названо строковым
литералом, то есть известно статически. Индекс ссылок это давно понимает (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>
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c32fb655-3380-474d-9fe5-9b78f365312e

📥 Commits

Reviewing files that changed from the base of the PR and between c264e74 and c0ee965.

📒 Files selected for processing (1)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md

📝 Walkthrough

Walkthrough

Adds 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.

Changes

Common module inference

Layer / File(s) Summary
Common module resolution
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/CommonModuleByNameInference.java
Matches configured accessors, validates calls and string-literal names, and resolves modules through TypeRegistry.
Expression inference integration
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/ExpressionTypeInferencer.java
Runs common-module resolution before existing method-call fallbacks.
Inference validation and documentation
src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md
Tests module and member resolution and documents CommonModuleByNameInference.

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
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Заголовок точно описывает основное изменение: вывод типа общего модуля, полученного по имени.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/common-module-by-name

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4681f74 and c264e74.

⛔ Files ignored due to path filters (1)
  • src/test/resources/types/CommonModuleByName.bsl is excluded by !src/test/resources/**
📒 Files selected for processing (4)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/CommonModuleByNameInference.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/ExpressionTypeInferencer.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java

Comment thread src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md Outdated
По замечанию в ревью: было сказано только про вызов у получателя, тогда как компонент
уточняет и локальный `ОбщийМодуль("Х")` внутри самой БСП. Заодно сказано, что в настройке
`references.commonModuleAccessors` лежат оба вида образцов — голые имена методов и пары
`Модуль.Метод`, — и в каком месте инференсера уточняется каждая форма.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@nixel2007

Copy link
Copy Markdown
Member Author

Поправил: в описании компонента названы обе формы вызова — и ОбщегоНазначения.ОбщийМодуль("Х"), и локальный ОбщийМодуль("Х") внутри самой БСП, — плюс сказано, что в references.commonModuleAccessors лежат образцы обоих видов (голые имена методов и пары Модуль.Метод) и в каком месте инференсера уточняется каждая форма.

@nixel2007
nixel2007 merged commit 6c319a1 into develop Aug 10, 2026
35 checks passed
@nixel2007
nixel2007 deleted the feat/common-module-by-name branch August 10, 2026 16:02
@sonarqubecloud

Copy link
Copy Markdown

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Autofix skipped. No unresolved CodeRabbit review comments with fix instructions found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant