使用Intellij调试Scala宏

使用Intellij调试Scala宏,scala,macros,intellij-idea,Scala,Macros,Intellij Idea,我有一个sbt项目,我运行“gen idea”进行设置,以使用Intellij 12.4。一个项目中有我的主代码,另一个项目中有我的宏代码。尝试通过测试文件调试宏时,请执行以下操作: error: scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler mirror not found. at scala.reflect.internal.MissingRequirementError$.s

我有一个sbt项目,我运行“gen idea”进行设置,以使用Intellij 12.4。一个项目中有我的主代码,另一个项目中有我的宏代码。尝试通过测试文件调试宏时,请执行以下操作:

error: scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler mirror not found.
at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16)
at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61)
at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172)
at scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:181)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:181)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:182)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass(Definitions.scala:182)
at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr$lzycompute(Definitions.scala:1015)
at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1014)
at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses$lzycompute(Definitions.scala:1144)
at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses(Definitions.scala:1143)
at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode$lzycompute(Definitions.scala:1187)
at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode(Definitions.scala:1187)
at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1252)
at scala.tools.nsc.Global$Run.<init>(Global.scala:1290)
at scala.tools.nsc.Driver.doCompile(Driver.scala:32)
at scala.tools.nsc.Main$.doCompile(Main.scala:79)
at scala.tools.nsc.Driver.process(Driver.scala:54)
at scala.tools.nsc.Driver.main(Driver.scala:67)
at scala.tools.nsc.Main.main(Main.scala)
错误:在编译器镜像中找不到scala.reflect.internal.MissingRequirementError:对象scala.runtime。
在scala.reflect.internal.MissingRequirementError$.signal处(MissingRequirementError.scala:16)
在scala.reflect.internal.MissingRequirementError$.notFound处(MissingRequirementError.scala:17)
位于scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
位于scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40)
位于scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61)
位于scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172)
位于scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175)
位于scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:181)
位于scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:181)
位于scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:182)
位于scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass(Definitions.scala:182)
位于scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr$lzycompute(Definitions.scala:1015)
位于scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1014)
位于scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses$lzycompute(Definitions.scala:1144)
位于scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses(Definitions.scala:1143)
在scala.reflect.internal.Definitions$DefinitionsClass.symbols不存在字节码$lzycompute(Definitions.scala:1187)
在scala.reflect.internal.Definitions$DefinitionsClass.symbols不存在字节码(Definitions.scala:1187)
位于scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1252)
位于scala.tools.nsc.Global$Run。(Global.scala:1290)
位于scala.tools.nsc.Driver.docomfile(Driver.scala:32)
位于scala.tools.nsc.Main$.docomfile(Main.scala:79)
位于scala.tools.nsc.Driver.process(Driver.scala:54)
位于scala.tools.nsc.Driver.main(Driver.scala:67)
位于scala.tools.nsc.Main.Main(Main.scala)

我已经检查了以确保在我的类路径中包含了来自SCALA_HOME/lib/的所有JAR,并且它们是正确的。顺便说一句,Scala v2.10.2就是这样,正如我们在#Scala上发现的那样,文档缺少一个事实,即需要为调用scalac的JVM命令提供
-Dscala.usejavacp=true
参数。在那之后,一切正常,我更新了文档:。

关于设置IntelliJ调试Scala宏的逐步说明:

  • 首先,您需要有一个单元测试来测试宏。假设此单元测试是project
    Macro
    中的
    MacroSpec.scala
    ,它包含一个测试类
    MacroSpec
    。假设您的项目有包名
    com.example.project

  • “运行/编辑配置…”-您需要在“应用程序”下添加新配置。将此配置称为“宏调试器”

  • 在配置上设置各种选项

    • 主类:
      scala.tools.nsc.Main
      ——这是编译器的主类。(您将调试运行宏的编译器过程。)
    • VM选项:
      -Dscala.usejavacp=true
    • 程序参数:这是一条很长的线,
      -cp com.example.project.MacroSpec/home/YourUserName/path/to/your/project/src/test/scala/com/example/project/MacroSpec.scala
      您将需要根据实际路径和包名编辑此文件
    • 工作目录:
      /home/YourUserName/path/to/your project
      。您将需要编辑此文件
    • 环境变量:您可以将其留空
    • 使用模块的类路径:
      -这必须是IntelliJ项目中包含宏代码及其依赖项的模块
    • 启动前:“进行,无错误检查”。如果测试代码中有错误,这会有所帮助-宏仍将运行。(在某些情况下,您可能希望故意引入错误,并在错误代码上调试宏。)
    • 按OK。保存此配置
  • 在项目的
    build.sbt
    build.scala
    中,确保
    模块具有以下依赖项:
    “org.scala lang”%”scala编译器“%scalaVersion.value%”test“
    。在这里,您可能需要检查是否声明了
    scalaVersion
    “test”
    选项用于避免将scala编译器JAR捆绑到最终的应用程序JAR中

  • 转到宏代码并设置断点。然后运行“宏调试器”。应该在断点处停止


  • 我只想提醒未来的读者,也可以在调试模式下启动sbt,然后远程连接idea调试器

    • 使用以下命令启动sbt:
      sbt-jvm调试5005
    • 在idea中创建“远程”“运行/调试配置”(默认为端口
      5005
    在idea中运行远程调试配置。这将连接到您的跑步sbt。然后可以在宏代码中设置断点,当在sbt中运行
    compile
    时,idea应该在断点处停止


    注意:要在成功编译后重新运行
    compile
    ,您需要
    clean
    或更改一些代码

    能否详细说明如何运行调试会话?您使用Intellij的调试运行程序还是远程调试器?我遵循了您提到的所有步骤,但收到一个错误,说明找不到我的主类。我认为这已停止使用Intellij的最新版本。将前面的答案与