eclipse ASTNode到源代码行号

时间:2012-06-20 19:33:24

标签: eclipse abstract-syntax-tree eclipse-jdt

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

3 个答案:

答案 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()不同,扩展源范围可能包括紧邻节点的正常源范围之前或之后的注释和空格。