Суть:
Есть два класса, оба создаются во время компиляции макросами. Второму классу надо содержать ссылку на первый
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: Определение типов в макросах и их использование
Здравствуйте, BogdanMart, Вы писали:
BM>Собственно интересно: это баг компилятора, или так надо и если я хочю использовать эти типы, то надо использувать какуюто хитрую структуру вместо : usesite
Вся строка, не взирая на точки, интерпретируется как имя типа (ибо создается PName с текущим GlobalEnv) потому компилтяор не может найти тип.
Чтобы все было тип-топ нужно ссылку на "Foo" создавать через PName, заключенного в тот же GlobalEnv, что и class Foo.
Что-то в духе:
Здравствуйте, BogdanMart, Вы писали:
BM>Если заменить ommClass.FullName на ommClass.Name то все работает, но я планирую в ближайшее время сделать чтобы мой код генерировал классы в разных пространствах имен.(в реалом случае классов будет много).
BM>Собственно интересно: это баг компилятора, или так надо и если я хочю использовать эти типы, то надо использувать какуюто хитрую структуру вместо : usesite
Если тебе нужно получить квалифицированное имя, то используй PExpr.FromQualifiedIdentifier().
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Определение типов в макросах и их использование
Здравствуйте, hardcase, Вы писали:
H>Вся строка, не взирая на точки, интерпретируется как имя типа (ибо создается PName с текущим GlobalEnv) потому компилтяор не может найти тип. H>Чтобы все было тип-топ нужно ссылку на "Foo" создавать через PName, заключенного в тот же GlobalEnv, что и class Foo.
Оооо, интересно, то есть теоретически я могу в имя класса точки по добавлять...
В общем спасибо за ответ, буду использовать GLobalEnv из сгенериного класса для генерации Name'a
Re[2]: Определение типов в макросах и их использование