aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-11-12 02:16:30 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-11-12 02:16:30 +0000
commit6ec43adc39006a7fce94188956d0239bd54c0363 (patch)
tree76689d6b1d0528535ca34a1e44005a1f9fdba94e /tools
parent23d29c861f2770fe9f99ba80cca2e7cf4ac675ea (diff)
[libclang] Further simplify the indexing API.
That stuff can be added later on if we need them. Also add some const goodness. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144446 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/c-index-test/c-index-test.c174
-rw-r--r--tools/libclang/IndexDecl.cpp15
-rw-r--r--tools/libclang/IndexTypeSourceInfo.cpp2
-rw-r--r--tools/libclang/Indexing.cpp88
-rw-r--r--tools/libclang/IndexingContext.cpp269
-rw-r--r--tools/libclang/IndexingContext.h62
-rw-r--r--tools/libclang/libclang.exports5
7 files changed, 199 insertions, 416 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 833c5b47b2..ac2ab4fdd9 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -1577,7 +1577,8 @@ static void printCXIndexLoc(CXIdxLoc loc) {
printf("%d:%d", line, column);
}
-static CXIdxClientEntity makeClientEntity(CXIdxEntityInfo *info, CXIdxLoc loc) {
+static CXIdxClientContainer makeClientContainer(const CXIdxEntityInfo *info,
+ CXIdxLoc loc) {
const char *name;
char *newStr;
CXIdxClientFile file;
@@ -1591,7 +1592,7 @@ static CXIdxClientEntity makeClientEntity(CXIdxEntityInfo *info, CXIdxLoc loc) {
/* FIXME: free these.*/
newStr = (char *)malloc(strlen(name) + 10);
sprintf(newStr, "%s:%d:%d", name, line, column);
- return (CXIdxClientEntity)newStr;
+ return (CXIdxClientContainer)newStr;
}
static void printCXIndexContainer(CXIdxClientContainer container) {
@@ -1617,12 +1618,13 @@ static const char *getEntityKindString(CXIdxEntityKind kind) {
case CXIdxEntity_Union: return "union";
case CXIdxEntity_CXXClass: return "c++-class";
}
- return "<unknown>";
+ assert(0 && "Garbage entity kind");
+ return 0;
}
static void printEntityInfo(const char *cb,
CXClientData client_data,
- CXIdxEntityInfo *info) {
+ const CXIdxEntityInfo *info) {
const char *name;
IndexData *index_data;
index_data = (IndexData *)client_data;
@@ -1670,7 +1672,7 @@ static CXIdxClientFile index_enteredMainFile(CXClientData client_data,
}
static CXIdxClientFile index_ppIncludedFile(CXClientData client_data,
- CXIdxIncludedFileInfo *info) {
+ const CXIdxIncludedFileInfo *info) {
IndexData *index_data;
index_data = (IndexData *)client_data;
printCheck(index_data);
@@ -1685,62 +1687,6 @@ static CXIdxClientFile index_ppIncludedFile(CXClientData client_data,
return (CXIdxClientFile)info->file;
}
-static CXIdxClientMacro index_ppMacroDefined(CXClientData client_data,
- CXIdxMacroDefinedInfo *info) {
- IndexData *index_data;
- index_data = (IndexData *)client_data;
- printCheck(index_data);
-
- printf("[ppMacroDefined]: %s", info->macroInfo->name);
- printf(" | loc: ");
- printCXIndexLoc(info->macroInfo->loc);
- printf(" | defBegin: ");
- printCXIndexLoc(info->defBegin);
- printf(" | length: %d\n", info->defLength);
-
- return (CXIdxClientMacro)info->macroInfo->name;
-}
-
-static void index_ppMacroUndefined(CXClientData client_data,
- CXIdxMacroUndefinedInfo *info) {
- IndexData *index_data;
- index_data = (IndexData *)client_data;
- printCheck(index_data);
-
- printf("[ppMacroUndefined]: %s", info->name);
- printf(" | loc: ");
- printCXIndexLoc(info->loc);
- printf("\n");
-}
-
-static void index_ppMacroExpanded(CXClientData client_data,
- CXIdxMacroExpandedInfo *info) {
- IndexData *index_data;
- index_data = (IndexData *)client_data;
- printCheck(index_data);
-
- printf("[ppMacroExpanded]: %s", info->name);
- printf(" | loc: ");
- printCXIndexLoc(info->loc);
- printf("\n");
-}
-
-static CXIdxClientEntity index_importedEntity(CXClientData client_data,
- CXIdxImportedEntityInfo *info) {
- IndexData *index_data;
- index_data = (IndexData *)client_data;
- printCheck(index_data);
-
- printEntityInfo("[importedEntity]", client_data, info->entityInfo);
- printf(" | cursor: ");
- PrintCursor(info->cursor);
- printf(" | loc: ");
- printCXIndexLoc(info->loc);
- printf("\n");
-
- return makeClientEntity(info->entityInfo, info->loc);
-}
-
static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_data,
void *reserved) {
IndexData *index_data;
@@ -1751,9 +1697,14 @@ static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_dat
return (CXIdxClientContainer)"TU";
}
-static CXIdxClientEntity index_indexDeclaration(CXClientData client_data,
- CXIdxDeclInfo *info) {
+static void index_indexDeclaration(CXClientData client_data,
+ const CXIdxDeclInfo *info,
+ const CXIdxDeclOut *outData) {
IndexData *index_data;
+ const CXIdxObjCCategoryDeclInfo *CatInfo;
+ const CXIdxObjCInterfaceDeclInfo *InterInfo;
+ const CXIdxObjCProtocolDeclInfo *ProtoInfo;
+ unsigned i;
index_data = (IndexData *)client_data;
printEntityInfo("[indexDeclaration]", client_data, info->entityInfo);
@@ -1766,13 +1717,6 @@ static CXIdxClientEntity index_indexDeclaration(CXClientData client_data,
printf(" | isRedecl: %d", info->isRedeclaration);
printf(" | isDef: %d\n", info->isDefinition);
-
- if (clang_index_isEntityTagKind(info->entityInfo->kind)) {
- printCheck(index_data);
- printf(" <TagInfo>: isAnonymous: %d\n",
- clang_index_getTagDeclInfo(info)->isAnonymous);
- }
-
if (clang_index_isEntityObjCContainerKind(info->entityInfo->kind)) {
const char *kindName = 0;
CXIdxObjCContainerKind K = clang_index_getObjCContainerDeclInfo(info)->kind;
@@ -1788,64 +1732,51 @@ static CXIdxClientEntity index_indexDeclaration(CXClientData client_data,
printf(" <ObjCContainerInfo>: kind: %s\n", kindName);
}
- if (clang_index_isEntityObjCCategoryKind(info->entityInfo->kind)) {
- CXIdxObjCCategoryDeclInfo *
- CatInfo = clang_index_getObjCCategoryDeclInfo(info);
+ if ((CatInfo = clang_index_getObjCCategoryDeclInfo(info))) {
printEntityInfo(" <ObjCCategoryInfo>: class", client_data,
CatInfo->objcClass);
printf("\n");
}
- if (!info->isRedeclaration)
- return makeClientEntity(info->entityInfo, info->loc);
-
- return 0;
-}
-
-static CXIdxClientContainer
-index_startedContainer(CXClientData client_data, CXIdxContainerInfo *info) {
- printEntityInfo("[startedContainer]", client_data, info->entity);
- printf(" | cursor: ");
- PrintCursor(info->cursor);
- printf(" | loc: ");
- printCXIndexLoc(info->loc);
- printf(" | isObjCImpl: %d\n", info->isObjCImpl);
-
- return (CXIdxClientContainer)info->entity->clientEntity;
-}
-
-static void index_defineObjCClass(CXClientData client_data,
- CXIdxObjCClassDefineInfo *info) {
- printEntityInfo("[defineObjCClass]", client_data, info->objcClass);
- printf(" | cursor: ");
- PrintCursor(info->cursor);
- printf(" | container: ");
- printCXIndexContainer(info->container);
-
- if (info->baseInfo) {
- printEntityInfo(" | <base>", client_data, info->baseInfo->objcClass);
- printf(" | base loc: ");
- printCXIndexLoc(info->baseInfo->loc);
+ if ((InterInfo = clang_index_getObjCInterfaceDeclInfo(info))) {
+ if (InterInfo->superInfo) {
+ printEntityInfo(" <ObjCInterfaceInfo>: base", client_data,
+ InterInfo->superInfo->base);
+ printf(" | cursor: ");
+ PrintCursor(InterInfo->superInfo->cursor);
+ printf(" | loc: ");
+ printCXIndexLoc(InterInfo->superInfo->loc);
+ printf("\n");
+ }
+ for (i = 0; i < InterInfo->numProtocols; ++i) {
+ printEntityInfo(" <ObjCInterfaceInfo>: protocol", client_data,
+ InterInfo->protocols[i]->protocol);
+ printf(" | cursor: ");
+ PrintCursor(InterInfo->protocols[i]->cursor);
+ printf(" | loc: ");
+ printCXIndexLoc(InterInfo->protocols[i]->loc);
+ printf("\n");
+ }
}
- printf("\n");
-}
-
-static void index_endedContainer(CXClientData client_data,
- CXIdxEndContainerInfo *info) {
- IndexData *index_data;
- index_data = (IndexData *)client_data;
- printCheck(index_data);
+ if ((ProtoInfo = clang_index_getObjCProtocolDeclInfo(info))) {
+ for (i = 0; i < ProtoInfo->numProtocols; ++i) {
+ printEntityInfo(" <ObjCProtocolInfo>: protocol", client_data,
+ ProtoInfo->protocols[i]->protocol);
+ printf(" | cursor: ");
+ PrintCursor(ProtoInfo->protocols[i]->cursor);
+ printf(" | loc: ");
+ printCXIndexLoc(ProtoInfo->protocols[i]->loc);
+ printf("\n");
+ }
+ }
- printf("[endedContainer]: ");
- printCXIndexContainer(info->container);
- printf(" | end: ");
- printCXIndexLoc(info->endLoc);
- printf("\n");
+ if (outData->outContainer)
+ *outData->outContainer = makeClientContainer(info->entityInfo, info->loc);
}
static void index_indexEntityReference(CXClientData client_data,
- CXIdxEntityRefInfo *info) {
+ const CXIdxEntityRefInfo *info) {
printEntityInfo("[indexEntityReference]", client_data, info->referencedEntity);
printf(" | cursor: ");
PrintCursor(info->cursor);
@@ -1863,20 +1794,13 @@ static void index_indexEntityReference(CXClientData client_data,
}
static IndexerCallbacks IndexCB = {
+ 0, /*abortQuery*/
index_diagnostic,
index_enteredMainFile,
index_ppIncludedFile,
- index_ppMacroDefined,
- index_ppMacroUndefined,
- index_ppMacroExpanded,
0, /*importedASTFile*/
- index_importedEntity,
- 0,/*index_importedMacro,*/
index_startedTranslationUnit,
index_indexDeclaration,
- index_startedContainer,
- index_defineObjCClass,
- index_endedContainer,
index_indexEntityReference
};
diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp
index 5087355a8d..58f449d3cc 100644
--- a/tools/libclang/IndexDecl.cpp
+++ b/tools/libclang/IndexDecl.cpp
@@ -29,9 +29,7 @@ public:
if (D->isThisDeclarationADefinition()) {
const Stmt *Body = D->getBody();
if (Body) {
- IndexCtx.startContainer(D, /*isBody=*/true);
IndexCtx.indexBody(Body, D);
- IndexCtx.endContainer(D);
}
}
return true;
@@ -93,10 +91,7 @@ public:
IndexCtx.handleObjCInterface(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.startContainer(D);
- IndexCtx.defineObjCInterface(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.endContainer(D);
return true;
}
@@ -108,9 +103,7 @@ public:
IndexCtx.handleObjCProtocol(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.endContainer(D);
return true;
}
@@ -118,9 +111,7 @@ public:
IndexCtx.handleObjCImplementation(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.endContainer(D);
return true;
}
@@ -128,9 +119,7 @@ public:
IndexCtx.handleObjCCategory(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.endContainer(D);
return true;
}
@@ -141,9 +130,7 @@ public:
IndexCtx.handleObjCCategoryImpl(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.endContainer(D);
return true;
}
@@ -157,9 +144,7 @@ public:
if (D->isThisDeclarationADefinition()) {
const Stmt *Body = D->getBody();
if (Body) {
- IndexCtx.startContainer(D, /*isBody=*/true);
IndexCtx.indexBody(Body, D);
- IndexCtx.endContainer(D);
}
}
return true;
diff --git a/tools/libclang/IndexTypeSourceInfo.cpp b/tools/libclang/IndexTypeSourceInfo.cpp
index bba9dbb6e7..b63ebddfb0 100644
--- a/tools/libclang/IndexTypeSourceInfo.cpp
+++ b/tools/libclang/IndexTypeSourceInfo.cpp
@@ -87,8 +87,6 @@ void IndexingContext::indexTypeLoc(TypeLoc TL,
void IndexingContext::indexTagDecl(const TagDecl *D) {
handleTagDecl(D);
if (D->isThisDeclarationADefinition()) {
- startContainer(D);
indexDeclContext(D);
- endContainer(D);
}
}
diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp
index 4bea88f8de..8d90505971 100644
--- a/tools/libclang/Indexing.cpp
+++ b/tools/libclang/Indexing.cpp
@@ -75,47 +75,16 @@ public:
/// MacroDefined - This hook is called whenever a macro definition is seen.
virtual void MacroDefined(const Token &Id, const MacroInfo *MI) {
- if (MI->isBuiltinMacro())
- return;
- if (IndexCtx.isNotFromSourceFile(MI->getDefinitionLoc()))
- return;
-
- SourceLocation Loc = MI->getDefinitionLoc();
- SourceLocation DefBegin = MI->tokens_empty() ? Loc
- : MI->getReplacementToken(0).getLocation();
- IndexCtx.ppMacroDefined(Loc,
- Id.getIdentifierInfo()->getName(),
- DefBegin,
- MI->getDefinitionLength(PP.getSourceManager()),
- MI);
}
/// MacroUndefined - This hook is called whenever a macro #undef is seen.
/// MI is released immediately following this callback.
virtual void MacroUndefined(const Token &MacroNameTok, const MacroInfo *MI) {
- if (MI->isBuiltinMacro())
- return;
- if (IndexCtx.isNotFromSourceFile(MI->getDefinitionLoc()))
- return;
-
- SourceLocation Loc = MacroNameTok.getLocation();
- IndexCtx.ppMacroUndefined(Loc,
- MacroNameTok.getIdentifierInfo()->getName(),
- MI);
}
/// MacroExpands - This is called by when a macro invocation is found.
virtual void MacroExpands(const Token &MacroNameTok, const MacroInfo* MI,
SourceRange Range) {
- if (MI->isBuiltinMacro())
- return;
- if (IndexCtx.isNotFromSourceFile(MI->getDefinitionLoc()))
- return;
-
- SourceLocation Loc = MacroNameTok.getLocation();
- IndexCtx.ppMacroExpanded(Loc,
- MacroNameTok.getIdentifierInfo()->getName(),
- MI);
}
/// SourceRangeSkipped - This hook is called when a source range is skipped.
@@ -140,11 +109,10 @@ public:
virtual void Initialize(ASTContext &Context) {
IndexCtx.setASTContext(Context);
- IndexCtx.invokeStartedTranslationUnit();
+ IndexCtx.startedTranslationUnit();
}
virtual void HandleTranslationUnit(ASTContext &Ctx) {
- IndexCtx.invokeFinishedTranslationUnit();
}
virtual void HandleTopLevelDecl(DeclGroupRef DG) {
@@ -404,41 +372,57 @@ static void clang_indexTranslationUnit_Impl(void *UserData) {
extern "C" {
-int clang_index_isEntityTagKind(CXIdxEntityKind K) {
- return CXIdxEntity_Enum <= K && K <= CXIdxEntity_CXXClass;
+int clang_index_isEntityObjCContainerKind(CXIdxEntityKind K) {
+ return CXIdxEntity_ObjCClass <= K && K <= CXIdxEntity_ObjCCategory;
}
-CXIdxTagDeclInfo *clang_index_getTagDeclInfo(CXIdxDeclInfo *DInfo) {
- if (clang_index_isEntityTagKind(DInfo->entityInfo->kind))
- return &static_cast<TagDeclInfo*>(DInfo)->CXTagDeclInfo;
+const CXIdxObjCContainerDeclInfo *
+clang_index_getObjCContainerDeclInfo(const CXIdxDeclInfo *DInfo) {
+ if (!DInfo)
+ return 0;
+
+ if (clang_index_isEntityObjCContainerKind(DInfo->entityInfo->kind))
+ return &static_cast<const ObjCContainerDeclInfo*>(DInfo)->ObjCContDeclInfo;
return 0;
}
-int clang_index_isEntityObjCContainerKind(CXIdxEntityKind K) {
- return CXIdxEntity_ObjCClass <= K && K <= CXIdxEntity_ObjCCategory;
-}
+const CXIdxObjCInterfaceDeclInfo *
+clang_index_getObjCInterfaceDeclInfo(const CXIdxDeclInfo *DInfo) {
+ if (!DInfo || DInfo->entityInfo->kind != CXIdxEntity_ObjCClass)
+ return 0;
-CXIdxObjCContainerDeclInfo *
-clang_index_getObjCContainerDeclInfo(CXIdxDeclInfo *DInfo) {
- if (clang_index_isEntityObjCContainerKind(DInfo->entityInfo->kind))
- return &static_cast<ObjCContainerDeclInfo*>(DInfo)->CXObjCContDeclInfo;
+ if (const CXIdxObjCContainerDeclInfo *
+ ContInfo = clang_index_getObjCContainerDeclInfo(DInfo)) {
+ if (ContInfo->kind == CXIdxObjCContainer_Interface)
+ return &static_cast<const ObjCInterfaceDeclInfo*>(DInfo)->ObjCInterDeclInfo;
+ }
return 0;
}
-int clang_index_isEntityObjCCategoryKind(CXIdxEntityKind K) {
- return K == CXIdxEntity_ObjCCategory;
-}
+const CXIdxObjCProtocolDeclInfo *
+clang_index_getObjCProtocolDeclInfo(const CXIdxDeclInfo *DInfo) {
+ if (!DInfo || DInfo->entityInfo->kind != CXIdxEntity_ObjCProtocol)
+ return 0;
-CXIdxObjCCategoryDeclInfo *
-clang_index_getObjCCategoryDeclInfo(CXIdxDeclInfo *DInfo){
- if (clang_index_isEntityObjCCategoryKind(DInfo->entityInfo->kind))
- return &static_cast<ObjCCategoryDeclInfo*>(DInfo)->CXObjCCatDeclInfo;
+ if (const CXIdxObjCContainerDeclInfo *
+ ContInfo = clang_index_getObjCContainerDeclInfo(DInfo)) {
+ if (ContInfo->kind == CXIdxObjCContainer_Interface)
+ return &static_cast<const ObjCProtocolDeclInfo*>(DInfo)->ObjCProtoDeclInfo;
+ }
return 0;
}
+const CXIdxObjCCategoryDeclInfo *
+clang_index_getObjCCategoryDeclInfo(const CXIdxDeclInfo *DInfo){
+ if (!DInfo || DInfo->entityInfo->kind != CXIdxEntity_ObjCCategory)
+ return 0;
+
+ return &static_cast<const ObjCCategoryDeclInfo*>(DInfo)->ObjCCatDeclInfo;
+}
+
int clang_indexTranslationUnit(CXIndex CIdx,
CXClientData client_data,
IndexerCallbacks *index_callbacks,
diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp
index 3d3277210e..d612a3b213 100644
--- a/tools/libclang/IndexingContext.cpp
+++ b/tools/libclang/IndexingContext.cpp
@@ -18,6 +18,30 @@ using namespace clang;
using namespace cxindex;
using namespace cxcursor;
+IndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo(
+ const ObjCProtocolList &ProtList,
+ IndexingContext &IdxCtx,
+ StrAdapter &SA) {
+ ObjCInterfaceDecl::protocol_loc_iterator LI = ProtList.loc_begin();
+ for (ObjCInterfaceDecl::protocol_iterator
+ I = ProtList.begin(), E = ProtList.end(); I != E; ++I, ++LI) {
+ SourceLocation Loc = *LI;
+ ObjCProtocolDecl *PD = *I;
+ ProtEntities.push_back(CXIdxEntityInfo());
+ IdxCtx.getEntityInfo(PD, ProtEntities.back(), SA);
+ CXIdxObjCProtocolRefInfo ProtInfo = { 0,
+ MakeCursorObjCProtocolRef(PD, Loc, IdxCtx.CXTU),
+ IdxCtx.getIndexLoc(Loc) };
+ ProtInfos.push_back(ProtInfo);
+ }
+
+ for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
+ ProtInfos[i].protocol = &ProtEntities[i];
+
+ for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
+ Prots.push_back(&ProtInfos[i]);
+}
+
const char *IndexingContext::StrAdapter::toCStr(StringRef Str) {
if (Str.empty())
return "";
@@ -56,53 +80,13 @@ void IndexingContext::ppIncludedFile(SourceLocation hashLoc,
FileMap[File] = idxFile;
}
-void IndexingContext::ppMacroDefined(SourceLocation Loc, StringRef Name,
- SourceLocation DefBegin, unsigned Length,
- const void *OpaqueMacro) {
- if (!CB.ppMacroDefined)
- return;
-
- StrAdapter SA(*this);
- CXIdxMacroInfo MacroInfo = { getIndexLoc(Loc), SA.toCStr(Name) };
- CXIdxMacroDefinedInfo Info = { &MacroInfo,
- getIndexLoc(DefBegin), Length };
- CXIdxClientMacro idxMacro = CB.ppMacroDefined(ClientData, &Info);
- MacroMap[OpaqueMacro] = idxMacro;
-}
-
-void IndexingContext::ppMacroUndefined(SourceLocation Loc, StringRef Name,
- const void *OpaqueMacro) {
- if (!CB.ppMacroUndefined)
- return;
-
- StrAdapter SA(*this);
- CXIdxMacroUndefinedInfo Info = { getIndexLoc(Loc),
- SA.toCStr(Name), 0 };
- CB.ppMacroUndefined(ClientData, &Info);
-}
-
-void IndexingContext::ppMacroExpanded(SourceLocation Loc, StringRef Name,
- const void *OpaqueMacro) {
- if (!CB.ppMacroExpanded)
- return;
-
- StrAdapter SA(*this);
- CXIdxMacroExpandedInfo Info = { getIndexLoc(Loc),
- SA.toCStr(Name), 0 };
- CB.ppMacroExpanded(ClientData, &Info);
-}
-
-void IndexingContext::invokeStartedTranslationUnit() {
+void IndexingContext::startedTranslationUnit() {
CXIdxClientContainer idxCont = 0;
if (CB.startedTranslationUnit)
idxCont = CB.startedTranslationUnit(ClientData, 0);
addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont);
}
-void IndexingContext::invokeFinishedTranslationUnit() {
- endContainer(Ctx->getTranslationUnitDecl());
-}
-
void IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) {
if (!CB.diagnostic)
return;
@@ -114,6 +98,7 @@ void IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) {
void IndexingContext::handleDecl(const NamedDecl *D,
SourceLocation Loc, CXCursor Cursor,
bool isRedeclaration, bool isDefinition,
+ bool isContainer,
DeclInfo &DInfo) {
if (!CB.indexDeclaration)
return;
@@ -127,11 +112,12 @@ void IndexingContext::handleDecl(const NamedDecl *D,
DInfo.isRedeclaration = isRedeclaration;
DInfo.isDefinition = isDefinition;
- CXIdxClientEntity
- clientEnt = CB.indexDeclaration(ClientData, &DInfo);
+ CXIdxClientContainer clientCont = 0;
+ CXIdxDeclOut DeclOut = { isContainer ? &clientCont : 0 };
+ CB.indexDeclaration(ClientData, &DInfo, &DeclOut);
- if (!isRedeclaration)
- addEntityInMap(D, clientEnt);
+ if (isContainer)
+ addContainerInMap(cast<DeclContext>(D), clientCont);
}
void IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
@@ -140,57 +126,59 @@ void IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
bool isRedeclaration,
bool isImplementation,
ObjCContainerDeclInfo &ContDInfo) {
- ContDInfo.CXObjCContDeclInfo.declInfo = &ContDInfo;
+ ContDInfo.ObjCContDeclInfo.declInfo = &ContDInfo;
if (isForwardRef)
- ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
+ ContDInfo.ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
else if (isImplementation)
- ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
+ ContDInfo.ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
else
- ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
+ ContDInfo.ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
handleDecl(D, Loc, Cursor,
- isRedeclaration, /*isDefinition=*/!isForwardRef, ContDInfo);
+ isRedeclaration, /*isDefinition=*/!isForwardRef,
+ /*isContainer=*/!isForwardRef, ContDInfo);
}
void IndexingContext::handleFunction(const FunctionDecl *D) {
DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
- DInfo);
+ D->isThisDeclarationADefinition(), DInfo);
}
void IndexingContext::handleVar(const VarDecl *D) {
DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
- DInfo);
+ /*isContainer=*/false, DInfo);
}
void IndexingContext::handleField(const FieldDecl *D) {
DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
- /*isRedeclaration=*/false, /*isDefinition=*/false, DInfo);
+ /*isRedeclaration=*/false, /*isDefinition=*/true,
+ /*isContainer=*/false, DInfo);
}
void IndexingContext::handleEnumerator(const EnumConstantDecl *D) {
DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
- /*isRedeclaration=*/false, /*isDefinition=*/true, DInfo);
+ /*isRedeclaration=*/false, /*isDefinition=*/true,
+ /*isContainer=*/false, DInfo);
}
void IndexingContext::handleTagDecl(const TagDecl *D) {
- TagDeclInfo TagDInfo;
- TagDInfo.CXTagDeclInfo.declInfo = &TagDInfo;
- TagDInfo.CXTagDeclInfo.isAnonymous = D->getIdentifier() == 0;
+ DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
- TagDInfo);
+ D->isThisDeclarationADefinition(), DInfo);
}
void IndexingContext::handleTypedef(const TypedefDecl *D) {
DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
- !D->isFirstDeclaration(), /*isDefinition=*/true, DInfo);
+ !D->isFirstDeclaration(), /*isDefinition=*/true,
+ /*isContainer=*/false, DInfo);
}
void IndexingContext::handleObjCClass(const ObjCClassDecl *D) {
@@ -205,18 +193,38 @@ void IndexingContext::handleObjCClass(const ObjCClassDecl *D) {
}
void IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) {
- ObjCContainerDeclInfo ContDInfo;
+ StrAdapter SA(*this);
+
+ CXIdxBaseClassInfo BaseClass;
+ CXIdxEntityInfo BaseEntity;
+ BaseClass.cursor = clang_getNullCursor();
+ if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) {
+ getEntityInfo(SuperD, BaseEntity, SA);
+ SourceLocation SuperLoc = D->getSuperClassLoc();
+ BaseClass.base = &BaseEntity;
+ BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU);
+ BaseClass.loc = getIndexLoc(SuperLoc);
+ }
+
+ ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA);
+
+ ObjCInterfaceDeclInfo InterInfo;
+ InterInfo.ObjCInterDeclInfo.declInfo = &InterInfo;
+ InterInfo.ObjCInterDeclInfo.superInfo = D->getSuperClass() ? &BaseClass : 0;
+ InterInfo.ObjCInterDeclInfo.protocols = ProtInfo.getProtocolRefs();
+ InterInfo.ObjCInterDeclInfo.numProtocols = ProtInfo.getNumProtocols();
+
handleObjCContainer(D, D->getLocation(), getCursor(D),
/*isForwardRef=*/false,
/*isRedeclaration=*/D->isInitiallyForwardDecl(),
- /*isImplementation=*/false, ContDInfo);
+ /*isImplementation=*/false, InterInfo);
}
void IndexingContext::handleObjCImplementation(
const ObjCImplementationDecl *D) {
ObjCContainerDeclInfo ContDInfo;
const ObjCInterfaceDecl *Class = D->getClassInterface();
- handleObjCContainer(Class, D->getLocation(), getCursor(D),
+ handleObjCContainer(D, D->getLocation(), getCursor(D),
/*isForwardRef=*/false,
/*isRedeclaration=*/!Class->isImplicitInterfaceDecl(),
/*isImplementation=*/true, ContDInfo);
@@ -233,55 +241,18 @@ void IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D,
}
void IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) {
- ObjCContainerDeclInfo ContDInfo;
- handleObjCContainer(D, D->getLocation(), getCursor(D),
- /*isForwardRef=*/false,
- /*isRedeclaration=*/D->isInitiallyForwardDecl(),
- /*isImplementation=*/false, ContDInfo);
-}
-
-void IndexingContext::defineObjCInterface(const ObjCInterfaceDecl *D) {
- if (!CB.defineObjCClass)
- return;
-
StrAdapter SA(*this);
- CXIdxObjCBaseClassInfo BaseClass;
- CXIdxEntityInfo BaseEntity;
- if (D->getSuperClass()) {
- getEntityInfo(D->getSuperClass(), BaseEntity, SA);
- BaseClass.objcClass = &BaseEntity;
- BaseClass.loc = getIndexLoc(D->getSuperClassLoc());
- }
-
- SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
- SmallVector<CXIdxEntityInfo, 4> ProtEntities;
- ObjCInterfaceDecl::protocol_loc_iterator LI = D->protocol_loc_begin();
- for (ObjCInterfaceDecl::protocol_iterator
- I = D->protocol_begin(), E = D->protocol_end(); I != E; ++I, ++LI) {
- SourceLocation Loc = *LI;
- ObjCProtocolDecl *PD = *I;
- ProtEntities.push_back(CXIdxEntityInfo());
- getEntityInfo(PD, ProtEntities.back(), SA);
- CXIdxObjCProtocolRefInfo ProtInfo = { 0, getIndexLoc(Loc) };
- ProtInfos.push_back(ProtInfo);
- }
+ ObjCProtocolListInfo ProtListInfo(D->getReferencedProtocols(), *this, SA);
- for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
- ProtInfos[i].protocol = &ProtEntities[i];
+ ObjCProtocolDeclInfo ProtInfo;
+ ProtInfo.ObjCProtoDeclInfo.declInfo = &ProtInfo;
+ ProtInfo.ObjCProtoDeclInfo.protocols = ProtListInfo.getProtocolRefs();
+ ProtInfo.ObjCProtoDeclInfo.numProtocols = ProtListInfo.getNumProtocols();
- SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
- for (unsigned i = 0, e = Prots.size(); i != e; ++i)
- Prots.push_back(&ProtInfos[i]);
-
- CXIdxEntityInfo ClassEntity;
- getEntityInfo(D, ClassEntity, SA);
- CXIdxObjCClassDefineInfo Info = { getCursor(D),
- &ClassEntity,
- getIndexContainerForDC(D),
- D->getSuperClass() ? &BaseClass : 0,
- Prots.data(),
- static_cast<unsigned>(Prots.size()) };
- CB.defineObjCClass(ClientData, &Info);
+ handleObjCContainer(D, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/D->isInitiallyForwardDecl(),
+ /*isImplementation=*/false, ProtInfo);
}
void IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
@@ -290,8 +261,8 @@ void IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
StrAdapter SA(*this);
getEntityInfo(D->getClassInterface(), ClassEntity, SA);
- CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
- CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
+ CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
+ CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
handleObjCContainer(D, D->getLocation(), getCursor(D),
/*isForwardRef=*/false,
/*isRedeclaration=*/false,
@@ -305,9 +276,9 @@ void IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) {
StrAdapter SA(*this);
getEntityInfo(CatD->getClassInterface(), ClassEntity, SA);
- CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
- CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
- handleObjCContainer(CatD, D->getLocation(), getCursor(D),
+ CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
+ CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
+ handleObjCContainer(D, D->getLocation(), getCursor(D),
/*isForwardRef=*/false,
/*isRedeclaration=*/true,
/*isImplementation=*/true, CatDInfo);
@@ -317,14 +288,14 @@ void IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) {
DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
!D->isCanonicalDecl(), D->isThisDeclarationADefinition(),
- DInfo);
+ D->isThisDeclarationADefinition(), DInfo);
}
void IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
DeclInfo DInfo;
handleDecl(D, D->getLocation(), getCursor(D),
/*isRedeclaration=*/false, /*isDefinition=*/false,
- DInfo);
+ /*isContainer=*/false, DInfo);
}
void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
@@ -356,35 +327,6 @@ void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
CB.indexEntityReference(ClientData, &Info);
}
-void IndexingContext::startContainer(const NamedDecl *D, bool isStmtBody,
- const DeclContext *DC) {
- if (!CB.startedContainer)
- return;
-
- if (!DC)
- DC = cast<DeclContext>(D);
-
- StrAdapter SA(*this);
- CXIdxEntityInfo Entity;
- getEntityInfo(D, Entity, SA);
- CXIdxContainerInfo Info;
- Info.entity = &Entity;
- Info.cursor = getCursor(D);
- Info.loc = getIndexLoc(D->getLocation());
- Info.isObjCImpl = isa<ObjCImplDecl>(D);
-
- CXIdxClientContainer clientCont = CB.startedContainer(ClientData, &Info);
- addContainerInMap(DC, clientCont);
-}
-
-void IndexingContext::endContainer(const DeclContext *DC) {
- if (CB.endedContainer) {
- CXIdxEndContainerInfo Info = { getIndexContainerForDC(DC),
- getIndexLoc(cast<Decl>(DC)->getLocEnd()) };
- CB.endedContainer(ClientData, &Info);
- }
-}
-
bool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const {
if (Loc.isInvalid())
return true;
@@ -411,44 +353,6 @@ void IndexingContext::addContainerInMap(const DeclContext *DC,
ContainerMap.erase(I);
}
-void IndexingContext::addEntityInMap(const NamedDecl *D,
- CXIdxClientEntity entity) {
- assert(getEntityDecl(D) == D &&
- "Tried to add a non-entity (canonical) decl");
- assert(EntityMap.find(D) == EntityMap.end());
- if (entity || D->isFromASTFile())
- EntityMap[D] = entity;
-}
-
-CXIdxClientEntity IndexingContext::getClientEntity(const NamedDecl *D) {
- if (!D)
- return 0;
- D = getEntityDecl(D);
- EntityMapTy::const_iterator I = EntityMap.find(D);
- if (I != EntityMap.end())
- return I->second;
-
- if (!D->isFromASTFile()) {
- //assert(0 && "Entity not in map");
- return 0;
- }
-
- StrAdapter SA(*this);
-
- CXIdxClientEntity idxEntity = 0;
- if (CB.importedEntity) {
- CXIdxEntityInfo EntityInfo;
- getEntityInfo(D, EntityInfo, SA);
- CXIdxImportedEntityInfo Info = { &EntityInfo,
- getCursor(D),
- getIndexLoc(D->getLocation()),
- /*CXIdxASTFile*/0 };
- idxEntity = CB.importedEntity(ClientData, &Info);
- }
- addEntityInMap