Помогите с макросом
От: kaa_t Россия  
Дата: 06.10.17 02:25
Оценка:
Доброго дня

Написал такой макрос. Все работает если в методах нет return или yield.
Как узнать что в методе используется ключевое слово yield?
Как побороть ошибку error : goto (block return?) is not allowed inside expressions

[MacroUsage(MacroPhase.WithTypedMembers, MacroTargets.Class)]
  macro Flag(typeBuilder : TypeBuilder, params args : array[PExpr])
  {
    FlagImpl.DoTransform(Macros.ImplicitCTX(), typeBuilder, args)
  }
  
  
  
  module FlagImpl
  {
    [ParseParameters]
    class Parameters
    {
      public Name:PExpr;
      public Debug:bool;
      public Property:bool;
      public Include:list[PExpr];
    }
    
    public mcatch DoTransform(typer : Typer, typeBuilder : TypeBuilder, args : array[PExpr]) : void
    {
      Macros.DefineCTX(typer);
      // TODO: Add implementation here.
      _ = typeBuilder; _ = args;
      def context = MacroContext(typer,typeBuilder);
      def par = Parameters(args);
      when(par.Debug) context.Debug =  true;
      
      def name = 
              switch{
                | par.Property => Macros.NewSymbol("flag").ToStr();
                | par.Name != null => par.Name.ToStr()
                | _ => "_flag"
              }
      
      
      <[decl: mutable $(name:usesite):bool = false ]> |> context.DeclareMember;
      
      when(par.Property) {
        def pname = if(par.Name == null) "Flag" else par.Name.ToStr();
        <[decl: public $(pname:usesite):bool { get { $(name:usesite)  } } ]> |> context.DeclareMember;
      }
      
      foreach(m is MethodBuilder in typeBuilder.GetMethods()) 
      {
        when(!m.IsPublic) continue;
        when(m.IsConstructor) continue;
        if( m.ReturnType.TryRequire(<[ttype:void]>) )
        {
          m.Body = locate(m.Body.Location)
          <[
          {
            try { $(name:usesite) = true; $(m.Body)   } finally { $(name:usesite) = false;   }
          }
          ]>
        }
        else
        {
          m.Body = locate(m.Body.Location)
          <[
          {
            mutable result;
            try { $(name:usesite) = true; result = $(m.Body)   } finally { $(name:usesite) = false;   }
            result;
          }
          ]>
        }
      }
    }
  }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.