如何在Intellij中调试宏注释

时间:2014-01-12 18:53:30

标签: intellij-idea scala-macros

调试Intellij中的普通宏可以像Jan Machacek explained here一样正常工作。

但是使用宏注释我还没有找到在进程完成之前调试宏的方法。我在Intellij尝试了各种设置而没有运气。

这是一个要调试的def和注释宏:

package demo
import scala.language.experimental.macros
import scala.reflect.macros.Context
import scala.annotation.StaticAnnotation

class myAnnotation extends StaticAnnotation {
  def macroTransform(annottees: Any*) = macro Test.transformAnnottees
}

object Test {

  def transformAnnottees(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
    println("Annotation macro")  // <-- breakpoint here not reached
    c.Expr[Any](annottees.head.tree) // dummy
  }

  def debug[A]: String = macro Test.debug_impl[A]

  def debug_impl[A: c.WeakTypeTag](c: Context): c.Expr[String] = {
    import c.universe._
    println("Normal macro")  // <-- breakpoint here reached
    c.Expr[String](Literal(Constant(weakTypeOf[A].toString)))
  }
}

跑步者:

package demo

object TestDebugging extends App {

  @myAnnotation
  class A

  val a = new A

  println(Test.debug[A]) // "demo.TestDebugging.A"
}

Intellij中的我的运行/调试配置:

  • 类型:申请
  • 主要课程:scala.tools.nsc.Main
  • VM选项:-Dscala.usejavacp = true
  • 程序参数:-cp demo.Test mymodule / src / test / scala / demo / TestDebugging.scala
  • 工作目录:/ Users / mg / project / testMacroDebugging
  • 环境变量:[无]
  • 使用模块的类路径:mymodule
  • 发布前:制作

作为程序参数,我也试过

  • -cp demo.myAnnotation mymodule / src / test / scala / demo / TestDebugging.scala

所以,我基本上对Intellij说我想在运行demo.Test时调试TestDebugging.scala,对吧?但是当我在transformAnnotteesdebug_impl中设置断点时,我只能调试后者。

我在make期间看到“Annotation macro”和“Normal macro”打印,因此注释显然有效。调试注释宏transformAnnottees我缺少什么?

(使用Intellij 12.1.6,build 129.1359,JRE 1.6.0_65)

修改

作为通过注释调用注释类中macroTransform的调试替代方法,那么如果改为称为普通def方法,我可以访问正常的调试流程

def macroTransform2(annottees: Any*): Any = macro transform

Test对象里面?这只是为了测试目的,可以在不调试时注释掉。我找不到一种方法来提供等价的参数,因为注释发送(ClassDef)...有没有办法让这个笨拙的黑客工作或更好;避免它?

0 个答案:

没有答案