]> granicus.if.org Git - clang/commitdiff
[libclang] Introduce clang_Type_getClassType which returns the class type of a member...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 3 Oct 2013 16:19:23 +0000 (16:19 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 3 Oct 2013 16:19:23 +0000 (16:19 +0000)
Patch by Che-Liang Chiou!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191906 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/python/clang/cindex.py
include/clang-c/Index.h
test/Index/print-type.cpp
tools/libclang/CXType.cpp
tools/libclang/libclang.exports

index fc32394a3f6bd7d71248ecefffb6b114285612d2..be65ebe39a54612268f34b00d6cf59d7f62010d4 100644 (file)
@@ -1487,6 +1487,7 @@ TypeKind.VECTOR = TypeKind(113)
 TypeKind.INCOMPLETEARRAY = TypeKind(114)
 TypeKind.VARIABLEARRAY = TypeKind(115)
 TypeKind.DEPENDENTSIZEDARRAY = TypeKind(116)
+TypeKind.MEMBERPOINTER = TypeKind(117)
 
 class Type(Structure):
     """
@@ -1662,6 +1663,12 @@ class Type(Structure):
         """
         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):
         """
         Retrieve the alignment of the record.
@@ -2694,6 +2701,11 @@ functionList = [
    [Type],
    c_longlong),
 
+  ("clang_Type_getClassType",
+   [Type],
+   Type,
+   Type.from_result),
+
   ("clang_getFieldDeclBitWidth",
    [Cursor],
    c_int),
index 4285cc5922f8dc743afaee60f0bca56ab47ac39c..ca0bc14eb2725a751ee383989688dd09156689d7 100644 (file)
@@ -2678,7 +2678,8 @@ enum CXTypeKind {
   CXType_Vector = 113,
   CXType_IncompleteArray = 114,
   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);
 
+/**
+ * \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.
  *
index 5a9a06cfe55531224f5e4c33daa7f0fae634a73d..6324d439a6d5bf1063216bde0b9c2de683f3b8c1 100644 (file)
@@ -34,6 +34,11 @@ T tbar(int[size]);
 
 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
 // CHECK: Namespace=outer:1:11 (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=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=member_pointer:40:12 (Definition) [type=int Blob::*] [typekind=MemberPointer] [isPOD=1]
index a7d6386b0270785308b04818a3d3548d5daec168..9233e975f6ddf65b809bbeff4ccd820435086577 100644 (file)
@@ -89,6 +89,7 @@ static CXTypeKind GetTypeKind(QualType T) {
     TKCASE(VariableArray);
     TKCASE(DependentSizedArray);
     TKCASE(Vector);
+    TKCASE(MemberPointer);
     default:
       return CXType_Unexposed;
   }
@@ -365,6 +366,9 @@ CXType clang_getPointeeType(CXType CT) {
     case Type::ObjCObjectPointer:
       T = cast<ObjCObjectPointerType>(TP)->getPointeeType();
       break;
+    case Type::MemberPointer:
+      T = cast<MemberPointerType>(TP)->getPointeeType();
+      break;
     default:
       T = QualType();
       break;
@@ -478,6 +482,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
     TKIND(VariableArray);
     TKIND(DependentSizedArray);
     TKIND(Vector);
+    TKIND(MemberPointer);
   }
 #undef TKIND
   return cxstring::createRef(s);
@@ -707,6 +712,17 @@ long long clang_Type_getAlignOf(CXType T) {
   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) {
   if (T.kind == CXType_Invalid)
     return CXTypeLayoutError_Invalid;
index 92b060a1692f59f3d42812170dd8721759dd61e5..6f6e39228df660a086fcc35037be81e021c05866 100644 (file)
@@ -61,6 +61,7 @@ clang_TParamCommandComment_isParamPositionValid
 clang_TParamCommandComment_getDepth
 clang_TParamCommandComment_getIndex
 clang_Type_getAlignOf
+clang_Type_getClassType
 clang_Type_getSizeOf
 clang_Type_getOffsetOf
 clang_VerbatimBlockLineComment_getText