diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-13 18:47:45 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-13 18:47:45 +0000 |
commit | c10a4c8baff3164bee9b7fc293679a5a5a90eb74 (patch) | |
tree | 680180423d03f28dd647ececd4ff1a2a672afade | |
parent | e422e45a6a89d450b8eca10f671b49874e87617a (diff) |
[libclang] Indexing API: Provide the protocols list for objc categories as well.
rdar://10573361
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146498 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang-c/Index.h | 15 | ||||
-rw-r--r-- | tools/libclang/Indexing.cpp | 3 | ||||
-rw-r--r-- | tools/libclang/IndexingContext.cpp | 7 | ||||
-rw-r--r-- | tools/libclang/IndexingContext.h | 1 |
4 files changed, 19 insertions, 7 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 8b0aed17a6..9da6b2370f 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -4239,13 +4239,6 @@ typedef struct { } CXIdxObjCContainerDeclInfo; typedef struct { - const CXIdxObjCContainerDeclInfo *containerInfo; - const CXIdxEntityInfo *objcClass; - CXCursor classCursor; - CXIdxLoc classLoc; -} CXIdxObjCCategoryDeclInfo; - -typedef struct { const CXIdxEntityInfo *base; CXCursor cursor; CXIdxLoc loc; @@ -4269,6 +4262,14 @@ typedef struct { } CXIdxObjCInterfaceDeclInfo; typedef struct { + const CXIdxObjCContainerDeclInfo *containerInfo; + const CXIdxEntityInfo *objcClass; + CXCursor classCursor; + CXIdxLoc classLoc; + const CXIdxObjCProtocolRefListInfo *protocols; +} CXIdxObjCCategoryDeclInfo; + +typedef struct { const CXIdxDeclInfo *declInfo; const CXIdxBaseClassInfo *const *bases; unsigned numBases; diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp index 50c37bc51f..630c55bb33 100644 --- a/tools/libclang/Indexing.cpp +++ b/tools/libclang/Indexing.cpp @@ -583,6 +583,9 @@ clang_index_getObjCProtocolRefListInfo(const CXIdxDeclInfo *DInfo) { ProtInfo = dyn_cast<ObjCProtocolDeclInfo>(DI)) return &ProtInfo->ObjCProtoRefListInfo; + if (const ObjCCategoryDeclInfo *CatInfo = dyn_cast<ObjCCategoryDeclInfo>(DI)) + return CatInfo->ObjCCatDeclInfo.protocols; + return 0; } diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index 66e552c8f4..812669397d 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -383,6 +383,8 @@ bool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { if (suppressRefs()) markEntityOccurrenceInFile(IFaceD, ClassLoc); + ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA); + CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; if (IFaceD) { CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; @@ -393,6 +395,9 @@ bool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor(); } CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); + CatDInfo.ObjCProtoListInfo = ProtInfo.getListInfo(); + CatDInfo.ObjCCatDeclInfo.protocols = &CatDInfo.ObjCProtoListInfo; + return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); } @@ -416,6 +421,8 @@ bool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor(); } CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); + CatDInfo.ObjCCatDeclInfo.protocols = 0; + return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); } diff --git a/tools/libclang/IndexingContext.h b/tools/libclang/IndexingContext.h index 1ad1d809ee..b9234d88b3 100644 --- a/tools/libclang/IndexingContext.h +++ b/tools/libclang/IndexingContext.h @@ -149,6 +149,7 @@ struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo { struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo { CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo; + CXIdxObjCProtocolRefListInfo ObjCProtoListInfo; explicit ObjCCategoryDeclInfo(bool isImplementation) : ObjCContainerDeclInfo(Info_ObjCCategory, |