【问题标题】:Why am I getting NullPointerException in the CompilationUnit instances returned from ASTParser.createASTs()为什么我在从 ASTParser.createASTs() 返回的 CompilationUnit 实例中得到 NullPointerException
【发布时间】:2011-09-29 20:35:31
【问题描述】:

我正在开发一个需要解析大量源文件的 Eclipse JDT 插件, 所以我希望使用批处理方法 ASTParser.createASTs()。解析执行没有错误,但在它生成的 CompilationUnit 实例中,许多org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding 实例的scope 字段设置为null。此设置为 null 发生在 CompilationUnitDeclaration.cleanUp() 方法中,这些方法在与我的插件代码无关的工作线程上调用(即,我的插件的类不会出现在 cleanUp() 方法调用堆栈上)。

我的解析代码是这样的(所有rawSources都在同一个项目中):

ASTParser parser = ASTParser.newParser(AST.JLS3);

parser.setResolveBindings(true);
parser.setStatementsRecovery(true);
parser.setBindingsRecovery(true);
parser.setIgnoreMethodBodies(false);
parser.setProject(project);
parser.createASTs(rawSources.values().toArray(new ICompilationUnit[0]), new String[0], this, deltaAnalyzer.progressMonitor);

或者,我可以这样执行解析,不会出现这样的问题:

for (ICompilationUnit source : rawSources.values())
{
    parser.setResolveBindings(true);
    parser.setStatementsRecovery(true);
    parser.setBindingsRecovery(true);
    parser.setIgnoreMethodBodies(false);
    parser.setProject(project);
    parser.setSource(source);
    CompilationUnit ast = (CompilationUnit)parser.createAST(deltaAnalyzer.progressMonitor);
    parsedSources.add(deltaAnalyzer.createParsedSource(source, ast));
}

Helios 和 Indigo(最新版本)都会出现此问题。我在 Eclipse Bugzilla 中提交了一个错误,但如果有人知道解决此问题的方法——或者我使用的 API 错误——我将非常感谢您的帮助。

拜伦

【问题讨论】:

  • 您提出的 bugzilla 问题是什么?另外,您拥有的堆栈跟踪是什么?
  • 这是错误#359478,它被标记为与#189782 重复。堆栈跟踪位于错误中,该错误作为重复项关闭,但后者保持打开状态。我通过简单地解析我使用绑定的所有 AST 并仅使用 IType 等来解决它。用于图书馆参考。这很慢,但效果很好:-)

标签: eclipse eclipse-jdt compilationunit


【解决方案1】:

在不确切知道您的异常是什么的情况下,我仍然可以提供 2 条建议:

  1. 看看org.eclipse.jdt.ui.SharedASTProvider。如果您不对 AST 进行任何更改,则此类可能会提供一种更可靠的方式来获取 AST。
  2. 尝试使用您正在使用的一些设置。您真的需要将 bindingsRecovery 设置为 true 吗? statementRecovery 呢?将这些设置为 false 可能会对您有所帮助。

【讨论】:

  • 感谢您的回复,虽然我的插件会分析对工作区中已更改源的每个引用,但我需要解析并保留整个工作区的所有 AST。当 delta 包含一些具有阻止分析的语法错误的源,以及一些具有可以分析的正确语法的源时,绑定和语句恢复很有用。我真正想要的是在低级别直接插入编译器并为每个令牌评估做出贡献,但这似乎是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多