代码之家  ›  专栏  ›  技术社区  ›  Ford O.

如何获取宏类型参数

  •  0
  • Ford O.  · 技术社区  · 6 年前

    我试图实现一个宏,它将生成新类,扩展现有类,作为参数给出:

    def impl[T: c.WeakTypeTag](c: Context)(p: c.Expr[T]): c.Expr[() => T] = {
      val t = weakTypeOf[T]
      q"class Too extends $t {..}; () => new Too()"
    }
    

    但是尝试运行这样的宏会导致:

    [error] Main.scala: exception during macro expansion:
    [error] scala.ScalaReflectionException: object com.foo.MyClass in compiler mirror not found.
    [error]         at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:129)
    [error]         at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:29)
    [error]         at impl(Macro.scala:54)
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Dmytro Mitin    6 年前

    你似乎没有提供足够的信息来重现你的错误。以下代码在2.13中编译时没有错误

    import scala.language.experimental.macros
    import scala.reflect.macros.blackbox
    
    object Macros {
      def too[T](p: T): () => T = macro impl[T]
    
      def impl[T: c.WeakTypeTag](c: blackbox.Context)(p: c.Expr[T]): c.Expr[() => T] = {
        import c.universe._
        val t = weakTypeOf[T]
        c.Expr[() => T](q"class Too extends $t {}; () => new Too()")
      }
    }
    

    核心/src/main/scala/App.scala

    import Macros._
    
    object App {
      class MyClass
    
      too(new MyClass) //App$$$Lambda$3/1967205423@77f03bb1
    
      too(new MyClass)() //App$Too$1@77f03bb1
    }
    
    //Warning:scalac: {
    //  class Too extends App.MyClass {
    //    def <init>() = {
    //      super.<init>();
    //      ()
    //    };
    //    <empty>
    //  };
    //  (() => new Too())
    //}
    
    推荐文章