解析java源文件,然后使用ANTLR4修改原始源

时间:2013-05-22 09:50:43

标签: java antlr antlr4

我是ANTLR的新手。 我的目标是将我们的代码库升级到Hibernate 4,新版本已经弃用了“HibernateCallback”类。 我们有一个巨大的代码库,有数千个对已弃用的类的引用。 这就是我的想法: 1.阅读Java源文件 2.每当我们遇到以下代码时:

getDao().execute(new HibernateCallback() {
                        public Object doInHibernate(Session session)
                                        throws HibernateException {
                                //Some code;
                        }
                });

3.在此代码之前,我想插入另一行,如下所示:

session.doWork(new Work(){
        @Override
        public void execute(Connection conx) throws SQLException {
         //Some code from the previous pattern
        }
});

我有一个工作示例 - 但它打印到stdout,我实际上想修改antlr解析器正在读取的java文件。

我在“ExtractInterfaceTool”一书中提到的示例 - 用于从java类中提取java接口。

如果这个问题已经得到解答,那么请接受我的道歉 - 并请我指出正确的方向。

2 个答案:

答案 0 :(得分:0)

ANTLR 4目前没有任何自动源转换功能,至少在核心运行时没有。当我为ANTLRWorks 2(在编辑时使用ANTLR解析源文件)实现一个小的重构操作时,我使用来自解析树的信息来识别 where 以插入附加代码,但是实际插入过程是我必须自己编写的代码。

答案 1 :(得分:0)

我认为源解析不会让你走得太远。相反,我使用IntelliJ Idea作为IDE并执行结构替换(在AST上搜索/替换)。这个机制在这里解释: Structural Search and Replace: What, Why, and How-to

这种机制并不容易理解,但我想它看起来像这样:

$dao$().execute(new HibernateCallback() {
                        public Object doInHibernate(Session session)
                                        throws HibernateException {
                                $method_body$
                        }
                });

替换将是:

$session$.doWork(new Work(){
        @Override
        public void execute(Connection conx) throws SQLException {
            $method_body$
        }
});

您需要修改单个模板变量的设置,但机制非常强大。一个巨大的优点是它不依赖于精确的拼写或参数类型,但允许使用通配符类型,方法签名模式等。