"S" в "refs_or_self.S" — это имя автоматически вычисленное для списка. Честно говоря имя вычислилось криво. Правильное имя должно было бы быть "ref_or_selfs". Это надо будет поправить в будущем. Но пока — так. Его можно задать вручную:
VD>Но я так понимаю, что это тоже не желательно, так как код автогенеренный.
Мы сейчас правим сгенеренный один раз код руками. От периодической перегенерации отказались, т.к. исходная грамматика не особо поддерживается и уже out of date.
VD>То что вы преобразуете VD>
VD>ref_or_self (AS Name)?
VD>
VD>в PathReference — это явно не верно. Для этого элемента надо создавать отдельный АСТ хранящий имя.
Попробовали сделать опциональный alias. Маппинг получился довольно корявый, как сделать лучше?
Здравствуйте, pekabon, Вы писали:
P>Попробовали сделать опциональный alias. Маппинг получился довольно корявый, как сделать лучше?
Лучше завести два АСТ-а и отматить на них (с помощью паттерн-матчинга) разные варианты.
Но в данном случае вопрос еще в том, как будет интерпретироваться этот псевдоним alias. Обычно для alias-а нужно заводить локальный символ в котором хранить ссылку на исходный объект. Для разного рода псевдонимов есть "declaration Alias" (поищи по этой подстроке в проекте Нитры).
Я не знаю в каком контексте псевдоним в Расте используется. Погляди, например, как сделаны псевдонимы в юсингах Шарпа (UsingAliasDirective).
Псевдоним должен использоваться в каком-то контексте и подменяться символом на который он ссылается когда на него ссылаются.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Но в данном случае вопрос еще в том, как будет интерпретироваться этот псевдоним alias. Обычно для alias-а нужно заводить локальный символ в котором хранить ссылку на исходный объект. Для разного рода псевдонимов есть "declaration Alias" (поищи по этой подстроке в проекте Нитры). VD>Я не знаю в каком контексте псевдоним в Расте используется. Погляди, например, как сделаны псевдонимы в юсингах Шарпа (UsingAliasDirective). VD>Псевдоним должен использоваться в каком-то контексте и подменяться символом на который он ссылается когда на него ссылаются.
Так и будет использоваться, это тот же юзинг, только немного сложнее. Например такое может быть
use std::io::{self, Error, Result as IoResult};
В маппинге шарпа сделано через альтернативы и в синтаксисе, и в аст
| Alias -> UsingAliasDirective
{
Name -> Name;
QualifiedName -> NamespaceOrTypeName;
}
Смапить наш синтаксис на вариант пока не очень-то получается. Вот такое не компилируется
Ast.nitra(227,3): error : in argument #1 (item), needed a VisualRust.Grammar.RefOrSelfPathReference, got Nitra.Declarations.AstBase-: Nitra.Declarations.AstBase is not a subtype of VisualRust.Grammar.RefOrSelfPathReference [simple require]
При этом если сделать альтернативы одинаковыми — прокатывает
Здравствуйте, pekabon, Вы писали:
P>Похоже на багу в реализации паттерн матчинга
Да, наша недоработка. RefOrSelfPathReference преобразуется в интерфейс, а компилятор Немерла недоперает, что этот интерфейс является общим типом для классов в которые преобразуются RefOrSelfPathReference.Aliased и RefOrSelfPathReference.Simple.
Постараемся исправить в ближайшее время. Пока могу предложить обходной вариант:
map syntax Rules.refs_or_self_part -> RefOrSelfPathReference
{
match (NameOpt)
{
| Some((_, name)) ->
let res : RefOrSelfPathReference = RefOrSelfPathReference.Aliased { Ref_or_self -> PathReference; name -> Alias; } in
res
| None ->
let res : RefOrSelfPathReference = RefOrSelfPathReference.Simple { Ref_or_self -> PathReference; } in
res
}
}
у let есть возможность задать тип явно. Так что два let можно использовать как тайп-хинт. Напрямую тайп-хинты пока не поддерживаются.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.