如何在源代码中获取通用 ASTnode 的行号



如何在基本中实现此方法类 ASTNode 以便我可以更轻松地获得不同的 ASTNode 行号?对于 exampel,如果我想获取 MethodTDeclaration 位置,我需要编写代码

@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

"有可能吗...?"不,像MethodDeclaration这样的单个节点没有此信息。为了避免冗余lineEndTable仅存储在一个特定的节点中,即CompilationUnit .鉴于您已经找到了解决方案,寻找其他解决方案没有任何好处。API 就足够了,您必须编写的额外代码很少。

我找到了一种折衷的方法。我为抽象类 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;
}`

我还为 CompilationUnit 添加了一个setFileName方法,以便我可以获取每个 ASTnode 的fileNameLineNum信息。

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

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

int startLine = ((CompilationUnit) node.getRoot()).getLineNumber(node.getStartPosition());
int endLine = ((CompilationUnit) node.getRoot()).getLineNumber(node.getStartPosition()+node.getLength());

最新更新