Почему я получаю исключение NullPointerException в экземплярах CompilationUnit, возвращаемых из ASTParser.createASTs () - PullRequest
0 голосов
/ 30 сентября 2011

Я работаю над плагином 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 неправильно - я был бы очень признателен за вашу помощь.

Байрон

1 Ответ

0 голосов
/ 14 октября 2011

Не зная точно, что является вашим исключением, я все еще могу предложить 2 предложения:

  1. Взгляните на org.eclipse.jdt.ui.SharedASTProvider.Если вы не вносите какие-либо изменения в AST, этот класс может предоставить более надежный способ получения AST.
  2. Поэкспериментируйте с некоторыми из используемых вами настроек.Вам действительно нужно, чтобы bindingsRecovery был установлен в true?Как насчет оператораRecovery?Установка их в false может помочь вам.
...