Здравствуйте,
В dsl есть понятия variant (ближайшая аналогия — абстрактный класс) и record (неабстрактный). Record может иметь или не иметь variant-предка.
Соответствующие ast (значимые для вопроса фрагменты):
declaration VariantDefinition
{
symbol
{
out Descendants : List[RecordDefinitionSymbol];
}
}
declaration RecordDefinition
{
symbol
{
in Ancestor : VariantDefinitionSymbol;
}
AncestorReference.Scope = OuterScope;
Symbol.Ancestor = AstUtils.ResolvedSymbol(AncestorReference.Ref);
AncestorReference : VariantReference?;
}
Вопрос 1:
AstUtils.ResolvedSymbol преобразует ValueOption[Ref[T]] в T (или null если reference не задан или символ не найден). Это нормальный подход? Если нет, то как хранить в символах ссылки на опциональные символы?
Вопрос 2:
Мне нужен список Descendants в VariantDefinitionSymbol, но я не могу понять, как его вычислить.
Я пробовал в RecordDefinitionSymbol:
when (Ancestor != null)
Ancestor.Descendants.Add(this);
Но это не работает (NullReferenceException в NitraVisualizer) (да и вообще, какой код можно выполнять в декларациях и символах? — в примерах можно найти when|unless(...) Error(...), а что еще можно?)
Не работает и через коллектор — when|unless(...) Ancestor.Descendants |= this; вообще не скомпилируется.
Как можно добиться нужного результата?