Repository navigation
fix(hir-ty): вызов на менеджере значения константы разрешается в экспорт её ValueManagerModule - #426
Merged
Conversation
…ValueManagerModule `Константы.<Имя>.СоздатьМенеджерЗначения()` returned the bare platform phantom `КонстантаМенеджерЗначения`, which names no constant: the user-call cascade knew nothing to look up, so go-to-definition, references and the unresolved-call verdict all stopped at the receiver. The value manager is now `MetadataRef(ConstantValueManager, <Имя>)`. Its user methods come from the constant's object slot, where the module index files the ValueManagerModule; its platform members from the `ConstantValueManager.` corpus prefix; a diagnostic names it `КонстантаМенеджерЗначения.<Имя>`; a parameter documented with the generic `КонстантаМенеджерЗначения` still accepts it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
🤖 Начата автоматическая приёмка — этот pull request взят в работу ИИ-агентом: |
…fields of its value manager The field lookup kept its own copy of the object-kind table and missed ConstantValueManager, so a valid read or write of a value-manager module export variable was reported as UnresolvedField. Reuse the table that method resolution already uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the constant `mdo_type_of_kind` had no arm for `ConstantValueManager`, so the type of `Константы.<Имя>.СоздатьМенеджерЗначения()` navigated nowhere although the constant's XML is there to reach. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
🤖 Автоматическая приёмка завершена: изменения приняты, PR влит коммитом 4501837. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Продолжение #319 (влит): после него
ValueManagerModule.bslконстанты индексируется как её модуль объекта, и экспорт этого модуля находится по имени. Но вызов СНАРУЖИ - черезКонстанты.<Имя>.СоздатьМенеджерЗначения()- до этого модуля по-прежнему не доходит. Эта правка закрывает вторую половину сценария.Проблема
На develop (
4467ba9a)Константы.<Имя>.СоздатьМенеджерЗначения()типизируется голым фантомомPlatformObject("КонстантаМенеджерЗначения")- имени константы в типе нет.resolve_user_callзнает толькоMetadataRefобъектов иObjectManager, поэтому на таком получателе:None;СоздатьМенеджерЗначения().НетТакогоМетода()не даётUnresolvedMethodCall, как и вызов неэкспортной процедуры модуля (платформа такой вызов отвергает).Так вызывают экспорт модуля менеджера значения в рабочих конфигурациях - например, при заполнении разрешений на доступ к внешним ресурсам.
Исправление
Новый вид
MetadataKind::ConstantValueManager(КонстантаМенеджерЗначения.<Имя>), по образцуExternalDataProcessorObject:map_generic_metadata_return_type: возвратКонстантаМенеджерЗначенияу менеджера константы даётMetadataRef(ConstantValueManager, <Имя>);object_kind_to_mdoотдаётMdoType::Constant: пользовательские методы ищутся в слоте объекта константы, куда fix(hir-def): модуль менеджера значения константы индексируется как её модуль объекта #319 кладётValueManagerModule. Правило экспорта, порядок «сначала пользовательский метод, потом платформа» и диагностикаMethodNotExport- общие с объектами, ничего отдельного;platform_prefix=ConstantValueManager: методы и свойства платформы берутся из того же префикса корпуса, что уже использует неявный получатель самого модуля менеджера значения (CONSTANT_VALUE_MANAGER_PREFIXвinfer.rs);КонстантаМенеджерЗначения.<Имя>, а неКонстанты.<Имя>(это менеджер);КонстантаМенеджерЗначения, принимает конкретный менеджер значения, какСправочникОбъектпринимает объект справочника.Что не меняется:
Константы.<Имя>.Метод()по-прежнему не доходит до модуля менеджера значения и даёт тот жеUnresolvedMethodCall;ValueManagerModuleсудится как справочник без модуля объекта: поверхность - только платформа, неизвестное имя сообщается. Так кодовая база уже поступает со всеми объектами без модуля (контроль наСправочник1в том же тесте), отдельное правило для констант создало бы расхождение;СоздатьЭлемент()в иерархии тоже не виден. Вызов на менеджере значения теперь стоит там же, где вызов на объекте справочника; тест это фиксирует.Доказательство
crates/ide/tests/value_manager_calls.rs, 9 тестов на фикстуреbsl-metadata/fixtures/designer(СтрокаКонстс модулем менеджера значения,ЧислоКонстбез него,Справочник1). Два из них - контрольные и проходят на обеих сторонах:the_manager_spelling_stays_unresolved(написание через менеджер не меняется) иplatform_members_of_the_value_manager_stay_platform_members(платформенные члены не затеняются модулем и не сообщаются).develop (
4467ba9a), добавлен только файл теста:ветка:
Мост подтипов -
hir-tysubtype::tests::constant_value_manager_assignable_to_its_generic_name. С вырезанной веткой моста:С ней -
ok.Проверка
cargo test --no-fail-fast -p bsl-types -p hir-def -p hir-ty -p hir -p ide -p ide-db -p ide-diagnosticsна develop и на ветке: списки упавших совпадают (одни и те же 27 тестов на обеих сторонах, падают на develop и без этой правки - фон прогона под Windows), на ветке на 10 прошедших больше (9 новых тестовideи тест моста подтипов). Новых падений нет.cargo fmt --all -- --check: чисто.cargo clippy --workspace --all-targets(собирает все крейты, включая те, что сопоставляютMetadataKindисчерпывающе): набор предупреждений совпадает с develop (два предупреждения вmcp-server, существующие на develop).Вне рамок
Константы.<Имя>.Метод()- его платформа не разрешает, поведение не меняется.МенеджерЗначения.Значениеиз типа константы этой правкой не затрагивается.🤖 Generated with Claude Code