Interface SelfMemberClassifier

All Known Implementing Classes:
TypeService

public interface SelfMemberClassifier
Классифицирует голое (без Перем) присваивание имени как обращение к self-реквизиту текущего модуля, а не к отдельной локальной переменной.

BSL резолвит локальную переменную по имени только при явном объявлении (Перем/параметр). Присваивание одноимённому реквизиту объекта/набора записей/менеджера без Перем НЕ создаёт теневую переменную — это обращение к реквизиту. Поэтому context.computer.VariableSymbolComputer спрашивает этот классификатор перед тем, как завести неявную VariableKind.DYNAMIC-переменную: если имя — self-реквизит, символ не заводится вовсе, и имя резолвит self-член machinery: инференсер, PlatformMemberReferenceFinder, а также индексация self-членов в ReferenceIndexFiller и их подсветка SymbolsSemanticTokensSupplier.

Интерфейс — контракт слоя context; реальная реализация живёт в types и внедряется через Spring: та же инверсия зависимости, что и у context.computer.DiagnosticComputer (реализация — diagnostics.DefaultDiagnosticComputer), — чтобы context не зависел от types напрямую, хотя классификация по существу требует реестра типов.

Вызывается при построении дерева символов. Классификация решается по реквизитам self-типа (конфигурационные и стандартные реквизиты объекта/набора записей/ менеджера), которые приходят из метаданных конфигурации, а не из SymbolTree самого модуля; self-тип регистрируется ( types.registry.ConfigurationTypesProvider) сразу по добавлению workspace'а — раньше, чем строится хоть одно дерево.

Оговорка про реентрантность: union членов self-типа включает и собственные экспортные члены модуля (ConfigurationModuleMembersProvider.collectModuleMembers), которые на перестройках читают SymbolTree этого же документа — то есть вызов МОЖЕТ оказаться реентрантным к вычисляемому в этот момент дереву (вернётся предыдущее, без взаимоблокировки). На решение это не влияет: экспортные методы имеют вид METHOD и не проходят фильтр PROPERTY, а экспортные Перем- переменные отсекаются проверкой объявленных переменных ещё до обращения к классификатору (см. VariableSymbolComputer#visitLValue).

  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    isBareSelfProperty(DocumentContext documentContext, String name)
    Является ли голое имя name обращением к self-реквизиту (свойству) модуля документа documentContext.
  • Method Details

    • isBareSelfProperty

      boolean isBareSelfProperty(DocumentContext documentContext, String name)
      Является ли голое имя name обращением к self-реквизиту (свойству) модуля документа documentContext.
      Parameters:
      documentContext - документ, в котором встречено имя.
      name - имя (без учёта регистра, ru/en-написания).
      Returns:
      true, если имя — self-реквизит текущего модуля.