Помогите с вложенными макросами
От: Аноним  
Дата: 17.10.12 11:00
Оценка:
Проблема с переходом к новой версии Nemerle на .Net4.0

Есть макрос


  [Nemerle.MacroUsage(
    Nemerle.MacroPhase.BeforeInheritance, 
    Nemerle.MacroTargets.Class
  )]
  public macro Persistent (typeBuilder : TypeBuilder, tableName:string)
  {
      def typer = Nemerle.Macros.ImplicitCTX();
      _ = typer.Manager.CoreEnv;

      def domAssembly = Impl.GetMetaData().DomMetaData;

      def typeName = typeBuilder.Name;
      def tableNameNorm = StringUtils.NormalizeDbName(typeName, tableName);
      def fullName = typeBuilder.NamespaceNode.GetDisplayName();

      domAssembly.SetPersistenceKind(typeName, PersistenceKind.Db);
      domAssembly.SetTableName(typeName, tableNameNorm);
      domAssembly.SetDomFullName(typeName, fullName);

      def modifiers = typeBuilder.GetModifiers();
      modifiers.AddCustomAttribute(<[ Nemerle.Extensions.StructuralHashCode ]>);
      modifiers.AddCustomAttribute(<[ Nemerle.Extensions.StructuralEquality ]>);
  }


При компиляции выдает ошибку error : Can't find EqualsImpl(...). После ковыряния кода старой и новой версии Nemerle нашел интересную особенность. В старой версии StructuralEquality вызывался один метод класса StructuralEquality_type_postaddMacro на фазе WithTypeMembers, все хорошо компилировалось, генерировался код и все хорошо работало. В новой же версии вызывается, на фазе BeforeInheritance, StructuralEquality_type_postscanMacro который подставляет в генерируемый код пустой метод EqualsImpl(...), а на фазе WithTypeMembers, StructuralEquality_type_postaddMacro который переопределяет EqualsImpl(...), а если нет выдает ошибку написанную выше. Так вот не понятно почему на фазе BeforeInheritance макроса Persistent не вызывается StructuralEquality_type_postscanMacro? И как это можно исправить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.