在eclipse中给出一个ASTNode,有没有办法得到相应的源代码行号?
答案 0 :(得分:16)
您可以使用以下代码
获取ASTNode
的行号
int lineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
可以使用以下代码
从ASTParser
获取编译单元
ASTParser parser = ASTParser.newParser(AST.JLS3);
// Parse the class as a compilation unit.
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(source); // give your java source here as char array
parser.setResolveBindings(true);
// Return the compiled class as a compilation unit
CompilationUnit compilationUnit = parser.createAST(null);
然后您可以使用ASTVisitor
模式使用以下代码访问所需节点的类型(比如MethodDeclaration节点):
compilationUnit.accept(new ASTVisitor() {
public boolean visit(MethodDeclaration node) {
int lineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
return true;
}
});
答案 1 :(得分:1)
ASTNode具有处理字符偏移的getStartPosition()和getLength()方法。要从字符偏移量转换为行号,您应该使用CompilationUnit的getLineNumber()方法。 CompilationUnit是AST树的根。
答案 2 :(得分:1)
除了已经描述的一般解决方案之外,如果您需要ASTNode的行号(包括前导空格或在ASTNode前面写的潜在注释),还有另一个适用。然后你可以使用:
int lineNumber = compilationUnit.getLineNumber(compilationUnit.getExtendedStartPosition(astNode))
请参阅API:
返回给定节点的扩展起始位置。与ASTNode.getStartPosition()和ASTNode.getLength()不同,扩展源范围可能包括紧邻节点的正常源范围之前或之后的注释和空格。