aboutsummaryrefslogtreecommitdiff
path: root/tools/libclang/IndexingContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/libclang/IndexingContext.cpp')
-rw-r--r--tools/libclang/IndexingContext.cpp581
1 files changed, 259 insertions, 322 deletions
diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp
index 0f00bac948..3d3277210e 100644
--- a/tools/libclang/IndexingContext.cpp
+++ b/tools/libclang/IndexingContext.cpp
@@ -33,6 +33,13 @@ void IndexingContext::setASTContext(ASTContext &ctx) {
static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx);
}
+void IndexingContext::enteredMainFile(const FileEntry *File) {
+ if (File && CB.enteredMainFile) {
+ CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0);
+ FileMap[File] = idxFile;
+ }
+}
+
void IndexingContext::ppIncludedFile(SourceLocation hashLoc,
StringRef filename,
const FileEntry *File,
@@ -40,12 +47,13 @@ void IndexingContext::ppIncludedFile(SourceLocation hashLoc,
if (!CB.ppIncludedFile)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc),
SA.toCStr(filename),
- getIndexFile(File),
+ (CXFile)File,
isImport, isAngled };
- CB.ppIncludedFile(ClientData, &Info);
+ CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info);
+ FileMap[File] = idxFile;
}
void IndexingContext::ppMacroDefined(SourceLocation Loc, StringRef Name,
@@ -54,11 +62,11 @@ void IndexingContext::ppMacroDefined(SourceLocation Loc, StringRef Name,
if (!CB.ppMacroDefined)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxMacroInfo MacroInfo = { getIndexLoc(Loc), SA.toCStr(Name) };
CXIdxMacroDefinedInfo Info = { &MacroInfo,
getIndexLoc(DefBegin), Length };
- CXIdxMacro idxMacro = CB.ppMacroDefined(ClientData, &Info);
+ CXIdxClientMacro idxMacro = CB.ppMacroDefined(ClientData, &Info);
MacroMap[OpaqueMacro] = idxMacro;
}
@@ -67,7 +75,7 @@ void IndexingContext::ppMacroUndefined(SourceLocation Loc, StringRef Name,
if (!CB.ppMacroUndefined)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxMacroUndefinedInfo Info = { getIndexLoc(Loc),
SA.toCStr(Name), 0 };
CB.ppMacroUndefined(ClientData, &Info);
@@ -78,21 +86,21 @@ void IndexingContext::ppMacroExpanded(SourceLocation Loc, StringRef Name,
if (!CB.ppMacroExpanded)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxMacroExpandedInfo Info = { getIndexLoc(Loc),
SA.toCStr(Name), 0 };
CB.ppMacroExpanded(ClientData, &Info);
}
void IndexingContext::invokeStartedTranslationUnit() {
- CXIdxContainer idxCont = 0;
+ CXIdxClientContainer idxCont = 0;
if (CB.startedTranslationUnit)
idxCont = CB.startedTranslationUnit(ClientData, 0);
addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont);
}
void IndexingContext::invokeFinishedTranslationUnit() {
- invokeEndedContainer(Ctx->getTranslationUnitDecl());
+ endContainer(Ctx->getTranslationUnitDecl());
}
void IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) {
@@ -103,197 +111,172 @@ void IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) {
CB.diagnostic(ClientData, &CXDiag, 0);
}
-void IndexingContext::handleFunction(const FunctionDecl *D) {
- StrAdapter SA(this);
-
- if (D->isFirstDeclaration()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexFunction) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxFunctionInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition() };
-
- idxEntity = CB.indexFunction(ClientData, &Info);
- }
+void IndexingContext::handleDecl(const NamedDecl *D,
+ SourceLocation Loc, CXCursor Cursor,
+ bool isRedeclaration, bool isDefinition,
+ DeclInfo &DInfo) {
+ if (!CB.indexDeclaration)
+ return;
- addEntityInMap(D, idxEntity);
+ StrAdapter SA(*this);
+ getEntityInfo(D, DInfo.CXEntInfo, SA);
+ DInfo.entityInfo = &DInfo.CXEntInfo;
+ DInfo.cursor = Cursor;
+ DInfo.loc = getIndexLoc(Loc);
+ DInfo.container = getIndexContainer(D);
+ DInfo.isRedeclaration = isRedeclaration;
+ DInfo.isDefinition = isDefinition;
+
+ CXIdxClientEntity
+ clientEnt = CB.indexDeclaration(ClientData, &DInfo);
+
+ if (!isRedeclaration)
+ addEntityInMap(D, clientEnt);
+}
+
+void IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
+ SourceLocation Loc, CXCursor Cursor,
+ bool isForwardRef,
+ bool isRedeclaration,
+ bool isImplementation,
+ ObjCContainerDeclInfo &ContDInfo) {
+ ContDInfo.CXObjCContDeclInfo.declInfo = &ContDInfo;
+ if (isForwardRef)
+ ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
+ else if (isImplementation)
+ ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
+ else
+ ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
- } else {
- if (CB.indexFunctionRedeclaration) {
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedRedeclInfo RedeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxFunctionRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexFunctionRedeclaration(ClientData, &Info);
- }
- }
+ handleDecl(D, Loc, Cursor,
+ isRedeclaration, /*isDefinition=*/!isForwardRef, ContDInfo);
}
-void IndexingContext::handleVar(const VarDecl *D) {
- StrAdapter SA(this);
-
- if (D->isFirstDeclaration()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexVariable) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxVariableInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition() };
-
- idxEntity = CB.indexVariable(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+void IndexingContext::handleFunction(const FunctionDecl *D) {
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
+ DInfo);
+}
- } else {
- if (CB.indexVariableRedeclaration) {
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedRedeclInfo RedeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxVariableRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexVariableRedeclaration(ClientData, &Info);
- }
- }
+void IndexingContext::handleVar(const VarDecl *D) {
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
+ DInfo);
}
void IndexingContext::handleField(const FieldDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexTypedef) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxFieldInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexField(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ /*isRedeclaration=*/false, /*isDefinition=*/false, DInfo);
}
void IndexingContext::handleEnumerator(const EnumConstantDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexTypedef) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxEnumeratorInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexEnumerator(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ /*isRedeclaration=*/false, /*isDefinition=*/true, DInfo);
}
void IndexingContext::handleTagDecl(const TagDecl *D) {
- StrAdapter SA(this);
-
- if (D->isFirstDeclaration()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexTagType) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxTagTypeInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition(),
- D->getIdentifier() == 0};
-
- idxEntity = CB.indexTagType(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
-
- } else {
- if (CB.indexTagTypeRedeclaration) {
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedRedeclInfo RedeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxTagTypeRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexTagTypeRedeclaration(ClientData, &Info);
- }
- }
+ TagDeclInfo TagDInfo;
+ TagDInfo.CXTagDeclInfo.declInfo = &TagDInfo;
+ TagDInfo.CXTagDeclInfo.isAnonymous = D->getIdentifier() == 0;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
+ TagDInfo);
}
void IndexingContext::handleTypedef(const TypedefDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexTypedef) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxTypedefInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexTypedef(ClientData, &Info);
- }
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), /*isDefinition=*/true, DInfo);
+}
- addEntityInMap(D, idxEntity);
+void IndexingContext::handleObjCClass(const ObjCClassDecl *D) {
+ ObjCContainerDeclInfo ContDInfo;
+ const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl();
+ ObjCInterfaceDecl *IFaceD = Ref->getInterface();
+ SourceLocation Loc = Ref->getLocation();
+ bool isRedeclaration = IFaceD->getLocation() != Loc;
+ handleObjCContainer(IFaceD, Loc, MakeCursorObjCClassRef(IFaceD, Loc, CXTU),
+ /*isForwardRef=*/true, isRedeclaration,
+ /*isImplementation=*/false, ContDInfo);
}
void IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) {
- StrAdapter SA(this);
+ ObjCContainerDeclInfo ContDInfo;
+ handleObjCContainer(D, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/D->isInitiallyForwardDecl(),
+ /*isImplementation=*/false, ContDInfo);
+}
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCClass) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCClassInfo Info = { &IdxEntityInfo,
- D->isForwardDecl() };
+void IndexingContext::handleObjCImplementation(
+ const ObjCImplementationDecl *D) {
+ ObjCContainerDeclInfo ContDInfo;
+ const ObjCInterfaceDecl *Class = D->getClassInterface();
+ handleObjCContainer(Class, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/!Class->isImplicitInterfaceDecl(),
+ /*isImplementation=*/true, ContDInfo);
+}
- idxEntity = CB.indexObjCClass(ClientData, &Info);
- }
+void IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D,
+ SourceLocation Loc,
+ bool isRedeclaration) {
+ ObjCContainerDeclInfo ContDInfo;
+ handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU),
+ /*isForwardRef=*/true,
+ isRedeclaration,
+ /*isImplementation=*/false, ContDInfo);
+}
- addEntityInMap(D, idxEntity);
+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;
- CXIdxObjCBaseClassInfo BaseClass = { getIndexEntity(D->getSuperClass()),
- getIndexLoc(D->getSuperClassLoc()) };
+ StrAdapter SA(*this);
+ CXIdxObjCBaseClassInfo BaseClass;
+ CXIdxEntityInfo BaseEntity;
if (D->getSuperClass()) {
- BaseClass.objcClass = getIndexEntity(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;
- CXIdxObjCProtocolRefInfo ProtInfo = { getIndexEntity(PD),
- getIndexLoc(Loc) };
+ ProtEntities.push_back(CXIdxEntityInfo());
+ getEntityInfo(PD, ProtEntities.back(), SA);
+ CXIdxObjCProtocolRefInfo ProtInfo = { 0, getIndexLoc(Loc) };
ProtInfos.push_back(ProtInfo);
}
+
+ for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
+ ProtInfos[i].protocol = &ProtEntities[i];
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),
- getIndexEntity(D),
+ &ClassEntity,
getIndexContainerForDC(D),
D->getSuperClass() ? &BaseClass : 0,
Prots.data(),
@@ -301,88 +284,47 @@ void IndexingContext::defineObjCInterface(const ObjCInterfaceDecl *D) {
CB.defineObjCClass(ClientData, &Info);
}
-void IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCProtocol) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCProtocolInfo Info = { &IdxEntityInfo,
- D->isForwardDecl() };
-
- idxEntity = CB.indexObjCProtocol(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
-}
-
void IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCCategory) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCCategoryInfo Info = { &IdxEntityInfo,
- getIndexEntity(D->getClassInterface()) };
-
- idxEntity = CB.indexObjCCategory(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ ObjCCategoryDeclInfo CatDInfo;
+ CXIdxEntityInfo ClassEntity;
+ StrAdapter SA(*this);
+ getEntityInfo(D->getClassInterface(), ClassEntity, SA);
+
+ CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
+ CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
+ handleObjCContainer(D, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/false,
+ /*isImplementation=*/false, CatDInfo);
+}
+
+void IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) {
+ const ObjCCategoryDecl *CatD = D->getCategoryDecl();
+ ObjCCategoryDeclInfo CatDInfo;
+ CXIdxEntityInfo ClassEntity;
+ StrAdapter SA(*this);
+ getEntityInfo(CatD->getClassInterface(), ClassEntity, SA);
+
+ CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
+ CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
+ handleObjCContainer(CatD, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/true,
+ /*isImplementation=*/true, CatDInfo);
}
void IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) {
- StrAdapter SA(this);
-
- if (D->isCanonicalDecl()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCMethod) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCMethodInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition() };
-
- idxEntity = CB.indexObjCMethod(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
-
- } else {
- if (CB.indexObjCMethodRedeclaration) {
- CXIdxIndexedRedeclInfo RedeclInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxObjCMethodRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexObjCMethodRedeclaration(ClientData, &Info);
- }
- }
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isCanonicalDecl(), D->isThisDeclarationADefinition(),
+ DInfo);
}
void IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCProperty) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCPropertyInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexObjCProperty(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ /*isRedeclaration=*/false, /*isDefinition=*/false,
+ DInfo);
}
void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
@@ -397,61 +339,45 @@ void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
if (isNotFromSourceFile(D->getLocation()))
return;
+ StrAdapter SA(*this);
CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E),
const_cast<Decl*>(cast<Decl>(DC)), CXTU)
: getRefCursor(D, Loc);
+ CXIdxEntityInfo RefEntity, ParentEntity;
+ getEntityInfo(D, RefEntity, SA);
+ getEntityInfo(Parent, ParentEntity, SA);
CXIdxEntityRefInfo Info = { Cursor,
getIndexLoc(Loc),
- getIndexEntity(D),
- getIndexEntity(Parent),
+ &RefEntity,
+ &ParentEntity,
getIndexContainerForDC(DC),
Kind };
CB.indexEntityReference(ClientData, &Info);
}
-void IndexingContext::invokeStartedStatementBody(const NamedDecl *D,
- const DeclContext *DC) {
- const Stmt *Body = cast<Decl>(DC)->getBody();
- assert(Body);
-
- CXIdxContainer idxCont = 0;
- if (CB.startedStatementBody) {
- CXIdxContainerInfo ContainerInfo;
- getContainerInfo(D, ContainerInfo);
- CXIdxStmtBodyInfo Info = { &ContainerInfo,
- getIndexLoc(Body->getLocStart()) };
-
- idxCont = CB.startedStatementBody(ClientData, &Info);
- }
- addContainerInMap(DC, idxCont);
-}
-
-void IndexingContext::invokeStartedTagTypeDefinition(const TagDecl *D) {
- CXIdxContainer idxCont = 0;
- if (CB.startedTagTypeDefinition) {
- CXIdxContainerInfo ContainerInfo;
- getContainerInfo(D, ContainerInfo);
- CXIdxTagTypeDefinitionInfo Info = { &ContainerInfo };
-
- idxCont = CB.startedTagTypeDefinition(ClientData, &Info);
- }
- addContainerInMap(D, idxCont);
-}
+void IndexingContext::startContainer(const NamedDecl *D, bool isStmtBody,
+ const DeclContext *DC) {
+ if (!CB.startedContainer)
+ return;
-void IndexingContext::invokeStartedObjCContainer(const ObjCContainerDecl *D) {
- CXIdxContainer idxCont = 0;
- if (CB.startedObjCContainer) {
- CXIdxContainerInfo ContainerInfo;
- getContainerInfo(D, ContainerInfo);
- CXIdxObjCContainerInfo Info = { &ContainerInfo };
+ 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);
- idxCont = CB.startedObjCContainer(ClientData, &Info);
- }
- addContainerInMap(D, idxCont);
+ CXIdxClientContainer clientCont = CB.startedContainer(ClientData, &Info);
+ addContainerInMap(DC, clientCont);
}
-void IndexingContext::invokeEndedContainer(const DeclContext *DC) {
+void IndexingContext::endContainer(const DeclContext *DC) {
if (CB.endedContainer) {
CXIdxEndContainerInfo Info = { getIndexContainerForDC(DC),
getIndexLoc(cast<Decl>(DC)->getLocEnd()) };
@@ -469,7 +395,7 @@ bool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const {
}
void IndexingContext::addContainerInMap(const DeclContext *DC,
- CXIdxContainer container) {
+ CXIdxClientContainer container) {
assert(getScopedContext(DC) == DC);
ContainerMapTy::iterator I = ContainerMap.find(DC);
if (I == ContainerMap.end()) {
@@ -485,7 +411,8 @@ void IndexingContext::addContainerInMap(const DeclContext *DC,
ContainerMap.erase(I);
}
-void IndexingContext::addEntityInMap(const NamedDecl *D, CXIdxEntity entity) {
+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());
@@ -493,7 +420,7 @@ void IndexingContext::addEntityInMap(const NamedDecl *D, CXIdxEntity entity) {
EntityMap[D] = entity;
}
-CXIdxEntity IndexingContext::getIndexEntity(const NamedDecl *D) {
+CXIdxClientEntity IndexingContext::getClientEntity(const NamedDecl *D) {
if (!D)
return 0;
D = getEntityDecl(D);
@@ -506,9 +433,9 @@ CXIdxEntity IndexingContext::getIndexEntity(const NamedDecl *D) {
return 0;
}
- StrAdapter SA(this);
+ StrAdapter SA(*this);
- CXIdxEntity idxEntity = 0;
+ CXIdxClientEntity idxEntity = 0;
if (CB.importedEntity) {
CXIdxEntityInfo EntityInfo;
getEntityInfo(D, EntityInfo, SA);
@@ -562,7 +489,7 @@ IndexingContext::getScopedContext(const DeclContext *DC) const {
return DC->getRedeclContext();
}
-CXIdxContainer
+CXIdxClientContainer
IndexingContext::getIndexContainerForDC(const DeclContext *DC) const {
DC = getScopedContext(DC);
ContainerMapTy::const_iterator I = ContainerMap.find(DC);
@@ -571,19 +498,15 @@ IndexingContext::getIndexContainerForDC(const DeclContext *DC) const {
return I->second;
}
-CXIdxFile IndexingContext::getIndexFile(const FileEntry *File) {
+CXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) {
if (!File)
return 0;
- if (!CB.recordFile)
- return 0;
FileMapTy::iterator FI = FileMap.find(File);
if (FI != FileMap.end())
return FI->second;
- CXIdxFile idxFile = CB.recordFile(ClientData, (CXFile)File, 0);
- FileMap[File] = idxFile;
- return idxFile;
+ return 0;
}
CXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const {
@@ -597,7 +520,7 @@ CXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const {
}
void IndexingContext::translateLoc(SourceLocation Loc,
- CXIdxFile *indexFile, CXFile *file,
+ CXIdxClientFile *indexFile, CXFile *file,
unsigned *line, unsigned *column,
unsigned *offset) {
if (Loc.isInvalid())
@@ -626,47 +549,59 @@ void IndexingContext::translateLoc(SourceLocation Loc,
*offset = FileOffset;
}
-void IndexingContext::getIndexedEntityInfo(const NamedDecl *D,
- CXIdxIndexedEntityInfo &IdxEntityInfo,
- CXIdxEntityInfo &EntityInfo,
- CXIdxIndexedDeclInfo &IdxDeclInfo,
- StrAdapter &SA) {
- getEntityInfo(D, EntityInfo, SA);
- getIndexedDeclInfo(D, IdxDeclInfo);
- IdxEntityInfo.entityInfo = &EntityInfo;
- IdxEntityInfo.declInfo = &IdxDeclInfo;
-}
-
-void IndexingContext::getIndexedDeclInfo(const NamedDecl *D,
- CXIdxIndexedDeclInfo &IdxDeclInfo) {
- IdxDeclInfo.cursor = getCursor(D);
- IdxDeclInfo.loc = getIndexLoc(D->getLocation());
- IdxDeclInfo.container = getIndexContainer(D);
-}
-
-void IndexingContext::getIndexedRedeclInfo(const NamedDecl *D,
- CXIdxIndexedRedeclInfo &RedeclInfo,
- CXIdxIndexedDeclInfo &IdxDeclInfo) {
- getIndexedDeclInfo(D, IdxDeclInfo);
- RedeclInfo.declInfo = &IdxDeclInfo;
- RedeclInfo.entity = getIndexEntity(D);
-}
+void IndexingContext::getEntityInfo(const NamedDecl *D,
+ CXIdxEntityInfo &EntityInfo,
+ StrAdapter &SA) {
+ D = getEntityDecl(D);
+ EntityInfo.kind = CXIdxEntity_Unexposed;
+ EntityInfo.clientEntity = getClientEntity(D);
+
+ if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
+ switch (TD->getTagKind()) {
+ case TTK_Struct:
+ EntityInfo.kind = CXIdxEntity_Struct; break;
+ case TTK_Union:
+ EntityInfo.kind = CXIdxEntity_Union; break;
+ case TTK_Class:
+ EntityInfo.kind = CXIdxEntity_CXXClass; break;
+ case TTK_Enum:
+ EntityInfo.kind = CXIdxEntity_Enum; break;
+ }
-void IndexingContext::getContainerInfo(const NamedDecl *D,
- CXIdxContainerInfo &ContainerInfo) {
- ContainerInfo.cursor = getCursor(D);
- ContainerInfo.loc = getIndexLoc(D->getLocation());
- ContainerInfo.entity = getIndexEntity(D);
-}
+ } else {
+ switch (D->getKind()) {
+ case Decl::Typedef:
+ EntityInfo.kind = CXIdxEntity_Typedef; break;
+ case Decl::Function:
+ EntityInfo.kind = CXIdxEntity_Function; break;
+ case Decl::Var:
+ EntityInfo.kind = CXIdxEntity_Variable; break;
+ case Decl::Field:
+ EntityInfo.kind = CXIdxEntity_Field; break;
+ case Decl::EnumConstant:
+ EntityInfo.kind = CXIdxEntity_EnumConstant; break;
+ case Decl::ObjCInterface:
+ EntityInfo.kind = CXIdxEntity_ObjCClass; break;
+ case Decl::ObjCProtocol:
+ EntityInfo.kind = CXIdxEntity_ObjCProtocol; break;
+ case Decl::ObjCCategory:
+ EntityInfo.kind = CXIdxEntity_ObjCCategory; break;
+ case Decl::ObjCMethod:
+ EntityInfo.kind = CXIdxEntity_ObjCMethod; break;
+ case Decl::ObjCProperty:
+ EntityInfo.kind = CXIdxEntity_ObjCProperty; break;
+ case Decl::ObjCIvar:
+ EntityInfo.kind = CXIdxEntity_ObjCIvar; break;
+ default:
+ break;
+ }
+ }
-void IndexingContext::getEntityInfo(const NamedDecl *D,
- CXIdxEntityInfo &EntityInfo,
- StrAdapter &SA) {
if (IdentifierInfo *II = D->getIdentifier()) {
EntityInfo.name = SA.toCStr(II->getName());
} else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
- EntityInfo.name = 0;
+ EntityInfo.name = 0; // anonymous record/namespace.
} else {
unsigned Begin = SA.getCurSize();
@@ -677,12 +612,14 @@ void IndexingContext::getEntityInfo(const NamedDecl *D,
EntityInfo.name = SA.getCStr(Begin);
}
- unsigned Begin = SA.getCurSize();
- bool Ignore = getDeclCursorUSR(D, SA.getBuffer());
- if (Ignore) {
- EntityInfo.USR = "";
- } else {
- EntityInfo.USR = SA.getCStr(Begin);
+ {
+ unsigned Begin = SA.getCurSize();
+ bool Ignore = getDeclCursorUSR(D, SA.getBuffer());
+ if (Ignore) {
+ EntityInfo.USR = "";
+ } else {
+ EntityInfo.USR = SA.getCStr(Begin);
+ }
}
}