Wie erkennen Sie den Unterschied zwischen einer Enum- und einer Bereichs-Enumeration mit libclang?

8

Ich habe einen C ++ AST-Parser mit der ausgezeichneten C-Schnittstelle libclang ( Ссылка ) 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.

Ich habe versucht, die Kinder zu besuchen, um zu sehen, ob ihr Elterntyp anders ist - leider nein. 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 Codevervollständigungs-API verwenden, um herauszufinden, um welche Art von Enum es sich handelt oder was?

    
Niall Douglas 02.10.2014, 19:25
quelle

1 Antwort

3

Also hier ist eine Lösung, obwohl es nicht großartig ist, aber es kann anderen helfen. Ein CXCursor ist eine Struktur, die folgendermaßen aussieht:

%Vor%

Gegenwärtig werden die void * -Daten [3] auf {const clang :: Decl * Eltern, const clang :: Stmt * S, CXTransationUnit TU} abgebildet. Wenn wir das wissen, können wir Code schreiben, der die internen clang C ++ - Objekte aus dem libclang C-Zustand extrahiert:

%Vor%

Bei dieser Lösung können viele schlimme Dinge passieren, wenn Ihre Schlagzeilen von Ihrer libclang abweichen. Ich interessiere mich nicht sehr für diese Lösung, aber es funktioniert.

    
Niall Douglas 03.10.2014, 16:03
quelle