gpt4 book ai didi

scala - 从 Scala 编译器插件生成 Scala 代码树

转载 作者:行者123 更新时间:2023-12-04 12:14:57 27 4
gpt4 key购买 nike

few resources在网络上,在编写与代码模式匹配的 Scala 编译器插件方面很有指导意义,但这些对生成代码(构建符号树)没有帮助。我应该从哪里开始弄清楚如何做到这一点? (如果有比手动构建符号树更简单的方法,我也会感兴趣。)

例如,我想编写一个插件,用一个简单的 AST 替换这个表达式的一些代码,其中变量(从原始程序代码中提取)可以是任何类型:

"" + hello + ", " + world + "!"

我意识到这可能很棘手,因为拳击和 toString ,例如如果 hello是一个对象和 world是一个整数,这真的应该是
就像是:
"".+(hello.toString().+(", ".+(new Integer(world).toString().+("!"))))

最佳答案

如果在 erasure 之前生成树编译阶段,你可以输入helloworldAny ,并调用 toString在他们。

 ~: cat test.scala 
object test {
def f(hello: Any, world: Any) = "" + hello + ", " + world + "!"
f("1", "2")
f(1, 1)
}
~: scalac -Xprint:typer test.scala
[[syntax trees at end of typer]]// Scala source: test.scala
package <empty> {
final object test extends java.lang.Object with ScalaObject {
def this(): object test = {
test.super.this();
()
};
def f(hello: Any, world: Any): java.lang.String = "".+(hello).+(", ").+(world).+("!");
test.this.f("1", "2");
test.this.f(1, 1)
}
}

~: scalac -Xprint:erasure test.scala
[[syntax trees at end of erasure]]// Scala source: test.scala
package <empty> {
final class test extends java.lang.Object with ScalaObject {
def this(): object test = {
test.super.this();
()
};
def f(hello: java.lang.Object, world: java.lang.Object): java.lang.String = "".+(hello).+(", ").+(world).+("!");
test.this.f("1", "2");
test.this.f(scala.Int.box(1), scala.Int.box(1))
}
}

关于scala - 从 Scala 编译器插件生成 Scala 代码树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2249642/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com