2013-10-29 45 views
7

廣義屬性我想在下面的例子來解析的類的成員函數廣義屬性:檢查與libclang

class Foo 
{ 
public: 
    void foo [[interesting]](); 
    void bar(); 
}; 

使用libclang C API,我想foobar區分(和知道foo在源中具有interesting屬性)。這可能嗎?我很難找到解釋在API中使用的概念的示例或文檔(我找到了一個參考,但是當這些概念沒有解釋時,這很難使用)。如果存在

回答

1

雖然我無法找到AST中的廣義屬性(看起來在構建AST時或之前它們被刪除,而不是在它之後),但我確實找到了解決方法。

有以下形式的annotate鐺屬性:

__attribute__((annotate("something"))) 

隨着宏,我能得到一個合理的語法和註釋這是在AST可見:

#define INTERESTING __attribute__((annotate("interesting"))) 

class Foo 
{ 
public: 
    INTERESTING void foo(); 
    void bar(); 
}; 

屬性將是方法節點的子節點,其display_name是註釋字符串。可能的AST轉儲:

<CursorKind.TRANSLATION_UNIT> 
    "test.h" 
{ 
    __builtin_va_list <CursorKind.TYPEDEF_DECL> 
    "__builtin_va_list" 
    type_info <CursorKind.CLASS_DECL> 
    "type_info" 
    Foo <CursorKind.CLASS_DECL> 
    "Foo" 
    { 
    <CursorKind.CXX_ACCESS_SPEC_DECL> 
     "" 
    foo <CursorKind.CXX_METHOD> 
     "foo()" 
    { 
     <CursorKind.ANNOTATE_ATTR> 
     "interesting" 
    } 
    bar <CursorKind.CXX_METHOD> 
     "bar()" 
    } 
} 

它也會產生與void foo INTERESTING();相同的輸出。

2

像下面first_attr功能將取傳遞光標的第一屬性的光標,或一個空指針,如果它不(未經測試的代碼......需要注意的講師)

CXChildVisitResult attr_visit(CXCursor cursor, CXCursor parent, CXClientData data) { 
    if (clang_isAttribute(cursor)) { 
     *data = cursor; 
     return CXChildVisit_Break; 
    } 
    return CXChildVisit_Continue; 
} 

CXCursor first_attr(const CXCursor& c) { 
    CXCursor attr; 
    unsigned visit_result = clang_visitChildren(c, attr_visit, &attr); 
    if (!visit_result) // attribute not found 
     attr = clang_getNullCursor(); 
    return attr; 
} 

作爲認定其具體屬性光標a代表的clang_getCursorKind(a)結果可以幫助,但暴露了唯一的屬性是:

CXCursor_IBActionAttr 
CXCursor_IBOutletAttr 
CXCursor_IBOutletCollectionAttr 
CXCursor_CXXFinalAttr 
CXCursor_CXXOverrideAttr 
CXCursor_AnnotateAttr 
CXCursor_AsmLabelAttr 

一切將是一個CXCursor_UnexposedAttr的d我能想到的唯一方法就是查看clang_getCursorExtent(a)(即讀取源代碼;比照clang_tokenize)。在註釋的情況下,所使用的特定註釋可通過clang_getCursorDisplayName獲得。

+0

我試圖用python綁定來創建代碼原型,但該屬性在AST中根本不可見(甚至不是未暴露的屬性)。當我添加它時,'noreturn'屬性確實出現在我的AST轉儲中。 –