Skip to content

Подсветка accessProperty платформенных типов (Property+defaultLibrary) #3949

Description

@nixel2007

Контекст

В #3947 добавили поле MethodSymbol.isAsync и модификаторы async для пользовательских async-методов. В follow-up PR feature/platform-member-method-semantic-tokens (готовится) добавили PlatformMemberMethodCallSemanticTokensSupplier, который через TypeService.findMemberAt() резолвит и подсвечивает вызовы методов на типизированных переменных вида получатель.метод(...) для платформенных типов как Method+defaultLibrary.

Симметричный кейс — access к свойству (получатель.свойство без скобок) — сейчас ничем не подсвечивается. Например, Стр.Имя, ТЗ.Колонки, Сертификат.Владелец визуально не отличимы от обычного текста.

Что нужно

Создать PlatformMemberPropertyAccessSemanticTokensSupplier по образцу свежего методного:

  1. Идти по всем accessProperty в AST (BSLParser.RULE_accessProperty).
  2. Брать IDENTIFIER после точки, его позицию.
  3. Звать typeService.findMemberAt(documentContext, position).
  4. Если результат present и member.descriptor().kind() == MemberKind.PROPERTY — выдать SemanticTokenTypes.Property + SemanticTokenModifiers.DefaultLibrary.
  5. 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions