gpt4 book ai didi

java - 将 Java 代码转换为 Eclipse 和 Javac AST 注入(inject)语句

转载 作者:行者123 更新时间:2023-11-30 02:51:04 25 4
gpt4 key购买 nike

我面临以下问题:我需要开发自定义 Lombok 注释处理程序,并且这些处理程序应该将相当复杂的方法注入(inject)到对象中。由于这是一个研究项目,该方法的内容可能会发生变化,我正在寻找一种方法来自动执行一些手动任务。

正如本文 post 中所述创建自定义处理程序过程中最大的痛苦是两次实现两次,一次用于 Eclipse,一次用于 Javac,即添加方法语句的 AST 注入(inject)代码。

所以我的问题如下:是否有任何工具/项目将 Java 文件和想要注入(inject)的方法名称作为输入,并输出将插入此内容的 Java 代码(适用于 Eclipse 和 Javac)方法进入处理程序?

最佳答案

也许您正在以一种不方便的方式处理这件事。根据您所说的,您需要一个工具来插入注释特定的代码,其中注释表示要插入代码。您想要使用 Lombok,因为它使您能够为每个注释编写自定义程序 Hook 来破解 AST。您似乎在提示编写此类钩子(Hook)的不便。

如果您使用 Program Transformation System具有源到源转换的功能,您也许能够以非过程的、易于理解的方式编写这些“钩子(Hook)”。源到源的转换表示如下:

     if you see *thispattern*, replace it by *thatpattern*

(我构建了一个名为 DMS 的程序转换系统,具有这些属性,请参阅我的简介)。用于为标记为日志记录的方法插入调用日志记录的 DMS 源到源转换可能是:

    domain Java~v8;
rule insert_call_logging(p: access_declarations,
t: type,
m: IDENTIFIER,
a: arguments,
s:statements):
method_declaration -> method_declaration
" @LogCalls \p \t \m(\a) { \b } "
-> " \p \t \m(\a) { Log(\tostring\(\m\)); \b } ";

规则 insert_call_logging 识别将元变量 m 绑定(bind)到方法名称的方法,并将方法的其他部分绑定(bind)到其他元变量。 "元引号,并且帮助规则处理器区分Java语法和规则语言语法。

此规则的作用是查找专门注释为 LogCalls 的方法,并将其替换为注释消失的方法,以及使用方法名称的文本字符串进行日志记录调用(\tostring(\m)) 已作为方法主体中的第一个语句插入。

直接表达模式意味着您无需编写大量自定义代码来在语法树中上下爬行检查/更改结构;这在实践中是非常痛苦的,因为你对 AST 的形状了解得太多了。

直接在模式中包含注释信号您不必将自定义代码附加到注释处理器;除非您表达的特定注释存在,否则规则本身不会触发。

此规则可能不够复杂,但如果需要,您可以编写更复杂的规则。这可以使您插入任意复杂的内容,或以任意复杂的方式更改代码结构。

有几个 PTS 能够在不同程度上做到这一点。 (可以说,Lombok 是较弱的一端之一,因为它不进行源到源的转换)。

关于java - 将 Java 代码转换为 Eclipse 和 Javac AST 注入(inject)语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641356/

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