将Java代码转换为Eclipse和Javac AST注入语句

时间:2016-07-28 15:57:58

标签: java reflection abstract-syntax-tree lombok

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

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

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

2 个答案:

答案 0 :(得分:1)

也许你会以一种不方便的方式解决这个问题。根据您的意思,您需要一个工具,可以在注释表示插入代码的地方插入特定于注释的代码。你想使用Lombok,因为它使你能够为每个注释编写自定义程序钩子来破解AST。你似乎在抱怨写这种钩子的不便。

如果您使用具有源到源转换的Program Transformation System,您可能能够以非程序化,易于理解的方式对这些“钩子”进行编码。源到源变换的表达方式如下:

     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 绑定到方法名称的方法,并将方法的其他部分绑定到其他元变量。 metaquotes 和帮助 规则处理器将Java语法与规则语言语法区分开来。

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

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

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

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

有几个PTS可以在不同程度上做到这一点。 (可以说,龙目岛是其中一个弱端,因为它不进行源到源的转换)。

答案 1 :(得分:1)

您可以查看实验性lombok.ast项目。

它还有一个模板解析器,你可以用其他任何东西替换特殊节点。

这是实验性的,并没有很多关于如何使用它的文档。 github项目的所有者可能能够帮助您。

披露:我是一名lombok开发者。