]> granicus.if.org Git - clang/commitdiff
[libclang 3/8] Add support for AttributedType
authorMichael Wu <mwu.code@gmail.com>
Fri, 3 Aug 2018 04:21:25 +0000 (04:21 +0000)
committerMichael Wu <mwu.code@gmail.com>
Fri, 3 Aug 2018 04:21:25 +0000 (04:21 +0000)
Summary:
This patch adds support to the libclang API for identifying AttributedTypes in CXTypes and reading the modified type that the type points to. Currently AttributedTypes are skipped. This patch continues to skip AttributedTypes by default, but adds a parsing option to CXTranslationUnit to include AttributedTypes.

This patch depends on D49066 since it also adds a CXType.

Testing will be added in another patch which depends on this one.

Reviewers: yvvan, jbcoe

Reviewed By: yvvan

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D49081

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

include/clang-c/Index.h
tools/libclang/CXType.cpp
tools/libclang/libclang.exports

index 572d24acb24ccf83a01240b3aec6e2518e404b09..8e281cab910aecd01ccba1ad15d62dfbb339f14b 100644 (file)
@@ -1331,7 +1331,12 @@ enum CXTranslationUnit_Flags {
    *
    * The function bodies of the main file are not skipped.
    */
-  CXTranslationUnit_LimitSkipFunctionBodiesToPreamble = 0x800
+  CXTranslationUnit_LimitSkipFunctionBodiesToPreamble = 0x800,
+
+  /**
+   * Used to indicate that attributed types should be included in CXType.
+   */
+  CXTranslationUnit_IncludeAttributedTypes = 0x1000
 };
 
 /**
@@ -3268,7 +3273,8 @@ enum CXTypeKind {
   CXType_OCLReserveID = 160,
 
   CXType_ObjCObject = 161,
-  CXType_ObjCTypeParam = 162
+  CXType_ObjCTypeParam = 162,
+  CXType_Attributed = 163
 };
 
 /**
@@ -3817,6 +3823,13 @@ CINDEX_LINKAGE long long clang_Type_getSizeOf(CXType T);
  */
 CINDEX_LINKAGE long long clang_Type_getOffsetOf(CXType T, const char *S);
 
+/**
+ * Return the type that was modified by this attributed type.
+ *
+ * If the type is not an attributed type, an invalid type is returned.
+ */
+CINDEX_LINKAGE CXType clang_Type_getModifiedType(CXType T);
+
 /**
  * Return the offset of the field represented by the Cursor.
  *
index d9e0371b47be7bcf4b3bc8ddeb35695a1ea4aac2..89fdfa1708aec945490858696f68e2395f87a32f 100644 (file)
@@ -112,6 +112,7 @@ static CXTypeKind GetTypeKind(QualType T) {
     TKCASE(Auto);
     TKCASE(Elaborated);
     TKCASE(Pipe);
+    TKCASE(Attributed);
     default:
       return CXType_Unexposed;
   }
@@ -125,7 +126,9 @@ CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
   if (TU && !T.isNull()) {
     // Handle attributed types as the original type
     if (auto *ATT = T->getAs<AttributedType>()) {
-      return MakeCXType(ATT->getModifiedType(), TU);
+      if (!(TU->ParsingOptions & CXTranslationUnit_IncludeAttributedTypes)) {
+        return MakeCXType(ATT->getModifiedType(), TU);
+      }
     }
     // Handle paren types as the original type
     if (auto *PTT = T->getAs<ParenType>()) {
@@ -591,6 +594,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
     TKIND(Auto);
     TKIND(Elaborated);
     TKIND(Pipe);
+    TKIND(Attributed);
 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) TKIND(Id);
 #include "clang/Basic/OpenCLImageTypes.def"
 #undef IMAGE_TYPE
@@ -996,6 +1000,17 @@ long long clang_Type_getOffsetOf(CXType PT, const char *S) {
   return CXTypeLayoutError_InvalidFieldName;
 }
 
+CXType clang_Type_getModifiedType(CXType CT) {
+  QualType T = GetQualType(CT);
+  if (T.isNull())
+    return MakeCXType(QualType(), GetTU(CT));
+
+  if (auto *ATT = T->getAs<AttributedType>())
+    return MakeCXType(ATT->getModifiedType(), GetTU(CT));
+
+  return MakeCXType(QualType(), GetTU(CT));
+}
+
 long long clang_Cursor_getOffsetOfField(CXCursor C) {
   if (clang_isDeclaration(C.kind)) {
     // we need to validate the parent type
index 08353d7524ac920fb935f49c6463ee4081954d38..d6ccecb7bbbe44575790c2fbc9d72e0dfe3ad41e 100644 (file)
@@ -103,6 +103,7 @@ clang_Type_getNumObjCProtocolRefs
 clang_Type_getObjCProtocolDecl
 clang_Type_getNumObjCTypeArgs
 clang_Type_getObjCTypeArg
+clang_Type_getModifiedType
 clang_VerbatimBlockLineComment_getText
 clang_VerbatimLineComment_getText
 clang_HTMLTagComment_getAsString