Skip to content

fix(types): тип элемента коллекции доезжает до возвращаемого значения метода - #4379

Merged
nixel2007 merged 1 commit into
developfrom
fix/types-element-types-of-call
Aug 2, 2026
Merged

fix(types): тип элемента коллекции доезжает до возвращаемого значения метода#4379
nixel2007 merged 1 commit into
developfrom
fix/types-element-types-of-call

Conversation

@nixel2007

@nixel2007 nixel2007 commented Aug 2, 2026

Copy link
Copy Markdown
Member

Симптом

Обход результата вызова не знал типа элемента коллекции, хотя обход переменной с тем же значением знал:

// Возвращаемое значение:
//  СправочникТабличнаяЧасть.Справочник1.ТабличнаяЧасть1 -
Функция ЧастьТовары()
	Возврат Неопределено;
КонецФункции

Процедура Обход()
	// тип колонки не выводился вовсе
	Для Каждого СтрокаЧасти Из ЧастьТовары() Цикл
		КолонкаСтроки = СтрокаЧасти.Реквизит1;
	КонецЦикла;

	// а так — выводился
	Часть = ЧастьТовары();
	Для Каждого СтрокаЧасти Из Часть Цикл
		КолонкаСтроки = СтрокаЧасти.Реквизит1;
	КонецЦикла;
КонецПроцедуры

Разбор показал, что дело не в конкретном типе и не в способе его записи: то же самое было и у соответствия, и когда тип возврата записан именем, и когда он задан ссылкой См..

Причина

ExpressionTypeInferencer#elementTypesOfCollection берёт у типа коллекции getElementTypes(). Тип элемента реестр знает сам (TypeRegistry#getDefaultElementTypes: КлючИЗначение у соответствия, строка у табличной части), но в набор он попадает только явным прикреплением attachDefaultElementTypes.

Прикрепление стояло у потребителей объявленного типа поодиночке — у конструктора, у вызова члена, у переменной, — и путь «объявленный тип возврата метода» остался непокрытым. Это четвёртый дефект этого вида, и причина у всех одна: о прикреплении должен помнить каждый новый потребитель.

Исправление

Прикрепление перенесено туда, где объявленный тип рождается, — в разбор описания (SymbolTypeIndex#resolveTypes). Оттуда тип уходит и в переменную, и в параметр, и в возвращаемое значение, поэтому обход коллекции видит элемент везде одинаково, а новым потребителям помнить об этом уже не нужно.

Две границы:

  • коллекционная запись (Массив из Строка, Массив из См. Метод) исключена — в ней элементы перечислил автор, и подставлять вместо неразрешившейся ссылки умолчание реестра нельзя (это ломало бы NestedSeeRefInferenceTest);
  • наличие уже объявленного элемента проверяется по записи, а не по значению: у ленивой ссылки значение брать в момент индексации рано, она разрешается при чтении.

Более широкая централизация — прикрепление на общем стыке вывода выражений (ExpressionTypeInferencer#inferInternal) — проверена и отклонена: она меняет поведение индексного доступа (Элементы["НетТакого"] начинает отдавать все виды элементов формы вместо пустоты, FormModuleInferenceTest#unknownItemNameLeavesTheGeneralPath).

Проверки

Новый CallResultElementTypeInferenceTest: обход результата вызова даёт колонки строки табличной части и КлючИЗначение у соответствия. Оба теста красные до правки.

Прогоны без правок ожиданий: *types.*, *hover.*, *Completion* (1900 тестов) и *providers.*, *diagnostics.* — зелёные.

Summary by CodeRabbit

  • Bug Fixes
    • Improved type inference for non-collection declarations by applying default element types when no explicit type is provided.
    • Preserved explicitly declared and lazily resolved element types.
    • Improved inferred types when iterating over function results representing tabular sections or correspondences.

… метода

Обход результата вызова — «Для Каждого Строка Из НоваяТаблица() Цикл» — не знал
типа элемента: элементы-по-умолчанию из реестра прикреплялись у потребителей
объявленного типа поодиночке, и путь через возврат метода остался непокрытым.

Прикрепление перенесено в разбор объявления: там, где объявленный тип рождается,
один раз для переменной, параметра и возвращаемого значения. Коллекционная запись
исключена — в ней элементы перечислил автор.
@coderabbitai

coderabbitai Bot commented Aug 2, 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: 8d5e5c07-7e7d-4505-813a-3253f05581b7

📥 Commits

Reviewing files that changed from the base of the PR and between 6d4caf6 and 2ea88b3.

📒 Files selected for processing (2)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/index/SymbolTypeIndex.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CallResultElementTypeInferenceTest.java

📝 Walkthrough

Walkthrough

SymbolTypeIndex.resolveTypes now fills missing element types from TypeRegistry for non-collection declarations. New tests verify inferred types when iterating over tabular-section and correspondence function results.

Changes

Element Type Inference

Layer / File(s) Summary
Default element type resolution and validation
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/index/SymbolTypeIndex.java, src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CallResultElementTypeInferenceTest.java
resolveTypes preserves explicit and lazy element types and attaches registry defaults when no element type exists. Tests verify inferred types for tabular-section and correspondence function results.

Estimated code review effort: 3 (Moderate) | ~15–30 minutes

Possibly related PRs

Suggested reviewers: claude

🚥 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 The title clearly describes the main change: propagating collection element types to method return values.
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/types-element-types-of-call

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.

@nixel2007
nixel2007 enabled auto-merge August 2, 2026 14:29
@sonarqubecloud

sonarqubecloud Bot commented Aug 2, 2026

Copy link
Copy Markdown

@nixel2007
nixel2007 disabled auto-merge August 2, 2026 14:36
@nixel2007
nixel2007 merged commit 7bb1457 into develop Aug 2, 2026
39 checks passed
@nixel2007
nixel2007 deleted the fix/types-element-types-of-call branch August 2, 2026 14:36
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