[cfe-dev] extracting name of type with cindex

Jacob Carlborg doob at me.com
Wed May 9 00:38:08 PDT 2012

On 2012-05-08 17:52, Mark Moreno wrote:
> Hello,
> 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,
> cursor.kind.name
> 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,
> Mark

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;

/Jacob Carlborg

More information about the cfe-dev mailing list