How to recognize a written var type using Clang using the C API instead of the actual one?

I am trying to use Clang through the C API indexing to be verbose. The problem is that some types are returned not as they are written, but as for the compiler. For example, "Stream &" becomes "int &" and "byte" becomes "int."

Some test libraries:

// TODO make it a subclass of a generic Serial/Stream base class
class FirmataClass
{
public:
    FirmataClass(Stream &s);

    void setFirmwareNameAndVersion(const char *name, byte major, byte minor);

I use the code to get information about the method:

void showMethodInfo(const CXIdxDeclInfo *info) {
    int numArgs = clang_Cursor_getNumArguments(info->cursor);
    fprintf(stderr, "  %i args:\n", numArgs);

    for (int i=0; i<numArgs; i++) {
        CXCursor argCursor = clang_Cursor_getArgument(info->cursor, i);
        CXString name = clang_getCursorDisplayName(argCursor);
        CXString spelling = clang_getCursorSpelling(argCursor);

        CXType type = clang_getCursorType(argCursor);
        CXString typeSpelling = clang_getTypeSpelling(type);

        CXCursorKind kind = clang_getCursorKind(argCursor);

        fprintf(stderr, "  kind=[%s (%i)], type=[%s], spelling=[%s]\n",
            cursor_kinds[kind], kind, clang_getCString(typeSpelling),
            clang_getCString(spelling));

        clang_disposeString(name);
        clang_disposeString(spelling);
        clang_disposeString(typeSpelling);
    }

    // return type
    CXType returnType = clang_getCursorResultType(info->cursor);
    CXString returnTypeSpelling = clang_getTypeSpelling(returnType);

    fprintf(stderr, " returns %s\n", clang_getCString(returnTypeSpelling));
    clang_disposeString(returnTypeSpelling);
}

Output:

[105: 10 4689] access = [CX_CXXPublic] kind = [CXIdxEntity_CXXInstanceMethod] (21) name= [setFirmwareNameAndVersion] is_container = [0] 3 args:
kind = [CXCursor_ParmDecl (10)], type = [const char *], = []
kind = [CXCursor_ParmDecl (10)], type = [int], spelling = [major]
kind = [CXCursor_ParmDecl (10)], type = [int], spelling = [minor] void

, , byte int. ?

+4
2

byte typedef #define?

:

typedef int MyType_t;
#define MyType2_t int

class Foo
{
public:
    bool bar( MyType_t a, MyType2_t b );
};

, clang_GetTypeSpelling, , :

bool Foo_bar(  MyType_t a, int b )

Libclang #defined , int .

+1

.

, clang, clang_parseTranslationUnit, clang_createTranslationUnit, , -I, , . , , libclang , int.

clang_createIndex (1, 1) , stderr.

, :

int main ( int argc, char* argv[] )
{
    char *clang_args[] =
    {
        "-I.",
        "-I./include",
        "-I../include",
        "-x",
        "c++",
        "-Xclang",
        "-ast-dump",
        "-fsyntax-only",
        "-std=c++1y"
    };
    CXIndex Idx = clang_createIndex ( 1, 1 );
    CXTranslationUnit TU = clang_parseTranslationUnit ( Idx, argv[1], clang_args, 9, NULL, 0, CXTranslationUnit_Incomplete | CXTranslationUnit_SkipFunctionBodies );
    clang_visitChildren ( clang_getTranslationUnitCursor ( TU ),
                          TranslationUnitVisitor, NULL );
    clang_disposeTranslationUnit ( TU );
    return 0;
}

AST , CXTranslationUnit_Incomplete | CXTranslationUnit_SkipFunctionBodies -ast-dump -fsyntax, , , , , -I .

0

All Articles