2016-07-13 5 views
0

マッチしたASTノードのすべての祖先または子孫を通過して、後でその情報を使用して入力ソースコードの一部を修正する必要があります。 私はそれを行う方法を模索しようとしました。 ASTContextクラスのメンバー関数getParentsを見ました。私はそれを使用して、AST階層を上って、現在一致しているノードのすべての祖先ノードを訪問することができます。その問題は、親ノードを取得したときに、そのノードがその親を取得しようとするコンテキストがなくなったことです。私は新しいノードのためにASTContextを再構築しようとする可能性がありますが、それは可能ならばそれ自体別の大きな仕事のようです。 私が探している最も低いNodeKind(C階層で最も低い)はcallExprで、私が探している最高のものはfunctionDeclです。 runに一致するコントロールが返された後、一致するASTノードのすべての祖先または子孫を取得するには、MatchCallbackマッチしたノードのすべての祖先または子孫を取得する

答えて

0

TranslationUnitDeclに達するまで、親宣言が再帰的に到達する可能性がありますが、代わりにTranslationUnitDeclの宣言を実際に反復し、代わりにFunctionDeclに向かうことを提案します。

翻訳単位内のすべてのTagDeclを検索し、指定したFunctionDeclについてそのクラスのすべてのメソッドを検索し、消費することがなくなるまで再帰的にそのTagDecl内のTagDeclを消費する再帰関数を作成できます。

これにより、必要な特定のASTノードの完全な記録をより簡単に保持でき、おそらく書きにくくなります。子孫(子供)のため

あなたが後方にあなたのように動作することを選択した場合は、あなたが(未テスト)このような何かを試すことができ

FunctionDecl *FD; 
DeclContext *PC = FD->getParent(); 
while (!isa<TranslationUnitDecl>(Decl::castFromDeclContext(PC))) { 
    //consume 

    PC = PC->getParent(); 
} 

あなただけの子供や反復で型にキャストする必要があります。

関連する問題