使用 Eclipse AST

6

我最近需要修改一些Java代码(添加方法,更改某些字段的签名和删除方法),我认为可以通过使用Eclipse SDK的AST来完成所有这些。

我知道如何解析源文件,但不知道如何做上述事情。有人知道一个好的教程或者能给我一个简要的解释如何解决这些问题吗?

非常感谢,

ExtremeCoder


编辑:

我现在开始更深入地研究JCodeModel,我认为这可能更容易使用,但我不知道是否可以将现有文档加载到其中?

如果可以,请让我知道;)

再次感谢。

2个回答

4
我不会在此处发布整个问题的源代码,因为它相当长,但我会让人们开始操作。
你需要的所有文档都在这里:http://publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html
Document document = new Document("import java.util.List;\n\nclass X\n{\n\n\tpublic void deleteme()\n\t{\n\t}\n\n}\n");
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(document.get().toCharArray());
CompilationUnit cu = (CompilationUnit)parser.createAST(null);
cu.recordModifications();

这将根据您传递的源代码为您创建一个编译单元。

现在,这是一个简单的函数,它会打印出您传递的类定义中所有方法:

List<AbstractTypeDeclaration> types = cu.types();
for(AbstractTypeDeclaration type : types) {
    if(type.getNodeType() == ASTNode.TYPE_DECLARATION) {
        // Class def found
        List<BodyDeclaration> bodies = type.bodyDeclarations();
        for(BodyDeclaration body : bodies) {
            if(body.getNodeType() == ASTNode.METHOD_DECLARATION) {
                MethodDeclaration method = (MethodDeclaration)body;
                System.out.println("method declaration: ");
                System.out.println("name: " + method.getName().getFullyQualifiedName());
                System.out.println("modifiers: " + method.getModifiers());
                System.out.println("return type: " + method.getReturnType2().toString());
            }
        }
    }
}

这应该能帮助你们入门。

需要一些时间来适应这个(在我这里需要很长时间)。但它确实有效,是我找到的最好的方法。

祝你好运;)

ExtremeCoder


编辑:

在我忘记之前,这些是我用来使其工作的导入项(我花了相当长的时间来组织它们):

org.eclipse.jdt.core_xxxx.jar
org.eclipse.core.resources_xxxx.jar
org.eclipse.core.jobs_xxxx.jar
org.eclipse.core.runtime_xxxx.jar
org.eclipse.core.contenttype_xxxx.jar
org.eclipse.equinox.common_xxxx.jar
org.eclipse.equinox.preferences_xxxx.jar
org.eclipse.osgi_xxxx.jar
org.eclipse.text_xxxx.jar

其中xxxx代表版本号。


1
您可以通过调用API来操作AST(抽象语法树)实现这一点,Eclipse就提供了这样的功能。
或者,您可以应用程序转换来实现您的效果,而不依赖于AST的微观细节。
例如,您可以编写以下程序转换:
add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters
  " \p " -> " \p , int \i";

向参数列表中添加一个任意名称的整数参数。这可以实现与整套API调用相同的效果,但更易读,因为它在您语言的表面语法中(在本例中为Java)。

我们的DMS软件重构工具包可以接受这样的程序转换并将其应用于许多语言,包括Java。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接