From 58d2dbea680a75de266c5eff77cc15c323cfd48a Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 14 Feb 2012 22:23:11 +0000 Subject: [libclang] Indexing: only index implicit template instantiations via an opt-in indexing option. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150517 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/libclang/IndexBody.cpp | 2 +- tools/libclang/IndexDecl.cpp | 8 +++++--- tools/libclang/IndexTypeSourceInfo.cpp | 12 +++++++++--- tools/libclang/Indexing.cpp | 13 ++++++++++++- tools/libclang/IndexingContext.cpp | 22 +++++++++++----------- tools/libclang/IndexingContext.h | 8 ++++++-- 6 files changed, 44 insertions(+), 21 deletions(-) (limited to 'tools') diff --git a/tools/libclang/IndexBody.cpp b/tools/libclang/IndexBody.cpp index c400491132..684d5ce385 100644 --- a/tools/libclang/IndexBody.cpp +++ b/tools/libclang/IndexBody.cpp @@ -97,7 +97,7 @@ public: } bool VisitDeclStmt(DeclStmt *S) { - if (IndexCtx.indexFunctionLocalSymbols()) + if (IndexCtx.shouldIndexFunctionLocalSymbols()) IndexCtx.indexDeclGroupRef(S->getDeclGroup()); return true; } diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index 55ae9e0afc..dcc9a1dca3 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -26,7 +26,7 @@ public: void handleDeclarator(DeclaratorDecl *D, const NamedDecl *Parent = 0) { if (!Parent) Parent = D; - if (!IndexCtx.indexFunctionLocalSymbols()) { + if (!IndexCtx.shouldIndexFunctionLocalSymbols()) { IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), Parent); IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent); } else { @@ -245,9 +245,11 @@ public: bool VisitClassTemplateSpecializationDecl( ClassTemplateSpecializationDecl *D) { - // FIXME: Notify subsequent callbacks that info comes from implicit + // FIXME: Notify subsequent callbacks if info comes from implicit // instantiation. - if (D->isThisDeclarationADefinition()) + if (D->isThisDeclarationADefinition() && + (IndexCtx.shouldIndexImplicitTemplateInsts() || + !IndexCtx.isTemplateImplicitInstantiation(D))) IndexCtx.indexTagDecl(D); return true; } diff --git a/tools/libclang/IndexTypeSourceInfo.cpp b/tools/libclang/IndexTypeSourceInfo.cpp index 1e75378105..34acffcf7a 100644 --- a/tools/libclang/IndexTypeSourceInfo.cpp +++ b/tools/libclang/IndexTypeSourceInfo.cpp @@ -73,9 +73,15 @@ public: bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) { if (const TemplateSpecializationType *T = TL.getTypePtr()) { - if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) - IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), - Parent, ParentDC); + if (IndexCtx.shouldIndexImplicitTemplateInsts()) { + if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) + IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), + Parent, ParentDC); + } else { + if (const TemplateDecl *D = T->getTemplateName().getAsTemplateDecl()) + IndexCtx.handleReference(D, TL.getTemplateNameLoc(), + Parent, ParentDC); + } } return true; } diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp index 0d6da2824d..d1af38887b 100644 --- a/tools/libclang/Indexing.cpp +++ b/tools/libclang/Indexing.cpp @@ -137,11 +137,17 @@ public: virtual void HandleInterestingDecl(DeclGroupRef D) {} virtual void HandleTagDeclDefinition(TagDecl *D) { + if (!IndexCtx.shouldIndexImplicitTemplateInsts()) + return; + if (IndexCtx.isTemplateImplicitInstantiation(D)) IndexCtx.indexDecl(D); } virtual void HandleCXXImplicitFunctionInstantiation(FunctionDecl *D) { + if (!IndexCtx.shouldIndexImplicitTemplateInsts()) + return; + IndexCtx.indexDecl(D); } }; @@ -194,7 +200,12 @@ public: indexDiagnostics(CXTU, IndexCtx); } - virtual TranslationUnitKind getTranslationUnitKind() { return TU_Complete; } + virtual TranslationUnitKind getTranslationUnitKind() { + if (IndexCtx.shouldIndexImplicitTemplateInsts()) + return TU_Complete; + else + return TU_Prefix; + } virtual bool hasCodeCompletionSupport() const { return false; } }; diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index 0493f938ac..75184dd3b0 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -35,7 +35,7 @@ IndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo( IdxCtx.getIndexLoc(Loc) }; ProtInfos.push_back(ProtInfo); - if (IdxCtx.suppressRefs()) + if (IdxCtx.shouldSuppressRefs()) IdxCtx.markEntityOccurrenceInFile(PD, Loc); } @@ -265,11 +265,11 @@ bool IndexingContext::handleDecl(const NamedDecl *D, ScratchAlloc SA(*this); getEntityInfo(D, DInfo.EntInfo, SA); - if ((!indexFunctionLocalSymbols() && !DInfo.EntInfo.USR) + if ((!shouldIndexFunctionLocalSymbols() && !DInfo.EntInfo.USR) || Loc.isInvalid()) return false; - if (suppressRefs()) + if (shouldSuppressRefs()) markEntityOccurrenceInFile(D, Loc); DInfo.entityInfo = &DInfo.EntInfo; @@ -357,7 +357,7 @@ bool IndexingContext::handleTypedefName(const TypedefNameDecl *D) { bool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { // For @class forward declarations, suppress them the same way as references. if (!D->isThisDeclarationADefinition()) { - if (suppressRefs() && markEntityOccurrenceInFile(D, D->getLocation())) + if (shouldSuppressRefs() && markEntityOccurrenceInFile(D, D->getLocation())) return false; // already occurred. // FIXME: This seems like the wrong definition for redeclaration. @@ -382,7 +382,7 @@ bool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU); BaseClass.loc = getIndexLoc(SuperLoc); - if (suppressRefs()) + if (shouldSuppressRefs()) markEntityOccurrenceInFile(SuperD, SuperLoc); } @@ -411,7 +411,7 @@ bool IndexingContext::handleObjCImplementation( bool IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) { if (!D->isThisDeclarationADefinition()) { - if (suppressRefs() && markEntityOccurrenceInFile(D, D->getLocation())) + if (shouldSuppressRefs() && markEntityOccurrenceInFile(D, D->getLocation())) return false; // already occurred. // FIXME: This seems like the wrong definition for redeclaration. @@ -448,7 +448,7 @@ bool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { : D->getCategoryNameLoc(); getEntityInfo(IFaceD, ClassEntity, SA); - if (suppressRefs()) + if (shouldSuppressRefs()) markEntityOccurrenceInFile(IFaceD, ClassLoc); ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA); @@ -479,7 +479,7 @@ bool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { SourceLocation CategoryLoc = D->getCategoryNameLoc(); getEntityInfo(IFaceD, ClassEntity, SA); - if (suppressRefs()) + if (shouldSuppressRefs()) markEntityOccurrenceInFile(IFaceD, ClassLoc); CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; @@ -573,14 +573,14 @@ bool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, return false; if (Loc.isInvalid()) return false; - if (!indexFunctionLocalSymbols() && D->getParentFunctionOrMethod()) + if (!shouldIndexFunctionLocalSymbols() && D->getParentFunctionOrMethod()) return false; if (isNotFromSourceFile(D->getLocation())) return false; if (D->isImplicit() && shouldIgnoreIfImplicit(D)) return false; - if (suppressRefs()) { + if (shouldSuppressRefs()) { if (markEntityOccurrenceInFile(D, Loc)) return false; // already occurred. } @@ -660,7 +660,7 @@ bool IndexingContext::handleCXXRecordDecl(const CXXRecordDecl *RD, CXXDInfo.CXXClassInfo.bases = BaseList.getBases(); CXXDInfo.CXXClassInfo.numBases = BaseList.getNumBases(); - if (suppressRefs()) { + if (shouldSuppressRefs()) { // Go through bases and mark them as referenced. for (unsigned i = 0, e = BaseList.getNumBases(); i != e; ++i) { const CXIdxBaseClassInfo *baseInfo = BaseList.getBases()[i]; diff --git a/tools/libclang/IndexingContext.h b/tools/libclang/IndexingContext.h index 38f7563b57..66c635d6b9 100644 --- a/tools/libclang/IndexingContext.h +++ b/tools/libclang/IndexingContext.h @@ -322,14 +322,18 @@ public: void setASTContext(ASTContext &ctx); void setPreprocessor(Preprocessor &PP); - bool suppressRefs() const { + bool shouldSuppressRefs() const { return IndexOptions & CXIndexOpt_SuppressRedundantRefs; } - bool indexFunctionLocalSymbols() const { + bool shouldIndexFunctionLocalSymbols() const { return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols; } + bool shouldIndexImplicitTemplateInsts() const { + return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations; + } + bool shouldAbort(); bool hasDiagnosticCallback() const { return CB.diagnostic; } -- cgit v1.2.3