"调试" scala注释宏

时间:2015-10-21 19:17:25

标签: scala scala-macros

我的一些scala注释宏似乎没有得到扩展,有没有办法检查/记录哪个表达式在编译时传递给我的注释宏 ,因为现在代码没有&# 39;甚至编译...

def virtualize(tree: Tree): Tree = atPos(tree.pos) {
  tree match {
    case x =>
      println("LOG: "+tree) //will only be printed during runtime
      c.warning(tree.pos, "LOG: "+tree) //will only generate code for a warning 
      super.transform(tree)
  }
}

有没有办法在注释宏中发出编译器警告?

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果您使用idea,则打开终端输入sbt ~compile将进行时间编译 然后你可以看到编译信息日志,如终端中的跟随:

D:\git\scala-macro-example>sbt ~compile
[info] Loading project definition from D:\git\scala-macro-example\project
[info] Set current project to scala-macro-example (in build file:/D:/git/scala-macro-example/)
[info] Updating {file:/D:/git/scala-macro-example/}root...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Compiling 2 Scala sources to D:\git\scala-macro-example\module\macros\target\scala-2.11\classes...
[error] D:\git\scala-macro-example\module\macros\src\main\scala\macross\teach\WithHello.scala:16: type ClassWithFunc is not a member of package macross.annotat
ion
[error] class WithHelloImpl(val c: Context) extends macross.annotation.ClassWithFunc{
[error]  

之后

object ShowInfo {
  class Show extends StaticAnnotation {
    def macroTransform(annottees: Any*): Any = macro ShowImpl.apply
  }

  class ShowImpl(val c: Context) {
    import c.universe._
    def showInfo(s: String) =
      c.info(c.enclosingPosition, s.split("\n").mkString("\n |---macro info---\n |", "\n |", ""), true)

    def apply(annottees: c.Expr[Any]*): c.Expr[Any] = {
      val a: Seq[c.universe.Tree] = annottees.map(_.tree)
      showInfo(show(a.head))
      c.Expr[Any](Block(a.toList, Literal(Constant(()))))
    }
  }
}

使用如下:

object ShowInfoUsing {
  trait SuperTrait
  class SuperClass

    @ShowInfo.Show
  class ShowInfoUsing(val i: Int = 1) extends SuperClass with SuperTrait {
    def f = 1

    val a = 1
  }


}

您可以在终端中看到信息徽标

[info]  |---macro info---
[info]  |class ShowInfoUsing extends SuperClass with SuperTrait {
[info]  |  <paramaccessor> val i: Int = _;
[info]  |  def <init>(i: Int = 1) = {
[info]  |    super.<init>();
[info]  |    ()
[info]  |  };
[info]  |  def f = 1;
[info]  |  val a = 1
[info]  |}
[info]     @ShowInfo.Show
[info]