diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-11-16 02:35:05 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-11-16 02:35:05 +0000 |
commit | df15c209799f6f1a557ebe55916fa36407b09551 (patch) | |
tree | 5b17cdcc55071f2677e83b64c3abded2bdf718fa | |
parent | d7b8790003fb06796fb4d34284fdb5f7bed23acf (diff) | |
download | bcm5719-llvm-df15c209799f6f1a557ebe55916fa36407b09551.tar.gz bcm5719-llvm-df15c209799f6f1a557ebe55916fa36407b09551.zip |
[libclang] Indexing API: fill the objc category info for a category implementation and
do not crash if no client container is registered for a declaration context.
llvm-svn: 144765
-rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 5 | ||||
-rw-r--r-- | clang/tools/libclang/IndexingContext.cpp | 19 |
2 files changed, 20 insertions, 4 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 56b555213ac..c4792784577 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -1610,7 +1610,10 @@ static CXIdxClientContainer makeClientContainer(const CXIdxEntityInfo *info, } static void printCXIndexContainer(CXIdxClientContainer container) { - printf("[%s]", (const char *)container); + if (!container) + printf("[<<NULL>>]"); + else + printf("[%s]", (const char *)container); } static const char *getEntityKindString(CXIdxEntityKind kind) { diff --git a/clang/tools/libclang/IndexingContext.cpp b/clang/tools/libclang/IndexingContext.cpp index 3ecc560d350..890336e3ac0 100644 --- a/clang/tools/libclang/IndexingContext.cpp +++ b/clang/tools/libclang/IndexingContext.cpp @@ -259,11 +259,22 @@ void IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true); CXIdxEntityInfo ClassEntity; StrAdapter SA(*this); - getEntityInfo(CatD->getClassInterface(), ClassEntity, SA); + const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface(); + SourceLocation ClassLoc = D->getLocation(); + SourceLocation CategoryLoc = ClassLoc; //FIXME: D->getCategoryNameLoc(); + getEntityInfo(IFaceD, ClassEntity, SA); CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; - CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; - handleObjCContainer(D, D->getLocation(), getCursor(D), CatDInfo); + if (IFaceD) { + CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; + CatDInfo.ObjCCatDeclInfo.classCursor = + MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU); + } else { + CatDInfo.ObjCCatDeclInfo.objcClass = 0; + CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor(); + } + CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); + handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); } void IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) { @@ -402,6 +413,8 @@ CXIdxClientContainer IndexingContext::getIndexContainerForDC(const DeclContext *DC) const { DC = getScopedContext(DC); ContainerMapTy::const_iterator I = ContainerMap.find(DC); + if (I == ContainerMap.end()) + return 0; // assert(I != ContainerMap.end() && // "Failed to include a scoped context in the container map"); return I->second; |