Привет всем!
Пытаюсь из макроса построить два класса, связанных наследованием. В простом случае всё работает, а если класть эти классы в отдельное пространство имён по рецепту Влада, то получаю ошибку
unbound type name 'MyBase'
Вот пример
def env = ImplicitCTX().Env;
def env = GlobalEnv( "Test.Hidden&", env.Manager ); // Если это убрать, то работает, но так всё будет в том же NS, что и класс под атрибутом. Не хорошо.
def tb1 = env.Define(
<[decl:
public class MyBase
{
}
]> );
tb1.Compile();
def tb2 = env.Define(
<[decl:
public class MyDerived : MyBase // Пробовал и полностью квалифицированное имя. Не помогло.
{
}
]> );
tb2.Compile();
Подозреваю, что я недостаточно информации передал через закодированную строку конструктору GlobalEnv. Но что ещё туда надо класть — не знаю.
Пространство имён Test.Hidden в проекте есть, причём не пустое, а с классами.
Спасибо.
PS. Надеюсь, я ещё не всех достал тут своими вопросами. Уж очень хочется разобраться с макросами.
Здравствуйте, SergASh, Вы писали:
Где выполняется привденный код?
Подобные вещи нужно делать на стадии MacroPhase.BeforeInheritance. Тогда все (теоретически) должно быть хорошо.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Здравствуйте, VladD2, Вы писали:
VD>Где выполняется привденный код?
VD>Подобные вещи нужно делать на стадии MacroPhase.BeforeInheritance. Тогда все (теоретически) должно быть хорошо.
Так я и делаю. Вот минимальный пример.
// В коде макроса
[Nemerle.MacroUsage( Nemerle.MacroPhase.BeforeInheritance,
Nemerle.MacroTargets.Class,
Inherited = false )]
macro DerivationSample( typeBuilder : TypeBuilder )
{
def env = ImplicitCTX().Env;
def env = GlobalEnv( "Test.Hidden&", env.Manager ); // #1
def baseClassName = "MyBase";
def tb1 = env.Define(
<[decl:
public class $( baseClassName : usesite ) // #2
{
}
]> );
tb1.Compile();
def tb2 = env.Define(
<[decl:
public class MyDerived : $( baseClassName : usesite ) // #3
{
}
]> );
tb2.Compile();
}
// В пользовательском коде
[DerivationSample()]
class Test
{
}
В том виде как написано, получим "unbound type name 'MyBase'".
Если №1 закомментировать, то компилируется, но классы кладутся в текущее прострвнство имён, то есть не вариант.
Интересно, что если в №3 использовать не подстановку, а непосредственно имя MyBase, то даже без строки №1 получим ту же ошибку. При этом в №2 можно использовать оба варианта, на ошибки это не влияет. Это мне уже совсем непонятно.