[libclang] Introduce clang_Type_getClassType which returns the class type of a member pointer type.

Patch by Che-Liang Chiou!

llvm-svn: 191906
This commit is contained in:
Argyrios Kyrtzidis 2013-10-03 16:19:23 +00:00
parent 0bf8241d4b
commit 7a4253b685
5 changed files with 44 additions and 1 deletions

View File

@ -1487,6 +1487,7 @@ TypeKind.VECTOR = TypeKind(113)
TypeKind.INCOMPLETEARRAY = TypeKind(114) TypeKind.INCOMPLETEARRAY = TypeKind(114)
TypeKind.VARIABLEARRAY = TypeKind(115) TypeKind.VARIABLEARRAY = TypeKind(115)
TypeKind.DEPENDENTSIZEDARRAY = TypeKind(116) TypeKind.DEPENDENTSIZEDARRAY = TypeKind(116)
TypeKind.MEMBERPOINTER = TypeKind(117)
class Type(Structure): class Type(Structure):
""" """
@ -1662,6 +1663,12 @@ class Type(Structure):
""" """
return conf.lib.clang_getArraySize(self) return conf.lib.clang_getArraySize(self)
def get_class_type(self):
"""
Retrieve the class type of the member pointer type.
"""
return conf.lib.clang_Type_getClassType(self)
def get_align(self): def get_align(self):
""" """
Retrieve the alignment of the record. Retrieve the alignment of the record.
@ -2694,6 +2701,11 @@ functionList = [
[Type], [Type],
c_longlong), c_longlong),
("clang_Type_getClassType",
[Type],
Type,
Type.from_result),
("clang_getFieldDeclBitWidth", ("clang_getFieldDeclBitWidth",
[Cursor], [Cursor],
c_int), c_int),

View File

@ -2678,7 +2678,8 @@ enum CXTypeKind {
CXType_Vector = 113, CXType_Vector = 113,
CXType_IncompleteArray = 114, CXType_IncompleteArray = 114,
CXType_VariableArray = 115, CXType_VariableArray = 115,
CXType_DependentSizedArray = 116 CXType_DependentSizedArray = 116,
CXType_MemberPointer = 117
}; };
/** /**
@ -2968,6 +2969,13 @@ enum CXTypeLayoutError {
*/ */
CINDEX_LINKAGE long long clang_Type_getAlignOf(CXType T); CINDEX_LINKAGE long long clang_Type_getAlignOf(CXType T);
/**
* \brief Return the class type of an member pointer type.
*
* If a non-member-pointer type is passed in, an invalid type is returned.
*/
CINDEX_LINKAGE CXType clang_Type_getClassType(CXType T);
/** /**
* \brief Return the size of a type in bytes as per C++[expr.sizeof] standard. * \brief Return the size of a type in bytes as per C++[expr.sizeof] standard.
* *

View File

@ -34,6 +34,11 @@ T tbar(int[size]);
void foo(int i, int incomplete_array[]) { int variable_array[i]; } void foo(int i, int incomplete_array[]) { int variable_array[i]; }
struct Blob {
int i;
};
int Blob::*member_pointer;
// RUN: c-index-test -test-print-type %s | FileCheck %s // RUN: c-index-test -test-print-type %s | FileCheck %s
// CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0] // CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0]
// CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0] // CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0]
@ -73,3 +78,4 @@ void foo(int i, int incomplete_array[]) { int variable_array[i]; }
// CHECK: ParmDecl=:33:11 (Definition) [type=int [size]] [typekind=DependentSizedArray] [isPOD=0] // CHECK: ParmDecl=:33:11 (Definition) [type=int [size]] [typekind=DependentSizedArray] [isPOD=0]
// CHECK: ParmDecl=incomplete_array:35:21 (Definition) [type=int []] [typekind=IncompleteArray] [isPOD=1] // CHECK: ParmDecl=incomplete_array:35:21 (Definition) [type=int []] [typekind=IncompleteArray] [isPOD=1]
// CHECK: VarDecl=variable_array:35:47 (Definition) [type=int [i]] [typekind=VariableArray] [isPOD=1] // CHECK: VarDecl=variable_array:35:47 (Definition) [type=int [i]] [typekind=VariableArray] [isPOD=1]
// CHECK: VarDecl=member_pointer:40:12 (Definition) [type=int Blob::*] [typekind=MemberPointer] [isPOD=1]

View File

@ -89,6 +89,7 @@ static CXTypeKind GetTypeKind(QualType T) {
TKCASE(VariableArray); TKCASE(VariableArray);
TKCASE(DependentSizedArray); TKCASE(DependentSizedArray);
TKCASE(Vector); TKCASE(Vector);
TKCASE(MemberPointer);
default: default:
return CXType_Unexposed; return CXType_Unexposed;
} }
@ -365,6 +366,9 @@ CXType clang_getPointeeType(CXType CT) {
case Type::ObjCObjectPointer: case Type::ObjCObjectPointer:
T = cast<ObjCObjectPointerType>(TP)->getPointeeType(); T = cast<ObjCObjectPointerType>(TP)->getPointeeType();
break; break;
case Type::MemberPointer:
T = cast<MemberPointerType>(TP)->getPointeeType();
break;
default: default:
T = QualType(); T = QualType();
break; break;
@ -478,6 +482,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
TKIND(VariableArray); TKIND(VariableArray);
TKIND(DependentSizedArray); TKIND(DependentSizedArray);
TKIND(Vector); TKIND(Vector);
TKIND(MemberPointer);
} }
#undef TKIND #undef TKIND
return cxstring::createRef(s); return cxstring::createRef(s);
@ -707,6 +712,17 @@ long long clang_Type_getAlignOf(CXType T) {
return Ctx.getTypeAlignInChars(QT).getQuantity(); return Ctx.getTypeAlignInChars(QT).getQuantity();
} }
CXType clang_Type_getClassType(CXType CT) {
QualType ET = QualType();
QualType T = GetQualType(CT);
const Type *TP = T.getTypePtrOrNull();
if (TP && TP->getTypeClass() == Type::MemberPointer) {
ET = QualType(cast<MemberPointerType> (TP)->getClass(), 0);
}
return MakeCXType(ET, GetTU(CT));
}
long long clang_Type_getSizeOf(CXType T) { long long clang_Type_getSizeOf(CXType T) {
if (T.kind == CXType_Invalid) if (T.kind == CXType_Invalid)
return CXTypeLayoutError_Invalid; return CXTypeLayoutError_Invalid;

View File

@ -61,6 +61,7 @@ clang_TParamCommandComment_isParamPositionValid
clang_TParamCommandComment_getDepth clang_TParamCommandComment_getDepth
clang_TParamCommandComment_getIndex clang_TParamCommandComment_getIndex
clang_Type_getAlignOf clang_Type_getAlignOf
clang_Type_getClassType
clang_Type_getSizeOf clang_Type_getSizeOf
clang_Type_getOffsetOf clang_Type_getOffsetOf
clang_VerbatimBlockLineComment_getText clang_VerbatimBlockLineComment_getText