Scala 如何调试Intellij中的宏注释

Scala 如何调试Intellij中的宏注释,scala,intellij-idea,scala-macros,Scala,Intellij Idea,Scala Macros,在Intellij中调试普通宏与Jan Machacek一样工作正常 但是对于宏注释,我还没有找到在进程完成之前调试宏的方法。我在Intellij中尝试了各种设置,但运气不佳 下面是要调试的def和注释宏: package demo import scala.language.experimental.macros import scala.reflect.macros.Context import scala.annotation.StaticAnnotation class myAnnot

在Intellij中调试普通宏与Jan Machacek一样工作正常

但是对于宏注释,我还没有找到在进程完成之前调试宏的方法。我在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)))
  }
}
我在Intellij中的运行/调试配置:

  • 类型:应用
  • 主类:scala.tools.nsc.Main
  • VM选项:-Dscala.usejavacp=true
  • 程序参数:-cp demo.Test mymodule/src/Test/scala/demo/testdebug.scala
  • 工作目录:/Users/mg/project/testmacrodebug
  • 环境变量:[无]
  • 使用模块的类路径:mymodule
  • 发射前:制造
作为程序参数,我也尝试了

  • -cp demo.myAnnotation mymodule/src/test/scala/demo/testdebug.scala
所以,我基本上对Intellij说,我想在运行
testdebug.scala
时调试
demo.Test
,对吗?但是当我在
transformAnnottees
debug\u impl
中设置断点时,我只能调试后者

我在make期间看到“注释宏”和“普通宏”打印,因此注释显然在工作。调试注释宏
transformAnnottees
时我缺少什么

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

编辑:

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

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

测试
对象内部?这只是出于测试目的,在不调试时可以注释掉。我找不到在注释发送时提供等效参数的方法(ClassDef)。。。有没有办法让这个笨拙的黑客工作或更好;避免它?

宏paradise插件是否添加到正在调试的编译器实例的类路径中?如果没有激活的paradise,宏注释将不会扩展。我想是的-我如何验证这一点?我试着调试你的程序。首先,我必须将编译器添加到要在调试器设置中看到的scala.tools.nsc.Main的宏项目中。但它仍然不允许我在调试会话中进入宏。这个过程刚刚结束。你能验证一下你能用它的设置调试你的例子吗?感谢您的帮助和所有出色的宏工作!更准确地说:我必须将编译器添加到
项目中,以使scala.tools.nsc.Main位于调试器设置中
核心
模块的类路径上。但我仍然无法在调试会话中进入helloMacro。很抱歉回答得太晚。能否尝试将
-Xplugin:-Xplugin require:macroparadise
添加到调试配置中的程序参数中?
def macroTransform2(annottees: Any*): Any = macro transform