5

在eclipse中给定一个ASTNode,有什么办法可以得到对应的源码行号?

4

3 回答 3

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;
        }
    });
于 2012-06-21T04:22:40.460 回答
1

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

于 2012-06-20T21:26:16.277 回答
1

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

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

请参阅API

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

于 2016-03-24T07:39:23.167 回答