2016-12-27 42 views
1

我是呱呱libTooling開發新手。鏗鏘顧客爲單行多變量聲明

考慮下面的變量聲明

int i, j, k = 10; 
^   ^ 

我的項目的要求,我想捕捉整個聲明表達包括「I」,「J」和「K」。

如何捕獲包含clang libTooling的所有變量的完整聲明表達式?

我正在經歷的是,我沒有得到訪問者的完整表達式,而是我得到訪問者的個人變量聲明。

這是叮噹libTooling的預期行爲還是我錯過了什麼?

請建議我正確的方式來捕獲單行多重聲明或任何解決方法? 任何形式的幫助將非常感激。

感謝, 與Hemant

+0

我不知道是否有一個內置的方式來捕獲一整套聲明在libclang API中,但也許你可以通過比較這些源代碼位置來識別何時在同一行中聲明一些變量。 – Argenet

+0

我確實可以做,但其背後的目的是遵循Java和C#中的解析順序。由於沒有內置的方法,我不得不手動遍歷我想避免的VarDecl。 – Hemant

回答

2

爲了解決上述問題,你可以,例如寫一個遞歸AST遊客是訪問DeclStmt節點(不僅VarDecl)。檢查這個網站看看如何編寫這樣訪問者:http://clang.llvm.org/docs/RAVFrontendAction.html

爲什麼你應該訪問DeclStmt節點,不僅VarDecl節點的原因可以通過具有看看你的聲明語句的AST表示來解釋:

|-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節點(和初始化,如果給出的話)。 訪問者訪問DeclStmt後,如果您的聲明引用了單個聲明,您可以使用isSingleDecl()成員函數進行檢查。如果沒有(如你的情況),你可以檢索一個迭代器到不同的VarDecl節點與decl_begin(),decl_end()

+0

這隻適用於局部變量。對於全局變量和類成員,AST不顯示任何常見的DeclStmt。 – Hemant