Контекст
В #3947 добавили поле MethodSymbol.isAsync и модификаторы async для пользовательских async-методов. В follow-up PR feature/platform-member-method-semantic-tokens (готовится) добавили PlatformMemberMethodCallSemanticTokensSupplier, который через TypeService.findMemberAt() резолвит и подсвечивает вызовы методов на типизированных переменных вида получатель.метод(...) для платформенных типов как Method+defaultLibrary.
Симметричный кейс — access к свойству (получатель.свойство без скобок) — сейчас ничем не подсвечивается. Например, Стр.Имя, ТЗ.Колонки, Сертификат.Владелец визуально не отличимы от обычного текста.
Что нужно
Создать PlatformMemberPropertyAccessSemanticTokensSupplier по образцу свежего методного:
- Идти по всем
accessProperty в AST (BSLParser.RULE_accessProperty).
- Брать
IDENTIFIER после точки, его позицию.
- Звать
typeService.findMemberAt(documentContext, position).
- Если результат present и
member.descriptor().kind() == MemberKind.PROPERTY — выдать SemanticTokenTypes.Property + SemanticTokenModifiers.DefaultLibrary.
Property уже зарегистрирован в SemanticTokensLegendConfiguration (использован для SDBL field names) — менять легенду не нужно.
Тесты
Аналогично PlatformMemberMethodCallSemanticTokensSupplierTest:
testPlatformPropertyOnTypedVariable — Стр = Новый Структура("Имя", "Иван"); А = Стр.Имя; → Имя подсвечен как Property+DefaultLibrary.
testPropertyChain — ТЗ.Колонки → Колонки подсвечен.
testMethodCallNotHighlightedAsProperty — что для accessCall (.метод(...)) этот сапплаер ничего не выдаёт.
testUnknownTypeReceiverProducesNoToken — без type inference пусто.
Эстимат
~80 строк по образцу свежего методного супплаера + ~70 строк тестов. Инфраструктура (TypeService.findMemberAt уже различает PROPERTY/METHOD через expectedKind) полностью готова.
Ссылки
PlatformMemberMethodCallSemanticTokensSupplier (образец) — будет в follow-up PR
TypeService.findMemberAt(...) — уже резолвит и property, и method через ExpressionTypeInferencer + TypeRegistry.getMembers.
Контекст
В #3947 добавили поле
MethodSymbol.isAsyncи модификаторыasyncдля пользовательских async-методов. В follow-up PRfeature/platform-member-method-semantic-tokens(готовится) добавилиPlatformMemberMethodCallSemanticTokensSupplier, который черезTypeService.findMemberAt()резолвит и подсвечивает вызовы методов на типизированных переменных видаполучатель.метод(...)для платформенных типов какMethod+defaultLibrary.Симметричный кейс — access к свойству (
получатель.свойствобез скобок) — сейчас ничем не подсвечивается. Например,Стр.Имя,ТЗ.Колонки,Сертификат.Владелецвизуально не отличимы от обычного текста.Что нужно
Создать
PlatformMemberPropertyAccessSemanticTokensSupplierпо образцу свежего методного:accessPropertyв AST (BSLParser.RULE_accessProperty).IDENTIFIERпосле точки, его позицию.typeService.findMemberAt(documentContext, position).member.descriptor().kind() == MemberKind.PROPERTY— выдатьSemanticTokenTypes.Property+SemanticTokenModifiers.DefaultLibrary.Propertyуже зарегистрирован вSemanticTokensLegendConfiguration(использован для SDBL field names) — менять легенду не нужно.Тесты
Аналогично
PlatformMemberMethodCallSemanticTokensSupplierTest:testPlatformPropertyOnTypedVariable—Стр = Новый Структура("Имя", "Иван"); А = Стр.Имя;→ Имя подсвечен как Property+DefaultLibrary.testPropertyChain—ТЗ.Колонки→ Колонки подсвечен.testMethodCallNotHighlightedAsProperty— что дляaccessCall(.метод(...)) этот сапплаер ничего не выдаёт.testUnknownTypeReceiverProducesNoToken— без type inference пусто.Эстимат
~80 строк по образцу свежего методного супплаера + ~70 строк тестов. Инфраструктура (
TypeService.findMemberAtуже различает PROPERTY/METHOD черезexpectedKind) полностью готова.Ссылки
PlatformMemberMethodCallSemanticTokensSupplier(образец) — будет в follow-up PRTypeService.findMemberAt(...)— уже резолвит и property, и method черезExpressionTypeInferencer+TypeRegistry.getMembers.