【问题标题】:obtaining the source of a case class's automatically generated methods获取案例类自动生成方法的来源
【发布时间】:2015-04-24 23:42:18
【问题描述】:

如何获得一个案例类的所有自动生成方法的代码,以便在重构为常规(非案例)类时干净地保留其中的任何一个?是否有一些编译标志可以显示案例类的自动生成方法,或其他方式,最终将其减少为剪切和粘贴?

我一直认为有编译标志可以显示自动扩展的定义....

【问题讨论】:

  • 有什么特别的原因必须重构为非案例类吗?
  • 如果您出于继承相关的原因这样做,您可能会在stackoverflow.com/questions/12705309/…中找到一些有用的想法
  • 确实出于继承等原因

标签: scala scalac scala-compiler


【解决方案1】:

您可以使用-Xprint:<phase> 标志查看编译器将源代码脱糖的内容。对于您的示例(查看为案例类生成了哪些代码),运行:

scalac -Xprint:typer YourScala.sca

使用-Xshow-phases 标志,您将看到所有可用阶段。

但是你看到的输出不是可编译的scala源代码,而是一些中间表示。

【讨论】:

  • 你能在 sbt 内的新 repl 中临时获得它吗?像 scalacOptions := Seq("-Xprint:typer"), 这样的东西应该在 Build.scala 中工作吗?
【解决方案2】:

这可能没那么容易。

编译器生成字节码,因此无法复制编译器输出并粘贴到源代码中。

您可以阅读生成的字节码并手动为类似方法重新创建 Scala 代码。这会有点费力,但方法相对简单,理解字节码是一件好事。

如果某处有可用的 Scala 反编译器,那么反编译已编译的案例类将显示您想要的代码。

鉴于方法依赖于案例类的字段,它们不太可能在编译器实现中可用,因为任何可以复制和粘贴的东西。

也许最好的办法是查看语言规范并实现为案例类描述的方法。

【讨论】:

  • 编译器还会生成中间代码工件。
  • 你的意思是,像 AST?这是真的,但它有帮助吗?
猜你喜欢
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2011-10-23
  • 2018-03-16
  • 1970-01-01
相关资源
最近更新 更多