日食のASTNodeが与えられた場合、対応するソースコードの行番号を取得する方法はありますか?
3 に答える
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;
}
});
ASTNode には、文字オフセットを処理する getStartPosition() および getLength() メソッドがあります。文字オフセットを行番号に変換するには、CompilationUnit の getLineNumber() メソッドを使用する必要があります。CompilationUnit は AST ツリーのルートです。
すでに説明した一般的な解決策とは別に、ASTNode の前に書かれた先頭の空白または潜在的なコメントを含む ASTNode の行番号が必要な場合に適用される別の解決策があります。次に、次を使用できます。
int lineNumber = compilationUnit.getLineNumber(compilationUnit.getExtendedStartPosition(astNode))
APIを参照してください。
指定されたノードの拡張開始位置を返します。ASTNode.getStartPosition() および ASTNode.getLength() とは異なり、拡張ソース範囲には、ノードの通常のソース範囲の直前または直後にコメントと空白を含めることができます。