Вызов макросов у вновь сгенеренных мемберов.
От: ie Россия http://ziez.blogspot.com/
Дата: 27.02.07 05:25
Оценка:
Господа, написал в конфу, но никто не ответил, мож сообщение не дошло
Макрос:
 [Nemerle.MacroUsage (Nemerle.MacroPhase.WithTypedMembers,
                      Nemerle.MacroTargets.Class,
                      Inherited = false, AllowMultiple = false)]
 macro AddMethWithNotNullParam(tb : TypeBuilder, macros = <[ ]>)
 {
   def t = tb.InternalType.Object;
   def attrs = Modifiers (NemerleAttributes.None, [macros]);
   def prm = <[ parameter: ..$attrs $("_prm" : usesite) : $(t : typed) ]> :: [];
   def bd = <[ object() ]>;
   def meth = <[ decl: SomeMeth (..$prm) : $(t : typed) $bd ]>;
   tb.DefineAndReturn (meth).HasBeenUsed = true;
 }

Применяю его:
 [AddMethWithNotNullParam(NotNull)]
 class A
 {
   static Main() : void
   {
     _ = A().SomeMeth(null);
   }
 }

Мне надо чтоб сгенерилось что-то вроде:
 class A
 {
   static Main() : void
   {
     _ = A().SomeMeth(null);
   }
     
   SomeMeth(_prm : object) : object
   {
     when (_prm == null)
       throw AssertionException(...);
     object()
   }
 }

Метод то создается, а вот макрос NotNull не раскрывается
Как мне для вновь сгенеренных мемберов прогнать макросы?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re: Вызов макросов у вновь сгенеренных мемберов.
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.02.07 10:13
Оценка:
Здравствуйте, ie, Вы писали:


ie>Метод то создается, а вот макрос NotNull не раскрывается

ie>Как мне для вновь сгенеренных мемберов прогнать макросы?

И где ты добавляешь макрос?
def prm = <[ parameter: ..$attrs $("_prm" : usesite) : $(t : typed) ]> :: [];

что-то не видать?

Плюс не надо это делать на WithTypedMembers. Это скорее всего поздно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Вызов макросов у вновь сгенеренных мемберов.
От: ie Россия http://ziez.blogspot.com/
Дата: 27.02.07 10:49
Оценка:
Здравствуйте, VladD2, Вы писали:

ie>>Метод то создается, а вот макрос NotNull не раскрывается

ie>>Как мне для вновь сгенеренных мемберов прогнать макросы?

VD>И где ты добавляешь макрос?

VD>
VD>def prm = <[ parameter: ..$attrs $("_prm" : usesite) : $(t : typed) ]> :: [];
VD>

VD>что-то не видать?

Ну так он в списке attrs.

VD>Плюс не надо это делать на WithTypedMembers. Это скорее всего поздно.


Хмм. Щас попробовал на более ранних стадиях, при компиляции проекта использующего макрос, компилятор падает с NRE. Пошел разбираться почему так.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[2]: Вызов макросов у вновь сгенеренных мемберов.
От: ie Россия http://ziez.blogspot.com/
Дата: 27.02.07 11:05
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Плюс не надо это делать на WithTypedMembers. Это скорее всего поздно.


Угу, так и вышло. На стадиях BeforeInheritance и BeforeTypedMembers NotNull раскрывается.
Падало с NRE из-за того, что tb.DefineAndReturn (meth) возвращает на этих стадияю null.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[3]: Вызов макросов у вновь сгенеренных мемберов.
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.02.07 13:26
Оценка:
Здравствуйте, ie, Вы писали:

ie>Ну так он в списке attrs.


В каком еще списке? NotNull — это вроде мета-атрибут определенный только для параметров.
  [Nemerle.MacroUsage (Nemerle.MacroPhase.BeforeInheritance,
                       Nemerle.MacroTargets.Parameter,
                       Inherited = true, AllowMultiple = false)]
  macro NotNull (_ : TypeBuilder, m : ParsedMethod, p : ParsedParameter)


ie>Хмм. Щас попробовал на более ранних стадиях, при компиляции проекта использующего макрос, компилятор падает с NRE. Пошел разбираться почему так.


Что такое NRE?

Если что-то падает, то это в багтрекер. Думаю, основная причина в том что я сказал выше.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Вызов макросов у вновь сгенеренных мемберов.
От: ie Россия http://ziez.blogspot.com/
Дата: 27.02.07 13:36
Оценка:
Здравствуйте, VladD2, Вы писали:

ie>>Ну так он в списке attrs.


VD>В каком еще списке? NotNull — это вроде мета-атрибут определенный только для параметров.

VD>
VD>  [Nemerle.MacroUsage (Nemerle.MacroPhase.BeforeInheritance,
VD>                       Nemerle.MacroTargets.Parameter,
VD>                       Inherited = true, AllowMultiple = false)]
VD>  macro NotNull (_ : TypeBuilder, m : ParsedMethod, p : ParsedParameter) 
VD>


Угу, я его в параметр и добавляю:
<[ parameter: ..$attrs $("_prm" : usesite) : $(t : typed) ]>


ie>>Хмм. Щас попробовал на более ранних стадиях, при компиляции проекта использующего макрос, компилятор падает с NRE. Пошел разбираться почему так.


VD>Что такое NRE?


NullReferenceException

VD>Если что-то падает, то это в багтрекер. Думаю, основная причина в том что я сказал выше.


Угу, я ниже уже написал, что ты прав.
Там вообще интересная ситуация, если бы NotNull раскрывался в MacroPhase.WithTypedMembers, то он бы нормально раскрылся после отработки моего макроса, но он в MacroPhase.BeforeInheritance. Однако, судя по коду (тут не уверен, еще копаю), при дефайне, если в вновь задефайненых мемберах есть макро-атрибуты, то для них выполняются фазы BeforeInheritance и BeforeTypedMembers, но они почему-то нифига на деле не выполняются, баг это или нет, пока не понял, но понимание уже близко
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[5]: Вызов макросов у вновь сгенеренных мемберов.
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.02.07 15:56
Оценка:
Здравствуйте, ie, Вы писали:


ie>Угу, я его в параметр и добавляю:

ie>
ie><[ parameter: ..$attrs $("_prm" : usesite) : $(t : typed) ]>
ie>


Что-то я не вижу там этого атрибута .
А почему тупо не написать:
<[ parameter: [NotNull] $("_prm" : usesite) : $(t : typed) ]>
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Вызов макросов у вновь сгенеренных мемберов.
От: ie Россия http://ziez.blogspot.com/
Дата: 27.02.07 17:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Что-то я не вижу там этого атрибута .

VD>А почему тупо не написать:
VD>
VD><[ parameter: [NotNull] $("_prm" : usesite) : $(t : typed) ]>
VD>


Ну как же:
 [AddMethWithNotNullParam(NotNull)]
 class A
 {
   static Main() : void
   {
     _ = A().SomeMeth(null);
   }
 }

Я, конечно, зря назвал так макрос, каюсь, это просто тест, никакого реального смысла он не имеет, но с толку название сбивает.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.