Interface SelfMemberClassifier
- All Known Implementing Classes:
TypeService
Перем) присваивание имени как обращение к
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 TypeMethodDescriptionbooleanisBareSelfProperty(DocumentContext documentContext, String name) Является ли голое имяnameобращением к self-реквизиту (свойству) модуля документаdocumentContext.
-
Method Details
-
isBareSelfProperty
Является ли голое имяnameобращением к self-реквизиту (свойству) модуля документаdocumentContext.- Parameters:
documentContext- документ, в котором встречено имя.name- имя (без учёта регистра, ru/en-написания).- Returns:
true, если имя — self-реквизит текущего модуля.
-