EclipseAstNode到源代码行号

EclipseAstNode到源代码行号,eclipse,abstract-syntax-tree,eclipse-jdt,Eclipse,Abstract Syntax Tree,Eclipse Jdt,在eclipse中给定一个ASTNode,有没有办法获得相应的源代码行号?ASTNode有处理字符偏移量的getStartPosition()和getLength()方法。要将字符偏移量转换为行号,应使用CompilationUnit的getLineNumber()方法。CompliationUnit是AST树的根。您可以使用下面的代码获取ASTNode的行号 int lineNumber=compilationUnit.getLineNumber(node.getStartPosition()

在eclipse中给定一个ASTNode,有没有办法获得相应的源代码行号?

ASTNode有处理字符偏移量的getStartPosition()和getLength()方法。要将字符偏移量转换为行号,应使用CompilationUnit的getLineNumber()方法。CompliationUnit是AST树的根。

您可以使用下面的代码获取
ASTNode
的行号

int lineNumber=compilationUnit.getLineNumber(node.getStartPosition())-1;
可使用以下代码从
ASTParser
获取编译单元

ASTParser=ASTParser.newParser(AST.JLS3);
//将类作为编译单元进行分析。
setKind(ASTParser.K_编译单元);
parser.setSource(source);//在这里将java源代码作为char数组提供
setResolveBindings(true);
//将已编译类作为编译单元返回
CompilationUnit CompilationUnit=parser.createAST(null);
然后,您可以使用
ASTVisitor
模式,使用以下代码访问所需节点的类型(比如MethodDeclaration节点):

compilationUnit.accept(新的ASTVisitor(){
公共布尔访问(MethodDeclaration节点){
int lineNumber=compilationUnit.getLineNumber(node.getStartPosition())-1;
返回true;
}
});

除了已经描述的一般解决方案外,如果您需要ASTNode的行号,包括在ASTNode前面写入的前导空格或潜在注释,还有一种解决方案适用。然后您可以使用:

int lineNumber = compilationUnit.getLineNumber(compilationUnit.getExtendedStartPosition(astNode))
见:

返回给定节点的扩展起始位置。与ASTNode.getStartPosition()和ASTNode.getLength()不同,扩展的源范围可能包括节点正常源范围之前或之后的注释和空格