2014-12-29 93 views
3
class aclass{ 
public: 
    int num; 
}; 

int main() 
{ 
    aclass *ok; 
    ok->num = 4; 
    return 0; 
} 

現在當我做了clang_getCursorDefinition(cur_cursor);在ok-> num = 4處在o的開頭的光標右邊;它爲遊標提供了int num;裏面aclass。我希望它給我的光標爲aclass *好的;主要內部的聲明。調用clang_getCursorSemanticParent(cur_cursor)似乎是錯誤的,因爲如果我將聲明放在main()func的內部或外部,它仍然返回main()作爲語義父對象。libclang獲取成員聲明

有沒有辦法有效地做到這一點,而不是迭代每一個可能的光標?

編輯: 鏗鏘計數標籤爲1個字符,這是正確的。我正在測試的編輯器自動將選項卡作爲大小4進行計數,因此,我的編輯器將作爲第2列發出的clang預期爲第5列。現在,getCursorDefinition按預期工作,並將我帶入作用域定義。

回答

2

當我做了clang_getCursorDefinition(cur_cursor);在o的開始光標就在ok->num = 4;

也許你被你的代碼的行爲感到驚訝,因爲(通用)誤解,認爲只有一個在每個源位置的光標。

在這個位置上實際上有許多光標,其中一個指向整個表達式,另一個指向成員參考ok->num,另一個指向ok指針。 (有關更詳細的解釋,請參閱此問題的示例:C++ libclang: Retrieving cursor from CXSourceLocation returning wrong cursor?

您應該嘗試查找所有位於同一位置的正確光標。做到這一點的方式取決於你最初如何得到你的光標。

+0

是的。這一定是它,看着這個。另一個問題。在將行:列設置爲n u m之間的任何位置時,是否有辦法獲取CXCursor_MemberRefExpr類型的光標?原因是如果我設置光標之間的話說我想去範圍內的類的聲明。如果我在n之間設置光標,我想去實際類中的聲明成員。 –

+0

簡而言之,我認爲一個很好的啓發式方法就是選擇具有最小範圍的CXCursor,同時仍然包含您感興趣的位置。這是我在[clang-tags](https:/ /github.com/ffevotte/clang-tags),它似乎工作得不錯。 – Francesco

+0

我相信你的第二個問題已經足夠普遍,它可能會引起其他人的興趣......也許你應該考慮把它作爲一個適當的,完全成熟的問題。 – Francesco