Проблема с наследованием в макросе
От: SergASh  
Дата: 04.10.07 15:58
Оценка:
Привет всем!

Пытаюсь написать макроатрибут, который бы делал класс наследуемым от некоторого базового класса.

Вот так работает
[Nemerle.MacroUsage( Nemerle.MacroPhase.BeforeInheritance, 
                     Nemerle.MacroTargets.Class,
                     Inherited = false )]
macro Inherer( typeBuilder : TypeBuilder )
{ 
  typeBuilder.AddImplementedInterface( <[ My.Name.Space.BaseClass ]> );
}
а так нет
[Nemerle.MacroUsage( Nemerle.MacroPhase.BeforeInheritance, 
                     Nemerle.MacroTargets.Class,
                     Inherited = false )]
macro Inherer( typeBuilder : TypeBuilder )
{ 
  def baseClassName = "My.Name.Space.BaseClass";
  typeBuilder.AddImplementedInterface( <[ $(baseClassName : usesite) ]> );
}
Получаем unbound type name 'My.Name.Space.BaseClass'

В чём может быть проблема со втрорым вариантом?

Спасибо.
Re: Проблема с наследованием в макросе
От: SergASh  
Дата: 05.10.07 15:24
Оценка:
Привет всем!

Вопрос снимается. Как выяснилось, конструкция <[ My.Name.Space.BaseClass ]> преобразуется в PExpr.Member, ссылающийся на другой PExpr.Member и так далее для каждого компонента пространства имён. Последний PExpr.Member ссылается на PExpr.Ref, который уже соответствует имени класса.

А вот конструкция <[ $(baseClassName : usesite) ]> преобразуется сразу в PExpr.Ref с составным именем, а так нельзя.

Для получения АСТ, соответствующего полностью квалифицированному имени, служит метод PExpr.FromQualifiedIdentifier(...).

Одним словом, плохо работать без документации.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.