2016-12-27 13 views
1

私はClangのlibTooling開発の初心者です。1行複数変数宣言の訪問者

は私のプロジェクトの要件については、次の変数宣言

int i, j, k = 10; 
^   ^ 

を考え、私は「I」、「J」と「K」を含む全宣言式をキャプチャしたいです。

clang libToolingですべての変数を含む完全な宣言式を取得するにはどうすればよいですか?

私が経験しているのは、完全な表現のための訪問者を得られないということです。代わりに、個々の変数宣言の訪問者を取得します。

これはclang libToolingで予想される動作ですか、何か不足していますか?

1行複数の宣言または回避策をキャプチャする正しい方法を教えてください。 どんな種類のヘルプが本当に感謝されます。あなたは、例えばDeclStmtノード(だけではなくVarDecl)を訪問再帰ASTの訪問者を書くことができな問題を解決するために

おかげで、 Hemant

+0

単一の宣言のバッテリ全体をキャプチャする組み込みの方法があるかどうかはわかりませんlibclang APIのラインではありますが、おそらく、これらのソースコードの場所を比較して、同じ行にいくつかの変数が宣言されていることを認識することで回避できます。 – Argenet

+0

私は間違いなくそれを行うことができますが、その背後にある目的は、JavaとC#の後に続く構文解析命令に従うことです。組み込みの方法がないので、回避したいVarDeclを手動でトラバースする必要があります。 – Hemant

答えて

2

。そのような訪問者の記述方法を確認するには、このサイトをチェックしてください:

|-DeclStmt 0x35dbfc8 <line:3:1, col:17> 
    | |-VarDecl 0x35dbe48 <col:1, col:5> col:5 i 'int' 
    | |-VarDecl 0x35dbeb8 <col:1, col:8> col:8 j 'int' 
    | `-VarDecl 0x35dbf28 <col:1, col:15> col:11 k 'int' cinit 
    | `-IntegerLiteral 0x35dbf88 <col:15> 'int' 10 
:あなたは DeclStmtノードを訪問するべきであるだけでなく VarDeclノードは自分の宣言文のAST表現を見て持っていることによって説明できる理由 http://clang.llvm.org/docs/RAVFrontendAction.html

理由

DeclStmtはすべてVarDeclノードをキャプチャします(また、指定されている場合は初期化されています)。 訪問者がDeclStmtを訪問すると、宣言が単一の宣言を参照するかどうかを確認することができます。isSingleDecl()メンバー関数を使用して確認できます。そうでない場合は、異なるVarDeclノードのイテレータをdecl_begin(),decl_end()などで取得できます。

+0

これはローカル変数に対してのみ機能します。グローバル変数とクラスメンバーの場合、ASTは共通のDeclStmtを表示しません。 – Hemant