extracting name of type with cindex


let's say I have:

class Test {
  int foo;
  vector<string> bar;
  char* ptr;

with cindex, I want to extract the variable name and data type from
this class, eg, I want to have 'int', 'foo', 'vector<string>', 'bar',
'char*', 'ptr'.

Getting into the class with a cursor seems easy, as getting the
variable, but how do I get the original representation of the type?

If I use something like:

print >>output, cursor.type.kind.spelling,
cursor.type.get_declaration().spelling, cursor.spelling, cursor.kind,

I get back:

Int None foo CursorKind.FIELD_DECL FIELD_DECL
Unexposed vector bar CursorKind.FIELD_DECL FIELD_DECL
Pointer None ptr CursorKind.FIELD_DECL FIELD_DECL

Any easy way to get the original representation of the type? or at
least reconstruct what it should be like?
Is this a shortcoming of the python API? would I have better luck
using the C++ one? anyone who can point me in the right direction?

Instead of Int, I'd like int, instead of Unexposed vector, I'd like
vector<string>, ...

(trying to build a tool for serialization, that needs the original
data type for diagnostic purposes and to generate code)

Thank you in advance,

BTW, ... am I doing something fundamentally wrong here? eg, is this
something that is explicitly not supported by the API? just lack of
python bindings? did I miss something obvious on how to do this?
should I open a bug?


I don't know about the Python bindings but using the C bindings I do:

1. Iterate all declarations
2. For every declaration of the type (cursor.kind) CXCursor_StructDecl
3. Iterate all the children of the declaration
4. For every declaration of the type (cursor.kind) CXCursor_FieldDecl
5. Get the type, clang_getCursorType
7. Get the spelling, clang_getCursorSpelling

Now the tricky thing is the type, it's really depends on what you want out of the information. What you want here is the spelling of the type:

cursor = clang_getTypeDeclaration(type)

For structs, enums and so on I use the spelling. But the thing is that the built-in types doesn't have any spelling. I don't know if this is the correct way to do it but I have a big switch-statement for the built-in types, something like this (in some kind of pseudo code) :

string getType (type)
     switch (type.kind)
         case CXType_Void: return "void";
         case CXType_Char_S: return "char";
         case CXType_Short: return "short";
         case CXType_Int: return "int";
         case CXType_Float: return "float";
         case CXType_Double: return "double";

         case CXType_Record:
         case CXType_Enum:
         case CXType_Typedef:
             return type.spelling;