So etwas wie die folgende first_attr
Funktion wird der Cursor des ersten Attributs des übergebenen Cursor holen, wenn es vorhanden ist, oder ein Null-Cursor, wenn dies nicht der Fall (ungetestet Code ... Vorbehalt Lektor)
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;
}
Bezüglich Feststellung, die spezifisch einen Cursor-Attribut a
darstellt, kann das Ergebnis der clang_getCursorKind(a)
helfen, aber die einzigen ausgesetzt Attribute sind:
CXCursor_IBActionAttr
CXCursor_IBOutletAttr
CXCursor_IBOutletCollectionAttr
CXCursor_CXXFinalAttr
CXCursor_CXXOverrideAttr
CXCursor_AnnotateAttr
CXCursor_AsmLabelAttr
Alles andere ein CXCursor_UnexposedAttr
ein sein wird d die einzige Möglichkeit, die ich mir vorstellen kann, um den Text davon zu bekommen, ist zu untersuchen clang_getCursorExtent(a)
(d. h., lesen Sie den Quellcode; vgl. clang_tokenize
). Im Fall von Anmerkungen ist die verwendete spezifische Anmerkung unter clang_getCursorDisplayName
verfügbar.
Ich versuchte dies mit den Python-Bindungen, um den Code zu prototypieren, aber das Attribut war im AST überhaupt nicht sichtbar (nicht als unexponiertes Attribut). Ein "noreturn" -Attribut erschien in meinem AST-Dump, als ich es hinzufügte. –