如何获得org.eclipse.jdt.core.dom.Statement
给定的行号?
假设我有这个课程:
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 }
这是我期望的:
BlockStatement
IfStatement
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;
}
您可能需要使用以下命令将行号转换为(character-)位置
org.eclipse.jdt.core.dom.CompilationUnit.getPosition(int, int)
使用该偏移量,您可以使用org.eclipse.jdt.core.dom.NodeFinder
检索该ASTNode
位置处的,例如:
NodeFinder finder= new NodeFinder(cu, offset, 0);
ASTNode node= finder.getCoveringNode();
while (node != null && !(node instanceof Statement)) {
node= node.getParent();
}
return node;
编辑:但是,这种方法在空格方面存在问题,因为所查找的语句未涵盖前导或尾随空格字符。
我看到了两种避免该问题的可能策略:
offset
直到您确定它在行的有效文本内,或者ASTNode
该区域完全覆盖最大的区域(使用getCoveredNode()
代替getCoveringNode()
)。策略(1)要求通过IDocument检索相关行的文本,该文本可能不容易获得。策略(2)的效果可能是,可以选择一条跨越多行的语句,不确定该语句是否违反任何要求。如果需要更高的精度,请计算length参数getPosition()
作为当前行起始点与下一行起始点之间的差。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句