Определение типов в макросах и их использование
От: BogdanMart Украина  
Дата: 25.02.11 14:10
Оценка:
Суть:
Есть два класса, оба создаются во время компиляции макросами. Второму классу надо содержать ссылку на первый
namespace MacroLibrary1
{
  [Nemerle.MacroUsage (Nemerle.MacroPhase.BeforeInheritance, Nemerle.MacroTargets.Assembly)]
  public macro GenerateOMMs(/*tb : TypeBuilder,*/ params guids : list[PExpr])
  {
    def typer = Nemerle.Macros.ImplicitCTX();
    when((!typer.Manager.IsIntelliSenseMode))
    {
      GenerateOMMsImpl.Exec(typer.Env, guids);
    }    
  }
  
  internal module GenerateOMMsImpl
  {
    
    internal Exec(env : GlobalEnv, guids : list[PExpr]):void
    {
      //_ = System.Diagnostics.Debugger.Launch();
      def getOmmClass() : TypeBuilder
      {       
        def ommClassDef =
          <[decl:
            public class Foo 
            {
              public this(o : object){}
            }
          ]>;     
        def c = env.Define(ommClassDef);
        
        c.Compile();
        c
      }

      def ommClass = getOmmClass();

      def c = env.Define(
        <[decl:
          public abstract class Bar
          {
            private mutable _omm : Object;

            public SufOmm : Object
            {
                get { _omm; }
                set
                {
                    this._omm = value;
                    if (value : object != null)
                      this.Omm = $(ommClass.FullName : usesite) (value);
                    else
                      this.Omm = null;
                }
            }
            
            public mutable Omm : $(ommClass.FullName : usesite);
          }
        ]>);
      c.Compile();
    }
  }
}

И получаю следующие ошибки:
Error    unbound type name `Test.Foo'    Main.n    12    15    ConsoleApplication1
Error    unbound name `Test.Foo'         Main.n    12    15    ConsoleApplication1

Если заменить ommClass.FullName на ommClass.Name то все работает, но я планирую в ближайшее время сделать чтобы мой код генерировал классы в разных пространствах имен.(в реалом случае классов будет много).

Собственно интересно: это баг компилятора, или так надо и если я хочю использовать эти типы, то надо использувать какуюто хитрую структуру вместо : usesite
Re: Определение типов в макросах и их использование
От: hardcase Пират http://nemerle.org
Дата: 25.02.11 14:30
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Собственно интересно: это баг компилятора, или так надо и если я хочю использовать эти типы, то надо использувать какуюто хитрую структуру вместо : usesite


Вся строка, не взирая на точки, интерпретируется как имя типа (ибо создается PName с текущим GlobalEnv) потому компилтяор не может найти тип.
Чтобы все было тип-топ нужно ссылку на "Foo" создавать через PName, заключенного в тот же GlobalEnv, что и class Foo.
Что-то в духе:
def fooref = Name.NameInCurrentColor("Foo", env);


<[
  ...
  $(fooref : name)
  ...
]>
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Определение типов в макросах и их использование
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.02.11 15:32
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Если заменить ommClass.FullName на ommClass.Name то все работает, но я планирую в ближайшее время сделать чтобы мой код генерировал классы в разных пространствах имен.(в реалом случае классов будет много).


BM>Собственно интересно: это баг компилятора, или так надо и если я хочю использовать эти типы, то надо использувать какуюто хитрую структуру вместо : usesite


Если тебе нужно получить квалифицированное имя, то используй PExpr.FromQualifiedIdentifier().
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Определение типов в макросах и их использование
От: BogdanMart Украина  
Дата: 25.02.11 21:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Вся строка, не взирая на точки, интерпретируется как имя типа (ибо создается PName с текущим GlobalEnv) потому компилтяор не может найти тип.

H>Чтобы все было тип-топ нужно ссылку на "Foo" создавать через PName, заключенного в тот же GlobalEnv, что и class Foo.

Оооо, интересно, то есть теоретически я могу в имя класса точки по добавлять...

В общем спасибо за ответ, буду использовать GLobalEnv из сгенериного класса для генерации Name'a
Re[2]: Определение типов в макросах и их использование
От: BogdanMart Украина  
Дата: 25.02.11 21:09
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Если тебе нужно получить квалифицированное имя, то используй PExpr.FromQualifiedIdentifier().


Ооо, спасибо очень помогло!!!

Было бы неплохо включить эту инфу в официальную справку по макросам...
Re[3]: Определение типов в макросах и их использование
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.02.11 06:18
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Было бы неплохо включить эту инфу в официальную справку по макросам...


За чем дело стало? Тебе ведь виднее куда и как эту информацию лучше вставить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.