廣義屬性我想在下面的例子來解析的類的成員函數廣義屬性:檢查與libclang
class Foo
{
public:
void foo [[interesting]]();
void bar();
};
使用libclang C API,我想foo
和bar
區分(和知道foo
在源中具有interesting
屬性)。這可能嗎?我很難找到解釋在API中使用的概念的示例或文檔(我找到了一個參考,但是當這些概念沒有解釋時,這很難使用)。如果存在
廣義屬性我想在下面的例子來解析的類的成員函數廣義屬性:檢查與libclang
class Foo
{
public:
void foo [[interesting]]();
void bar();
};
使用libclang C API,我想foo
和bar
區分(和知道foo
在源中具有interesting
屬性)。這可能嗎?我很難找到解釋在API中使用的概念的示例或文檔(我找到了一個參考,但是當這些概念沒有解釋時,這很難使用)。如果存在
雖然我無法找到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();
相同的輸出。
像下面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
獲得。
我試圖用python綁定來創建代碼原型,但該屬性在AST中根本不可見(甚至不是未暴露的屬性)。當我添加它時,'noreturn'屬性確實出現在我的AST轉儲中。 –