2017-10-30 25 views
1

基本的な クラスのASTNodeでこのメソッドを実装すると、別のASTNode行番号を簡単に取得できますか? exampelについては 、私はコードソースコード内で一般的なASTNodeの行番号を取得する方法は?

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

を記述する必要がMethodDeclarationの位置を取得したい場合しかし、私はこの

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

CompilationUnitのような位置情報はlineEndTablegetLineNumberが実装と呼ばれる方法を提供し、取得したいと一般ASTNodestartPositionという名前のフィールドしか持たないので、抽象クラスASTNodelineEntTableを取得することは可能でしょうか?

答えて

1

「可能ですか?」いいえ、MethodDeclarationのような個々のノードにはこの情報がありません。冗長性を避けるため、lineEndTableは特定のノードにのみ格納されます。CompilationUnit。既に解決策を見つけたことを考えると、別の解決策を探す上で利点はありません。 APIがあれば十分です。あなたが書かなければならない余分なコードは最小限です。

+0

あなたの提案に感謝します。私は 'jdt'を使っていくつかの文法チェッカーを完成させるプロジェクトを持っていますので、' CompilationUnit'とjavaソースファイルの間のマッピング関係を にする必要があります。マッピング関係を得るために書いた余分なコードをコメントできますか? –

+0

そして、 'lineEndTable'を' ASTNode'レベルでコピーする方法を本当に知りたいです。@ Stephan Herrmann –

+0

'lineEndTable'は' CompilationUnit'でプライベートなので、外部での使用は意図していません。 JDTはオープンソースなので、ソースを自由に変更することができますが、その場合は自分が何をしているかを知っていると想定します。さらに、私はあなたの訪問方法に1行のコードを保存するだけで、なぜ苦労しているのか分かりません。 –

0

私はそれを行う妥協する方法を見つける。抽象クラスASTNodeの2つのメソッドを追加します。

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; 
}` 

そして私は、各ASTノードに対してfileNameLineNum情報を取得できるように、私はまたCompilationUnitためsetFileName方法を追加します。

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

誰も私にそれより良い解決策を与えることができますか?

関連する問題