如何编译编译器阶段的输出?

How to compile output of a compiler phase?

scalac 中使用 -Xprint 标志,我们得到不同 compiler phases 的输出,例如给出以下 Foo.scala

object Foo {
  val x = 42
}

然后scalac -Xprint:jvm Foo.scala输出

package <empty> {
  object Foo extends Object {
    <static> private[this] val x: Int = _;
    <stable> <accessor> def x(): Int = Foo.this.x;
    def <init>(): Foo.type = {
      Foo.super.<init>();
      Foo.this.x = 42;
      ()
    }
  }
}

如何编译阶段本身,也就是说,假设我们有这样的源文件jvmphase.scala

package <empty> { ...

包含阶段源代码而不是原始的 vanilla Scala 源代码,那么如何实现类似于 scalac jvmphase.scala 的东西?

"compiling output of a compiler phase" 听起来很奇怪。从字面上看,编译器编译源文件。编译器阶段的输出不再是源(尽管 scalac -Xprint:... 试图以类似的方式打印它)。例如 jvm 阶段在 erasure 阶段之后。 "compiling output of a compiler phase" 除了原始来源的编译结果之外,您还不清楚您希望得到什么。

如果您想在阶段之间进行更改,也许您应该创建编译器插件。

https://docs.scala-lang.org/overviews/plugins/index.html

https://dotty.epfl.ch/docs/reference/changed-features/compiler-plugins.html