Add CXType support for FunctionNoProto and FunctionProto types. This includes adding a new

function, clang_getResultType(), which returns the result type of the function type.

llvm-svn: 106459
This commit is contained in:
Ted Kremenek 2010-06-21 20:15:39 +00:00
parent 79404afc1c
commit c150887fef
6 changed files with 47 additions and 9 deletions

View File

@ -1086,7 +1086,9 @@ enum CXTypeKind {
CXType_Enum = 106,
CXType_Typedef = 107,
CXType_ObjCInterface = 108,
CXType_ObjCObjectPointer = 109
CXType_ObjCObjectPointer = 109,
CXType_FunctionNoProto = 110,
CXType_FunctionProto = 111
};
/**
@ -1138,6 +1140,11 @@ CINDEX_LINKAGE CXCursor clang_getTypeDeclaration(CXType T);
*/
CINDEX_LINKAGE CXString clang_getTypeKindSpelling(enum CXTypeKind K);
/**
* \brief Retrieve the result type associated with a function or method type.
*/
CINDEX_LINKAGE CXType clang_getResultType(CXType T);
/**
* @}
*/

View File

@ -8,7 +8,7 @@ int *f(int *p, char *x, FooType z) {
// RUN: c-index-test -test-print-typekind %s | FileCheck %s
// CHECK: TypedefDecl=FooType:1:13 (Definition) typekind=Typedef [canonical=Int]
// CHECK: VarDecl=p:2:6 typekind=Pointer
// CHECK: FunctionDecl=f:3:6 (Definition) typekind=Unexposed [canonical=Unexposed]
// CHECK: FunctionDecl=f:3:6 (Definition) typekind=FunctionProto [canonical=FunctionProto] [result=Pointer]
// CHECK: ParmDecl=p:3:13 (Definition) typekind=Pointer
// CHECK: ParmDecl=x:3:22 (Definition) typekind=Pointer
// CHECK: ParmDecl=z:3:33 (Definition) typekind=Typedef [canonical=Int]

View File

@ -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;

View File

@ -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"

View File

@ -67,6 +67,7 @@ _clang_getPointeeType
_clang_getRange
_clang_getRangeEnd
_clang_getRangeStart
_clang_getResultType
_clang_getTokenExtent
_clang_getTokenKind
_clang_getTokenLocation

View File

@ -67,6 +67,7 @@ clang_getPointeeType
clang_getRange
clang_getRangeEnd
clang_getRangeStart
clang_getResultType
clang_getTokenExtent
clang_getTokenKind
clang_getTokenLocation