Qualcosa come la seguente funzione first_attr
preleverà il cursore del primo attributo del cursore superato se esiste, o un cursore nullo in caso negativo (codice non testato ... lettore avvertimento)
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;
}
quanto constatazione che specifica attribuiscono un cursore a
rappresenta il risultato di clang_getCursorKind(a)
può aiutare, ma gli unici attributi esposti sono:
CXCursor_IBActionAttr
CXCursor_IBOutletAttr
CXCursor_IBOutletCollectionAttr
CXCursor_CXXFinalAttr
CXCursor_CXXOverrideAttr
CXCursor_AnnotateAttr
CXCursor_AsmLabelAttr
Tutto il resto sarà un CXCursor_UnexposedAttr
un d l'unico modo in cui posso pensare di ottenere il suo testo è esaminare lo clang_getCursorExtent(a)
(ad esempio, leggere il codice sorgente; cf. clang_tokenize
). Nel caso di annotazioni, l'annotazione specifica utilizzata è disponibile tramite clang_getCursorDisplayName
.
fonte
2013-10-31 16:43:03
Ho provato a farlo con i collegamenti Python per prototipare il codice, ma l'attributo non era affatto visibile nell'AST (nemmeno come attributo non esposto). L'attributo 'noreturn' è apparso nel mio dump AST quando l'ho aggiunto. –