为什么我在从 ASTParser.createASTs() 返回的 CompilationUnit 实例中收到 NullPointerException

发布于 2024-12-07 10:30:45 字数 1414 浏览 2 评论 0原文

我正在开发一个 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——我将非常感谢您的帮助。

拜伦

I am working on an Eclipse JDT plugin that requires parsing large numbers of source files,
so I am hoping to use the batch method ASTParser.createASTs(). The parsing executes without errors, but within the CompilationUnit instances it produces, many of the org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding instances have had their scope field set to null. This setting to null is occurring in the CompilationUnitDeclaration.cleanUp() methods, which are invoked on a worker thread that is unrelated to my plugin's code (i.e., my plugin's classes do not appear on the cleanUp() method call stack).

My parsing code looks like this (all rawSources are within the same project):

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);

Alternatively, I can execute the parsing this way, and no such problems occur:

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));
}

This issue occurs in both Helios and Indigo (the very latest release build). I filed a bug in Eclipse Bugzilla, but if anyone knows of a way to work around this--or if I am using the API wrong--I would greatly appreciate your help.

Byron

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦开始←不甜 2024-12-14 10:30:45

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

  1. 看看 org.eclipse.jdt.ui.SharedASTProvider。如果您不对 AST 进行任何更改,此类可能会提供更可靠的获取 AST 的方法。
  2. 尝试一下您正在使用的一些设置。您真的需要将 BindingsRecovery 设置为 true 吗?声明恢复怎么样?将这些设置为 false 可能会对您有所帮助。

Without knowing exactly what your exception is, I can still offer 2 suggestions:

  1. Have a look at org.eclipse.jdt.ui.SharedASTProvider. If you are not making any changes to ASTs, this class may provide a more robust way of getting the ASTs.
  2. Play around with some of the settings that you are using. Do you really need bindingsRecovery set to true? What about statementRecovery? Setting these to false may help you.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文