2014-10-02 6 views
8

Ich habe einen C++ AST-Parser mit der ausgezeichneten C-Schnittstelle libclang (http://clang.llvm.org/doxygen/group__CINDEX.html) geschrieben. Unglücklicherweise scheint es keine Disambiguierung zwischen C++ 11-Bereichsaufzählungen und altmodischen Aufzählungen zu geben: beide haben eine Cursor-Art von CXCursor_EnumDecl und eine Art von CXType_Enum-Ie. identisch.Wie erkennen Sie den Unterschied zwischen einer Enum- und einer Bereichsumgebung mit libclang?

Ich habe versucht, die Kinder zu besuchen, um zu sehen, ob ihre Eltern Typen unterscheidet - leider nicht. Ich habe versucht, nach dem zugrunde liegenden Typ zu fragen, ich bekomme für beide eine Ganzzahl zurück. Ich habe alle Gegenstände untersucht, die nach der Enum deklariert wurden, um zu sehen, ob vielleicht für altmodische Enums eine Bindung oder ein typedef erscheinen könnte, wieder ist kein Unterschied offensichtlich.

Ich fange an zu denken, dass ich etwas verpassen muss. Muss ich die Code-Vervollständigungs-API verwenden, um herauszufinden, um welche Art von Enum es sich handelt?

Antwort

3

hier ist also eine Lösung, obwohl es nicht so toll, aber es kann andere helfen. Ein CXCursor ist eine Struktur wie folgt aussehen:

typedef struct { 
    enum CXCursorKind kind; 
    int xdata; 
    const void *data[3]; 
} CXCursor; 

Derzeit ist die void * data [3] Karten auf {const Klirren :: Decl * Eltern, const Klirren :: Stmt * S, CXTranslationUnit TU}. Mit diesem Wissen können wir Code, extrahiert die interne Klirren C++ schreiben vom libclang C Zustand Objekte:

#include "clang/AST/Decl.h" 
bool isScoped=false; 
{ 
    using namespace clang; 
    const Decl *D = static_cast<const Decl *>(cursor.data[0]); 
    if(const EnumDecl *TD = dyn_cast_or_null<EnumDecl>(D)) 
    { 
    isScoped=TD->isScoped(); 
    } 
} 

Viele schlechten Dinge mit dieser Lösung von Ihrem libclang wenn Ihre Klirren Header abweichen passieren könnte. Mir ist diese Lösung egal, aber es funktioniert.