2014-10-02 7 views
8

Ho scritto un parser C++ AST utilizzando l'eccellente libclang dell'interfaccia C (http://clang.llvm.org/doxygen/group__CINDEX.html). Sfortunatamente non sembra esserci disambiguazione tra enfasi con scope C++ 11 e enfasi vecchio stile: entrambe hanno un tipo di cursore CXCursor_EnumDecl e un tipo di CXType_Enum I.e. identici.Come si rileva la differenza tra un enum e un enume con scope usando libclang?

Ho provato a visitare i bambini per vedere se il loro genitore è diverso - purtroppo no. Ho provato a chiedere il tipo sottostante, ritorno a un intero per entrambi. Ho esaminato tutti gli oggetti dichiarati dopo l'Enum per vedere se forse per gli Enums vecchio stile potrebbe apparire un bind o typedef, ancora nessuna differenza è ovvia.

Sto iniziando a pensare che mi manchi qualcosa. Devo usare l'API di completamento del codice per capire quale tipo di Enum è o qualcosa del genere?

risposta

3

Quindi ecco una soluzione, anche se non è eccezionale, ma può aiutare gli altri. Un CXCursor è una struttura simile a questo:

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

Attualmente, il vuoto * dati [3] le mappe sul {clang const :: Decl * Parent, clang const :: Stmt * S, CXTranslationUnit TU}. Sapendo questo, siamo in grado di scrivere codice che estrae il clangore C++ interna oggetti da parte dello Stato libclang C:

#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(); 
    } 
} 

Un sacco di cose cattive potrebbe accadere con questa soluzione, se le intestazioni clangore deviare dal vostro libclang. Non mi interessa molto questa soluzione, ma funziona.

Problemi correlati