feat(semantictokens): подсветка платформенных member-методов через accessCall#3950
Conversation
…cessCall Новый PlatformMemberMethodCallSemanticTokensSupplier: для каждого accessCall выводит тип ресивера через TypeService.findMemberAt (тот же путь, что hover/go-to-definition) и, если резолвится платформенный member типа METHOD, выдаёт Method+DefaultLibrary. Source-defined вызовы (общие модули, OScript-library, локальные методы) обрабатываются MethodCallSemanticTokensSupplier по ReferenceIndex — этот сапплаер пропускает позиции, уже зарегистрированные в индексе, чтобы не дублировать токен. Async-модификатор для платформенных member-методов не выставляется — у MemberDescriptor сейчас нет флага async; это отдельная задача (расширение PlatformMetadata + парсера платформенных контекстов). Co-Authored-By: Claude Opus 4.7 <[email protected]>
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughA new ChangesPlatform Member Method Call Semantic Tokens
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related issues
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 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 |
Замечания PR #3950: - В сапплаере используем typed-вариант Trees.<AccessCallContext>findAllRuleNodes(...) и убираем лишний instanceof-каст. - В тесте убираем @CleanupContextBeforeClassAndAfterClass: все 4 теста работают с in-memory исходниками через helper.getDecodedTokens(...), ServerContext не инициализируем — очищать тоже нечего. Co-Authored-By: Claude Opus 4.7 <[email protected]>
Закрытие 4 Sonar issues на PR #3950: - S2583 (MAJOR): убран мёртвый `if (ast == null)` — DocumentContext.getAst() не возвращает null; - S3776 (CRITICAL) и S135 (MINOR): тело цикла вынесено в Optional-чейн + два хелпера (methodNameRange через Optional.ofNullable().map().map(), isPlatformMethodAt). Когнитивная сложность падает <15, один continue на цикл больше нет; - S6212 (INFO): Range заменён на var. Co-Authored-By: Claude Opus 4.7 <[email protected]>
|
В develop добавили MemberDescriptor.async (1c-syntax#3950+followup). Используем его в PlatformMemberMethodCallSemanticTokensSupplier: - async-метод платформы (descriptor.async() == true) теперь получает Method + DefaultLibrary + Async на сайте вызова; - обычный метод — Method + DefaultLibrary, без Async (как и было). Реализовано через flatMap-пару (range, descriptor) в виде Resolved-record и кэшированных статических массивов модификаторов (DEFAULT_LIBRARY_MODIFIERS / DEFAULT_LIBRARY_ASYNC_MODIFIERS). В тест добавлены два unit-кейса (testModifiersForAsyncDescriptor / testModifiersForRegularDescriptor) на package-private modifiers(...) — производственные платформенные типы пока async-методов не несут, поэтому покрытие через type-инференс в integration-тесте сейчас невозможно. Co-Authored-By: Claude Opus 4.7 <[email protected]>



Summary
PlatformMemberMethodCallSemanticTokensSupplierподсвечивает вызовы методов на типизированных переменных видаreceiver.method(...)для платформенных типов какMethod+defaultLibrary.TypeService.findMemberAt(...)(тот же путь, что hover/go-to-definition): вывод типа ресивера черезExpressionTypeInferencer, поиск member черезTypeRegistry.getMembers.MethodCallSemanticTokensSupplier— этот сапплаер пропускает позиции, уже зарегистрированные вReferenceIndex, чтобы не дублировать токен.MemberDescriptorнет поляasync. Отдельная задача — расширениеPlatformMetadata+ парсера платформенных контекстов.Стр.Имясейчас тоже не подсвечивается).Закрывает баг из юзер-репорта «не красится метод после
Ждать»: корень был в том, чтоСертификатКриптографии.ИнициализироватьАсинх(...)— это вызов метода платформенного типа, который ни один существующий сапплаер не покрывал.Test plan
PlatformMemberMethodCallSemanticTokensSupplierTest:testPlatformMethodOnTypedVariable—М.Добавить(...)(Массив) → Method+DefaultLibrarytestPlatformMethodAfterAwait—Ждать М.Добавить(...)(юзер-репорт)testAccessPropertyIgnored—Стр.Имяне подсвечивается (это для follow-up)testUnknownTypeReceiverProducesNoToken— без типа пусто./gradlew test --tests "...semantictokens.*" --tests "...SemanticTokensProviderTest"— зелёно, регрессий нет./gradlew bootJar— собираетсяDraft
PR оформлен как draft: жду подтверждения подхода (через
TypeService.findMemberAtпротив самостоятельного построения BslExpression) и решения по сопутствующему issue #3949 — публиковать оба супплаера вместе одним PR или отдельно.🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
New Features
Tests