Как найти элемент с учетом его исходного положения в Java AST? - PullRequest
1 голос
/ 02 февраля 2012

Мой вопрос звучит немного тривиально; Однако я не смог найти ничего полезного в Google. Итак, можно сказать, есть ли способ получить элемент данного AST, если я знаю его начальную позицию?

Я хочу найти искаженные элементы, которые были помечены как ошибки в модуле компиляции, я уже знаю исходную позицию, вызвав функцию getSourceStart(). Любая идея, ссылка, комментарий с благодарностью.

Код:

    IResource res = delta.getResource();
    if (res instanceof IFile && res.isAccessible()) {
        IJavaElement element = JavaCore.create((IFile)res);
        if (element instanceof ICompilationUnit) {
            ICompilationUnit icu = (ICompilationUnit)element;

            ASTParser parser = ASTParser.newParser(AST.JLS3);
            parser.setKind(ASTParser.K_COMPILATION_UNIT);
            parser.setSource(icu);
            parser.setResolveBindings(true); 
            final CompilationUnit cu = (CompilationUnit) parser.createAST(null);

            IProblem[] problems = cu.getProblems(); 
            for(IProblem problem : problems) {
                String args[] = problem.getArguments();
                int source = problem.getSourceStart();

                //Get Element that is at that point...
                //Should I traverse the AST?

                //Also problem.getArguments() if not null will provide the type of that element, not the name.
            }    
        }
    }

1 Ответ

3 голосов
/ 02 февраля 2012

Я предполагаю, что вы ищете самый маленький узел AST, который охватывает местоположение источника проблемы.Поскольку вы специально рассматриваете проблемы, вы можете обнаружить, что при наличии определенных синтаксических ошибок созданный AST является чрезвычайно дурацким.

Тем не менее, я немного удивлен, что не существует заранее запеченного решения.Вам нужно будет создать свой собственный ASTVisitor.Это будет выглядеть примерно так:

class MyFinder extends ASTVisitor {
  public void postVisit(ASTNode node) {
    if (spansProblemLocation(node)) {
      throw new VisitComplete(node);
    }
  }
}
class VisitComplete extends Throwable {
  ASTNode result;
  ...
}

Поскольку мы переопределяем метод postVisit, мы гарантированно получим наименьший ASTNode в результате.Чтобы использовать этого посетителя, поместите вызов на accept в блок try-catch, который обрабатывает VisitComplete.

...