Class AbstractPlatformMemberSemanticTokensSupplier<T extends ParserRuleContext>

java.lang.Object
com.github._1c_syntax.bsl.languageserver.semantictokens.AbstractPlatformMemberSemanticTokensSupplier<T>
Type Parameters:
T - тип AST-узла обращения к члену
All Implemented Interfaces:
SemanticTokensSupplier
Direct Known Subclasses:
PlatformMemberMethodCallSemanticTokensSupplier, PlatformMemberPropertyAccessSemanticTokensSupplier

public abstract class AbstractPlatformMemberSemanticTokensSupplier<T extends ParserRuleContext> extends Object implements SemanticTokensSupplier
Общая основа сапплаеров, подсвечивающих обращения к членам платформенных типов (свойство через accessProperty, вызов метода через accessCall). Тип члена резолвится через TypeService.memberAt(DocumentContext, Position) — дорогой инференс, поэтому в range-запросе он вызывается только для узлов, пересекающихся с запрошенным диапазоном.

Подклассы определяют четыре точки расширения:

  • ruleIndex() — какой rule-узел AST обходить;
  • nameRange(ParserRuleContext) — диапазон имени члена в узле;
  • skipFilter(DocumentContext) — узлы, которые красит другой сапплаер (домен GlobalScope, source-defined вызовы) и которые нужно пропустить, чтобы не дублировать токен;
  • emit(List, DocumentContext, Range) — резолв члена и выдача токена нужного типа/модификаторов.
  • Field Details

    • DEFAULT_LIBRARY_MODIFIERS

      protected static final String[] DEFAULT_LIBRARY_MODIFIERS
    • typeService

      protected final TypeService typeService
    • helper

      protected final SemanticTokensHelper helper
  • Constructor Details

  • Method Details

    • ruleIndex

      protected abstract int ruleIndex()
      Индекс rule-узла AST для обхода (например BSLParser.RULE_accessProperty).
    • nameRange

      protected abstract Optional<Range> nameRange(T node)
      Диапазон имени члена в узле; empty, если имени нет.
    • skipFilter

      protected abstract BiPredicate<T,Range> skipFilter(DocumentContext documentContext)
      Предикат «пропустить узел» — позиции, которые уже красит другой сапплаер. Считается один раз на документ (можно предвычислить тяжёлое состояние).
    • emit

      protected abstract void emit(List<SemanticTokenEntry> entries, DocumentContext documentContext, Range range)
      Резолвит член в позиции и при успехе добавляет токен в entries.
    • getSemanticTokens

      public final List<SemanticTokenEntry> getSemanticTokens(DocumentContext documentContext)
      Description copied from interface: SemanticTokensSupplier
      Получить семантические токены для документа.
      Specified by:
      getSemanticTokens in interface SemanticTokensSupplier
      Parameters:
      documentContext - Контекст документа
      Returns:
      Список семантических токенов
    • getSemanticTokens

      public final List<SemanticTokenEntry> getSemanticTokens(DocumentContext documentContext, Range range)
      Description copied from interface: SemanticTokensSupplier
      Получить семантические токены только для указанного диапазона документа (запрос textDocument/semanticTokens/range).

      Реализация по умолчанию игнорирует диапазон и возвращает токены всего документа — провайдер всё равно отфильтрует их по диапазону. Дорогие сапплаеры (с инференсом типов на каждый узел) переопределяют этот метод, чтобы не выполнять тяжёлую работу за пределами видимой области.

      Specified by:
      getSemanticTokens in interface SemanticTokensSupplier
      Parameters:
      documentContext - Контекст документа
      range - Запрошенный диапазон (всегда задан вызывающим)
      Returns:
      Список семантических токенов в пределах диапазона