2014-10-02 10 views
8

Pisałem parser w języku C++ AST przy użyciu doskonałego interfejsu biblioteki libclang (http://clang.llvm.org/doxygen/group__CINDEX.html). Niestety wydaje się, że nie ma ujednolicenia między enumeracjami w C++ 11 a staromodnymi enumami: oba mają typ kursora CXCursor_EnumDecl i typ CXType_Enum I.e. identyczny.Jak rozpoznać różnicę między enumem a enumem z zakresu, używając libclang?

Próbowałem odwiedzić dzieci, aby zobaczyć, czy ich typ macierzysty jest inny - niestety nie. Próbowałem prosić o podstawowy typ, otrzymuję z powrotem liczbę całkowitą dla obu. Zbadałem wszystkie elementy zadeklarowane po Enum, aby sprawdzić, czy może dla staroświeckich Enums może pojawić się bind lub typedef, znowu żadna różnica nie jest oczywista.

Zaczynam myśleć, że czegoś brakuje. Czy muszę używać API do uzupełniania kodu, aby dowiedzieć się, jakiego rodzaju jest Enum czy coś takiego?

Odpowiedz

3

Oto jedno rozwiązanie, choć nie jest wspaniałe, ale może pomóc innym. CXCursor jest struktura wygląda tak:

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

Obecnie void * danych [3] Plany na {const dzyń :: dekl * Dominująca const dzyń :: stmt * S, CXTranslationUnit TU}. Wiedząc o tym, możemy napisać kod, który wydobywa się z wewnętrzną clang C++ obiekty ze stanu 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(); 
    } 
} 

Dużo złych rzeczy może się zdarzyć z tego rozwiązania, jeśli nagłówki dzyń odbiegają od libclang. Nie dbam o to rozwiązanie, ale działa.

Powiązane problemy