Помогите с наследованием в генерируемых классах
От: SergASh  
Дата: 28.08.07 19:31
Оценка:
Привет всем!

Пытаюсь из макроса построить два класса, связанных наследованием. В простом случае всё работает, а если класть эти классы в отдельное пространство имён по рецепту Влада, то получаю ошибку
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. Надеюсь, я ещё не всех достал тут своими вопросами. Уж очень хочется разобраться с макросами.
Re: Помогите с наследованием в генерируемых классах
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.07 11:54
Оценка:
Здравствуйте, SergASh, Вы писали:

Где выполняется привденный код?

Подобные вещи нужно делать на стадии MacroPhase.BeforeInheritance. Тогда все (теоретически) должно быть хорошо.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Помогите с наследованием в генерируемых классах
От: SergASh  
Дата: 05.09.07 19:16
Оценка:
Здравствуйте, 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 можно использовать оба варианта, на ошибки это не влияет. Это мне уже совсем непонятно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.