当前位置: 首页 > 面试题库 >

VariableDeclarationFragment节点resolveBindind()在eclipse / jdt / ast中返回null

归松
2023-03-14
问题内容

我试图尝试月食JDT / AST下面这个文章。

这是java代码作为输入:

class Hello
{
    int hello()
    {
        int a = 0, b = 3;
        /* hello */
        {
            b = a * 3;
        }
        return a;
    }
    public static void main(String[] args)
    {   
        int z = 0, i = 3;
        /* hello */
        {
            i = z * 3;
        }
    }
}

使用ASTView,它显示VariableDeclarationFragment具有相应的绑定。

但是,在此的访客代码中VariableDeclarationFragmentnode,我总是将4个局部变量(a,b,z,i)的空值作为resolveBinding()返回值。

这怎么了 我用日食靛蓝。

这是获取AST的代码

private static CompilationUnit createCompilationUnit(String sourceFile) {
    String source = readWithStringBuilder(sourceFile);
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(source.toCharArray()); // set source
    parser.setResolveBindings(true); // we need bindings later on
    return (CompilationUnit) parser.createAST(null /* IProgressMonitor */); // parse
}

问题答案:

发生这种情况的原因是来自setResolveBindings文档的以下内容:

绑定信息是从Java模型获得的。这意味着
编译单元必须相对于Java模型位于。
当源代码来自
setSource(ICompilationUnit)或setSource(IClassFile)时,这将自动发生。当
setSource(char [])提供源时,必须
通过使用setProject(IJavaProject)或
setEnvironment(String [],String [],String [],boolean)和单元名称
setUnitName()设置环境来显式地建立位置。字符串)。请注意,影响文档注释
检查的编译器选项也可能会影响是否为
文档注释内的节点解析了任何绑定。


这意味着您可以使用类似的东西(通过链接):

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject("someJavaProject");
project.open(null /* IProgressMonitor */);

IJavaProject javaProject = JavaCore.create(project);

and add the setProject call:

private static CompilationUnit createCompilationUnit(String sourceFile,
        IJavaProject javaProject) {
    String source = readWithStringBuilder(sourceFile);
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(source.toCharArray()); // set source
    parser.setProject(javaProject);
    parser.setResolveBindings(true); // we need bindings later on
    return (CompilationUnit) parser.createAST(null /* IProgressMonitor */); // parse
}

The second approach (without setProject):

private static CompilationUnit createCompilationUnit(String sourceFile,
        String unitName) {
    String source = readWithStringBuilder(sourceFile);
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(source.toCharArray()); // set source
    String[] classpathEntries = ...;
    String[] sourcepathEntries = ...;
    parser.setEnvironment(classpathEntries, sourcepathEntries, null, true);
    parser.setUnitName(unitName);
    parser.setResolveBindings(true);
    // optional
    // parser.setBindingsRecovery(true);
    return (CompilationUnit) parser.createAST(null /* IProgressMonitor */); // parse
}


 类似资料:
  • ASTParser.setSource有不同输入类型的多态方法。 但是,当我使用作为setSource方法的输入时, 我得到一个错误,说我没有使用char[]作为输入参数。 为什么会出现这个错误? 我使用日食 jdt/ast 作为独立 Java 程序的一部分。在此过程中,我不会使用日食项目/资源,而是将 java 源代码作为 setSource() 的参数加载到 char[] 中。我不确定,但ec

  • 我可以将EclipseJava开发工具作为独立进程执行吗?我需要使用另一个程序的Eclipse JDT获取Java程序的AST结构,为此,我需要在后台将eclipse插件作为独立进程执行。 这可能吗?如果可能,怎么能做到呢?

  • 我正在使用日食JDT AST来解析给定的Java源代码。在解析代码时,当它遇到方法调用时,我想找出该特定方法是否返回或设置实例变量的值(基本上是为了找出被调用方方法是否是同一类调用方方法的获取器/设置器)。 例如: 我使用了AST插件,也找到了一个可能的路径,可以帮助我从API中引用它,但不能。请告诉我这是否可能,如果可能,哪种方法可以帮助我获取所需的信息。

  • 问题内容: 有什么方法可以追溯到Eclipse吗?基本上,当我按照执行流程(Ctrl +单击等)在一个大项目中跳来跳去时,有没有办法追溯步骤?如果我的代码调用一个方法,然后转到方法定义,是否有组合键可以将我带回到调用代码? 问题答案: 像在网络浏览器中一样按+ 和+ 。

  • 我正在Android应用程序中创建一个项目。我已经在java eclipse环境中将java jdt ast作为独立应用程序实现了,并且我在控制台输出上得到了我需要的东西。现在我想把这个代码运行到我的Android应用程序项目中。但是,当我在文本中设置所有输出时,当我启动应用程序时,Android的视图,不幸的是它停止了,我不知道为什么...有人会知道为什么会发生这种情况吗?感谢您的帮助。 代码没