0

私はかなり長い間ASTで遊んでいて、Eclipseからこのプラグインで解析された特定のノードに関連付けられた行と列の情報を取得しようとしていました。ここに記載されているAPIによると、このメソッドgetStartPosition()で解析されたファイルの文字の位置を特定できることがわかりましたが、これは私が望んでいたことではありません。

私はCompilationUnitクラスのAPIドキュメントgetLineNumber(int position)にアクセスして、メソッドとgetColumnNumber(int position)、私の理解からトリックを実行できるメソッドを見つけました。パラメータは、メソッドが返すpositionものに他なりません。getStartPosition()node.getStartPosition()

ここで問題となるのは、ソースファイルの行と列を取得する2つの方法が、すべてのノードで使用できるとは限らないことです。たとえば、メソッド宣言ノードにはそれらがありません!

どうすればすべてのツリーでそのような情報を取得できますか?すべてのastノードに行と列が関連付けられている他の言語のパーサーを使用できたので、これは不可能ではないことを私は知っています。実際、クラスにはハードコードされた行と列の属性が含まれているため、javaparserはjavaの1つであると思います。Eclipse JDTを見ると、私にとってはるかに堅牢で、かなり長い間そこにいるように見えたので、そのような情報を取得できないことに驚きました。

編集:繰り返しますが、問題は、ルートにのみ表示されるコンパイル単位とは異なるものから行番号を取得することです。

<type 'org.eclipse.jdt.core.dom.CompilationUnit'>
1
<type 'org.eclipse.jdt.core.dom.TypeDeclaration'>
<type 'org.eclipse.jdt.core.dom.Javadoc'>
<type 'org.eclipse.jdt.core.dom.TagElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>

ありがとうございました。

4

2 に答える 2

2

後世のために、jdt-core-devメーリングリストに投稿した回答を再投稿します。(私の答えは、上記のライアンの提案と大差ありません)

こんにちはカルロス、

あなたはCompilationUnit.getLineNumber(int)メソッドについて正しいです。次のように使用します。

int lineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;

しかし、どこで立ち往生しているのかわかりません。MethodDeclarationにgetLineNumber(..)を定義する必要があるのはなぜですか?あなたがしなければならないのは、メソッド宣言ノードを見つけ、次に以下のコードを使用してそれに対応するCompilationUnitを見つけ、次に上記のコード行を使用して行番号を見つけることです。ここで何かが足りませんか?

ASTParser parser = ASTParser.newParser(AST.JLS3); // or JLS_4 for java 7 and above

parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(source); // give your java source here as char array
parser.setResolveBindings(true);

CompilationUnit compilationUnit = parser.createAST(null);

乾杯!アユッシュ

于 2012-08-17T16:23:35.240 に答える
1

目の前に実行中のプログラムはありませんが、上記でリンクしたドキュメントと Eclipse のソース コードに基づいて、 を呼び出して にキャストすることで を取得CompilationUnitできるASTNodeようgetRoot()ですCompilationUnit。または、ASTParser javadocibmの例から、ASTParser.createAST(IProgressMonitor)ほとんどCompilationUnitの場合、解析しているソースを表す a が返されます。

CompilationUnit名前付きを取得したら、およびメソッドrootを使用できるようになります。root.getLineNumber(node.getStartPosition())root.getColumnNumber(node.getStartPosition())

final ASTParser p = ASTParser.newParser(AST.JLS3);
p.setSource(source);
final CompilationUnit root = (CompilationUnit) p.createAST(null);
// stuff happens
final ASTNode node = //get a node

final int line = root.getLineNumber(node.getStartPosition());
final int column = root.getColumnNumber(node.getStartPosition());
System.out.println("Node started at (" + line + ", " + column + ")";
于 2012-08-17T02:29:29.850 に答える