有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在源代码中获取通用ASTNode的行号?

如何在basic中实现此方法 类ASTNode以便更容易获得不同的ASTNode行号? 例如,如果我想得到MethodDeclaration位置,我需要编写代码

@Override
public boolean visit(MethodDeclaration node) {
    int lineNum = ((CompilationUnit) node.getRoot()).getLineNumber(node.getStartPosition());
    return super.visit(node);
}

然而,我想得到这样的位置信息

@Override
public boolean visit(MethodDeclaration node) {
    int lineNum = node.getLineNumber();
    return super.visit(node);
}

CompilationUnit提供了一个名为getLineNumber的方法,该方法是用lineEndTable实现的,而一般的ASTNode只有一个名为startPosition的字段,所以我可以在抽象类ASTNode中获得一个lineEntTable


共 (2) 个答案

  1. # 1 楼答案

    “有没有可能……”不,像MethodDeclaration这样的单个节点没有此信息。为了避免冗余lineEndTable只存储在一个特定节点CompilationUnit中。鉴于您已经找到了解决方案,寻找其他解决方案没有任何好处。API已经足够了,您需要编写的额外代码也非常少

  2. # 2 楼答案

    我找到了一个折衷的方法。我为抽象类ASTNode添加了两个方法

    public int getStartingLineNumber() {
        if (this.getRoot().getNodeType() == 15) {
            return (((CompilationUnit)this.getRoot()).getLineNumber(this.getStartPosition()));
        }
        if (this instanceof Comment) {
            ASTNode alter = ((Comment) this).getAlternateRoot();
            if (alter.getNodeType() == 15) {
                return (((CompilationUnit) alter).getLineNumber(this.getStartPosition()));
            }
        }
        return -1;
    }
    
    public String fileName;
    
    public String getFileName() {
        if (this.getRoot().getNodeType() == 15) {
            return ((CompilationUnit) this.getRoot()).getFileName();
        }
        if (this instanceof Comment) {
            ASTNode alter = ((Comment) this).getAlternateRoot();
            if (alter.getNodeType() == 15) {
                return ((CompilationUnit) alter).getFileName();
            }
        }
        return fileName;
    }`
    

    我还为compileUnit添加了一个setFileName方法,这样我就可以为每个ASTNode获取fileNameLineNum信息

    CompilationUnit result = (CompilationUnit)(astParser.createAST(null));
    result.setFileName(javaFilePath);
    

    有谁能给我一个更好的解决方案吗