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 错误——我将非常感谢您的帮助。

拜伦

4

1 回答 1

0

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

  1. 看看org.eclipse.jdt.ui.SharedASTProvider。如果您没有对 AST 进行任何更改,则此类可能会提供一种更强大的获取 AST 的方法。
  2. 尝试使用您正在使用的一些设置。您真的需要将 bindingsRecovery 设置为 true 吗?statementRecovery 呢?将这些设置为 false 可能会对您有所帮助。
于 2011-10-14T16:39:55.617 回答