0
我怎样才能得到org.eclipse.jdt.core.dom.Statement
在给定的行号?如何获得给定行号的所有JDT AST语句?
假设我有这个类:
1 package foo;
2 public class Operations {
3 public static int calc(int a, int b) {
4 if (a >= b)
5 return a - b;
6 if (a<b || b==2)
7 return -1;
8 return 0;
9 }
10 }
这是我所期望的:
- 3号线 - >
BlockStatement
- 4号线 - >
IfStatement
- 5号线 - >
ReturnStatement
这段代码有效,但它有点笨重,因为每个主体和声明都必须在精心设计的案例中访问。有没有更好/更简单的方法来做到这一点?
List<Statement> getStatementsAtLine(final CompilationUnit cu, final int lineNumber) {
final List<Statement> result = new ArrayList<Statement>();
cu.accept(new ASTVisitor() {
@Override
public boolean visit(MethodDeclaration node) {
Block body = node.getBody();
for (Statement s : (List<Statement>) body.statements()) {
int l=cu.getLineNumber(s.getStartPosition());
if (l==lineNumber){
result.add(s);
}
}
return true;
}
});
return result;
}
我试过你的解决方案,它不会返回给定行的语句,而是返回当前范围中所有行的整个块。如果我为'IfStatement'使用'cu.getPosition(lineNumber + 1,0)',但它不适用于ReturnStatement,那么它特别有效。换句话说:如果我计算一个返回语句的偏移量,我得到一个块,而不是预期的ReturnStatement。 – Chriss
好吧,我在你的例子中发现了两个问题:'新的NodeFinder'的第三个参数不能是0,而是'cu.getLength()'。而不是'finder.getCoveringNode()'方法'finder.getGoveredNode()'必须被调用。你能更新你的答案吗? – Chriss