我刚刚完成了 Java 6 编译器插件的第一个版本,它根据注释自动生成包装器(代理、适配器、委托,您可以随意称呼它)。
由于我正在进行 Java/Scala 混合项目,因此我希望能够在 Scala 代码中使用相同的注释,并获得相同的生成代码(当然 Scala 中除外)。这基本上意味着从头开始。
我想做的是如何以与 Java 编译器插件中相同的方式在 Scala 编译器插件中生成代码,但我还没有找到示例。也就是说,我匹配/查找使用我的注释的位置,获取带注释的接口的 AST,然后要求 API 给我一个 Stream/Writer,我可以在其中使用字符串操作输出生成的 Scala 源代码.
最后一部分是我找不到的。那么我如何告诉 API 创建一个新的 Scala 源文件,并给我一个 Stream/Writer/File/Handle,这样我就可以在其中写入,完成后,Scala 编译器会在调用插件的同一运行?
我为什么要这么做?首先,因为两个插件具有相同的结构,所以维护很容易。其次,我想开源它,但没有办法支持任何人想要的每个选项,所以我希望潜在用户希望用自己的代码来扩展这一代。如果他们只需要执行一些 printf(),而不是学习 AST API(这也适用于我),这对他们来说会容易得多。
简短回答:
这是不可能的
长答案:
您可以想象生成源文件并将其通过插件中的解析器实例推送。但这对你来说可能没有任何用处,因为你现在有一个更大的问题需要应对:
为了获取用于生成 delagate/proxy 的所有类型/名称信息,您必须在运行完 namer 和 typer 阶段(这是不可分割的)后获取带注释类型的 AST。问题是,任何调用生成代码的尝试都将无法进行类型检查,编译器将抛出错误,并且任何进一步的赌注都将被取消。
方法综合is在有限的情况下是可能的,只要你能以某种方式欺骗类型检查器足够长的时间来生成你的代码,这就是我用我的技巧Autoproxy“精简版”插件 https://github.com/kevinwright/Autoproxy-Lite。即便如此,与您一起工作也会更好TreeDSL
生成代码而不是提取原始源代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)