Eclipse AST变量绑定在独立的Java应用程序上

时间:2012-11-19 12:26:44

标签: java code-analysis abstract-syntax-tree eclipse-jdt

我正在尝试使用Eclipse ASTParser来分析,如果可能的话,还要为某些类添加一些代码。我需要的信息之一需要绑定,但因为这是一个独立的项目(最终目标是一个独立于eclipse的命令行工具)我不能拥有它们(requireBinding()返回null )。

在阅读了很多帖子之后,我能走的最远的就是使用this examples来使用FileASTRequestor,但这不是要走的路,因为在我看来我们必须给出在生成AST树之前绑定的键。

我找到了一个可以使用ASTParser.setEnvironment方法的地方,以便在独立的Java应用程序中使用绑定,但我认为我没有正确地做到这一点。下面的代码出了什么问题?

private static final String rootDir = "D:\\workspace\\stateless\\";
    private static final String[] classpath = java.lang.System.getProperty( "java.class.path" ).split(";");

    private static final String source = 
            "package de.siemens.tools.stateless.test.examples; " +
            "public class ClassWithFinalMemberVariables {" +
            "private final int _memberIntVariable = 0;" +
            "public void method() {" +
            "int localVariable = 0;" +
            "System.out.println(_memberIntVariable + localVariable);" +
            "}" +
            "}";

    public static void main(String[] args) throws CoreException {

        Document document = new Document(source);
        ASTParser parser = ASTParser.newParser(AST.JLS4);
        parser.setKind(ASTParser.K_COMPILATION_UNIT);
        parser.setEnvironment(classpath, new String[] { rootDir }, 
new String[] { "UTF8" }, true);  
        parser.setSource(document.get().toCharArray());
        parser.setResolveBindings(true);
        parser.setBindingsRecovery(true);
        CompilationUnit unit = (CompilationUnit)parser.createAST(null);

        unit.recordModifications();

        unit.accept(new ASTVisitor() {

@Override
            public void endVisit(VariableDeclarationFragment node) {

                IVariableBinding bind = node.resolveBinding();

                if(bind == null) 
                   System.out.println("ERROR: bind is null");

                super.endVisit(node);
            }

输出始终为“ERROR: bind is null”。

1 个答案:

答案 0 :(得分:3)

我已经解决了,代码在这里: http://pasteit.com/19433

尽管我更喜欢ASTVisitor模型,但这个模型给了我所有可用的绑定。

以下是关于这个问题的讨论,对于那些好奇的人:https://bugs.eclipse.org/bugs/show_bug.cgi?id=206391

编辑:我不知道这是否是最好的解决方案,如果您有任何建议请告诉我