我的问题听起来有点琐碎;然而,我在谷歌上找不到任何有用的东西。如果我知道一个给定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.
}
}
}
我假设您正在寻找跨越问题源位置的最小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
的调用封装在处理VisitComplete
的try-catch块中。