fix(definition): переход к определению члена через source-defined символ дескриптора#4202
Conversation
…вол дескриптора F12 на члене платформенного/конфигурационного типа, разрешённом через TypeService.memberAt в синтетический PlatformMemberSymbol (например, метод OneScript-класса в fluent-цепочке asserts: Ожидаем.Что(X).ИмеетТип(...)), не срабатывал: DefinitionProvider отсекал такие ссылки фильтром isSourceDefinedSymbolReference, хотя дескриптор уже несёт source-defined символ-источник (OScriptModuleMembersProvider.withSourceSymbol). Добавлен маленький Reference->Reference map (unwrapPlatformMemberSource), разворачивающий ссылку на источник перед фильтром; основной пайплайн перехода не меняется. Платформенные члены без источника остаются hover-only. Обсуждение и дизайн: #4197 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KZQafLUdXJF7ZDqphzs6tX
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughDefinitionProvider now unwraps platform member references to their source-defined symbols before resolving definitions. New unit tests cover the source-backed and source-missing platform member cases. ChangesDefinition source unwrapping
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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 |
|



Проблема
F12 (go-to-definition) на члене платформенного/конфигурационного типа, разрешённом через
TypeService.memberAtв синтетическийPlatformMemberSymbol, не срабатывал — хотя hover на нём работает.Пример (библиотека
asserts, fluent-цепочка):Клик F12 на
ИмеетТипмолча ничего не делал.Причина
Ссылку отдаёт
PlatformMemberReferenceFinder(@order(200)), оборачивая член в синтетическийPlatformMemberSymbol(онimplements Symbol, но неSourceDefinedSymbol).DefinitionProviderфильтрует ссылки черезReference::isSourceDefinedSymbolReference→ такой символ отсекается →F12возвращает пустой список.При этом для метода OneScript-класса дескриптор уже несёт source-defined символ-источник:
OScriptModuleMembersProvider.toMemberDescriptor(...)вешает.withSourceSymbol(method). То есть данные для перехода уже на руках в момент запроса —DefinitionProviderих просто не читал.Решение
Маленький
Reference → Referencemap (unwrapPlatformMemberSource) перед фильтром: если символ —PlatformMemberSymbolи у его дескриптора есть source-definedsourceSymbol, ссылка перенаправляется на источник; иначе возвращается без изменений. Основной пайплайн перехода не меняется.Платформенные члены без символа-источника (например
ТаблицаЗначений.Добавить) остаютсяPlatformMemberSymbol, отсекаются прежним фильтром → hover-only сохранён (у них нет объявления в исходниках).Область
Только навигация (F12). Это подмножество более крупного обсуждения про индексацию type-inferred member-обращений для find-references/rename — см. #4197 (там анализ и дизайн, кода нет).
Тесты
DefinitionProviderUnitTest(Mockito, без подъёмаServerContext):targetUri/targetRange/targetSelectionRange, origin = диапазон обращения к члену);Прогон:
DefinitionProviderUnitTest2/2 ✅,DefinitionProviderTest6/6 ✅ (поведение не сломано).🤖 Generated with Claude Code
Generated by Claude Code
Summary by CodeRabbit