调试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中的我的运行/调试配置:
作为程序参数,我也试过
所以,我基本上对Intellij说我想在运行demo.Test
时调试TestDebugging.scala
,对吧?但是当我在transformAnnottees
和debug_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)...有没有办法让这个笨拙的黑客工作或更好;避免它?