diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/c-index-test/c-index-test.c | 25 | ||||
-rw-r--r-- | tools/libclang/CXTypes.cpp | 18 | ||||
-rw-r--r-- | tools/libclang/libclang.darwin.exports | 1 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 1 |
4 files changed, 38 insertions, 7 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 4268cec1b2..27c51a0c59 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -455,16 +455,29 @@ static enum CXChildVisitResult PrintTypeKind(CXCursor cursor, CXCursor p, if (!clang_isInvalid(clang_getCursorKind(cursor))) { CXType T = clang_getCursorType(cursor); - CXType CT = clang_getCanonicalType(T); CXString S = clang_getTypeKindSpelling(T.kind); PrintCursor(cursor); printf(" typekind=%s", clang_getCString(S)); - if (!clang_equalTypes(T, CT)) { - CXString CS = clang_getTypeKindSpelling(CT.kind); - printf(" [canonical=%s]", clang_getCString(CS)); - clang_disposeString(CS); - } clang_disposeString(S); + // Print the canonical type if it is different. + { + CXType CT = clang_getCanonicalType(T); + if (!clang_equalTypes(T, CT)) { + CXString CS = clang_getTypeKindSpelling(CT.kind); + printf(" [canonical=%s]", clang_getCString(CS)); + clang_disposeString(CS); + } + } + // Print the return type if it exists. + { + CXType RT = clang_getResultType(T); + if (RT.kind != CXType_Invalid) { + CXString RS = clang_getTypeKindSpelling(RT.kind); + printf(" [result=%s]", clang_getCString(RS)); + clang_disposeString(RS); + } + } + printf("\n"); } return CXChildVisit_Recurse; diff --git a/tools/libclang/CXTypes.cpp b/tools/libclang/CXTypes.cpp index ae756c7a1e..64e49fba2b 100644 --- a/tools/libclang/CXTypes.cpp +++ b/tools/libclang/CXTypes.cpp @@ -77,6 +77,8 @@ static CXTypeKind GetTypeKind(QualType T) { TKCASE(Typedef); TKCASE(ObjCInterface); TKCASE(ObjCObjectPointer); + TKCASE(FunctionNoProto); + TKCASE(FunctionProto); default: return CXType_Unexposed; } @@ -118,7 +120,8 @@ CXType clang_getCursorType(CXCursor C) { return MakeCXType(VD->getType(), AU); if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) return MakeCXType(PD->getType(), AU); - + if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) + return MakeCXType(FD->getType(), AU); return MakeCXType(QualType(), AU); } @@ -246,6 +249,8 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) { TKIND(Typedef); TKIND(ObjCInterface); TKIND(ObjCObjectPointer); + TKIND(FunctionNoProto); + TKIND(FunctionProto); } #undef TKIND return cxstring::createCXString(s); @@ -255,4 +260,15 @@ unsigned clang_equalTypes(CXType A, CXType B) { return A.data[0] == B.data[0] && A.data[1] == B.data[1];; } +CXType clang_getResultType(CXType X) { + QualType T = GetQualType(X); + if (!T.getTypePtr()) + return MakeCXType(QualType(), GetASTU(X)); + + if (const FunctionType *FD = T->getAs<FunctionType>()) + return MakeCXType(FD->getResultType(), GetASTU(X)); + + return MakeCXType(QualType(), GetASTU(X)); +} + } // end: extern "C" diff --git a/tools/libclang/libclang.darwin.exports b/tools/libclang/libclang.darwin.exports index 3ef3b74854..6c7eddfec6 100644 --- a/tools/libclang/libclang.darwin.exports +++ b/tools/libclang/libclang.darwin.exports @@ -67,6 +67,7 @@ _clang_getPointeeType _clang_getRange _clang_getRangeEnd _clang_getRangeStart +_clang_getResultType _clang_getTokenExtent _clang_getTokenKind _clang_getTokenLocation diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index c7831f777e..138b9767b1 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -67,6 +67,7 @@ clang_getPointeeType clang_getRange clang_getRangeEnd clang_getRangeStart +clang_getResultType clang_getTokenExtent clang_getTokenKind clang_getTokenLocation |