Макросы-атрибуты
От: PowRTocH  
Дата: 20.04.12 19:51
Оценка:
А можно ли внутри макроса, применяемого к классу, узнать, помечен ли метод этого класса другим макросом-атрибутом?

[Foo]
class A
{
  [Bar]
  public Some() : void
  {
  }
}


Внутри Foo надо найти Bar.
Спасибо.
Re: Макросы-атрибуты
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.04.12 20:19
Оценка: 2 (1)
Здравствуйте, PowRTocH, Вы писали:

PRT>А можно ли внутри макроса, применяемого к классу, узнать, помечен ли метод этого класса другим макросом-атрибутом?


У TypeBuilder есть метод IsCustomAttributeDefined(). Принимает полное имя атрибута.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Макросы-атрибуты
От: catbert  
Дата: 20.04.12 20:21
Оценка: 3 (1) +1
Здравствуйте, PowRTocH, Вы писали:

PRT>А можно ли внутри макроса, применяемого к классу, узнать, помечен ли метод этого класса другим макросом-атрибутом?


PRT>Внутри Foo надо найти Bar.

PRT>Спасибо.

Надежный способ сделать так — декларировать макрос [Bar] на ранней стадии компиляции, и при его исполнении добавлять в UserData класса-родителя ссылку на себя:
[Nemerle.MacroUsage (Nemerle.MacroPhase.BeforeTypedMembers,
                     Nemerle.MacroTargets.Method)]
macro Bar (t : TypeBuilder, f : MethodBuilder, expr)
{
  if ( t.UserData.Contains["bar"] )
  {
    def bars = t.UserData["bar"] :> List.[object];
    bars.Add(f);
  }
  else 
    t.UserData.Add( "bar", List.[object](f) )
}


А макрос Foo декларировать на более поздней стадии, и использовать информацию из UserData.
Код я не проверял, не компилировал, так что там может быть ошибка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.