gpt4 book ai didi

scala - 如何在 Scala 编译器插件中以文本形式生成新的源代码?

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

我刚刚完成了 Java 6 编译器插件的第一个版本,它会根据注解自动生成包装器(代理、适配器、委托(delegate),随你喜欢)。

由于我正在做混合 Java/Scala 项目,我希望能够在我的 Scala 代码中使用相同的注释,并获得相同的生成代码(当然在 Scala 中除外)。这基本上意味着从头开始。

我想做的(但我还没有找到示例)是如何以与 Java 编译器插件相同的方式在 Scala 编译器插件中生成代码。也就是说,我匹配/查找使用注释的位置,获取注释接口(interface)的 AST,然后要求 API 给我一个 Stream/Writer,我在其中使用字符串操作输出生成的 Scala 源代码。

最后一部分是我找不到的。那么我如何告诉 API 创建一个新的 Scala 源文件,并给我一个 Stream/Writer/File/Handle,这样我就可以在其中写入,当我完成后,Scala 编译器会在调用插件的同一运行?

我为什么要这样做?首先,因为两个插件的结构相同,所以维护很容易。其次,我想开源它,但没有办法支持任何人想要的每一个选项,所以我希望潜在用户希望用他们自己的代码来扩展这一代。如果他们只需要做一些 printf(),而不是学习 AST API(这也适用于我),这对他们来说会容易得多。

最佳答案

简短回答:

做不到

长答案:

您可以想象生成源文件并通过插件中的解析器实例推送它。但绝不可能对您有任何用处,因为您现在有一个更大的问题需要解决:

为了获取用于生成委托(delegate)/代理的所有类型/名称信息,您必须在经过命名器和类型器阶段(不可分割)后获取带注释的类型的 AST。问题是,任何调用您生成的代码的尝试都已经失败了类型检查,编译器将抛出一个错误,并且任何进一步的赌注都被取消了。

方法合成在有限的情况下是可能的,只要你能以某种方式欺骗类型检查器足够长的时间来生成你的代码,这是我用我的 Autoproxy 'lite' plugin 使用的技巧。 .即便如此,使用 TreeDSL 会更好。生成代码而不是抽出原始源代码。

关于scala - 如何在 Scala 编译器插件中以文本形式生成新的源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625765/

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