IndexDecl.cpp revision e422e45a6a89d450b8eca10f671b49874e87617a
107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//===- CIndexHigh.cpp - Higher level API functions ------------------------===// 207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// 307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// The LLVM Compiler Infrastructure 407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// 507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// This file is distributed under the University of Illinois Open Source 607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// License. See LICENSE.TXT for details. 707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// 8a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch//===----------------------------------------------------------------------===// 9a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 10a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "IndexingContext.h" 1107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "clang/AST/DeclVisitor.h" 1307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 14a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochusing namespace clang; 15a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochusing namespace cxindex; 1607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochnamespace { 1807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass IndexingDeclVisitor : public DeclVisitor<IndexingDeclVisitor, bool> { 2007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexingContext &IndexCtx; 2107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 2207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochpublic: 2307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch explicit IndexingDeclVisitor(IndexingContext &indexCtx) 2407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch : IndexCtx(indexCtx) { } 2507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 2607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch void handleDeclarator(DeclaratorDecl *D, const NamedDecl *Parent = 0) { 2707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!Parent) Parent = D; 2807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), Parent); 2907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent); 3007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 3107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 3207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitFunctionDecl(FunctionDecl *D) { 3307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleFunction(D); 3407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch handleDeclarator(D); 3507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (D->isThisDeclarationADefinition()) { 3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const Stmt *Body = D->getBody(); 3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (Body) { 3807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexBody(Body, D, D); 3907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 4007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 4107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 4207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 43a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 4407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitVarDecl(VarDecl *D) { 4507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleVar(D); 46a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch handleDeclarator(D); 4707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexBody(D->getInit(), D); 4807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 4907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 5007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 5107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitFieldDecl(FieldDecl *D) { 5207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleField(D); 5307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch handleDeclarator(D); 5407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (D->isBitField()) 5507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexBody(D->getBitWidth(), D); 5607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else if (D->hasInClassInitializer()) 57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IndexCtx.indexBody(D->getInClassInitializer(), D); 58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return true; 59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool VisitEnumConstantDecl(EnumConstantDecl *D) { 62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IndexCtx.handleEnumerator(D); 63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IndexCtx.indexBody(D->getInitExpr(), D); 64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return true; 65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool VisitTypedefDecl(TypedefNameDecl *D) { 68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IndexCtx.handleTypedefName(D); 69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return true; 71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool VisitTagDecl(TagDecl *D) { 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Non-free standing tags are handled in indexTypeSourceInfo. 75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (D->isFreeStanding()) 76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IndexCtx.indexTagDecl(D); 77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return true; 7807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 7907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool VisitObjCClassDecl(ObjCClassDecl *D) { 81a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch IndexCtx.handleObjCClass(D); 82d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return true; 83d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 8407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { 8607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ObjCForwardProtocolDecl::protocol_loc_iterator LI = D->protocol_loc_begin(); 8707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (ObjCForwardProtocolDecl::protocol_iterator 88d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) I = D->protocol_begin(), E = D->protocol_end(); I != E; ++I, ++LI) { 8907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch SourceLocation Loc = *LI; 9007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ObjCProtocolDecl *PD = *I; 9107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 9207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool isRedeclaration = PD->getLocation() != Loc; 9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleObjCForwardProtocol(PD, Loc, isRedeclaration); 9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return true; 96a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 9707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 9807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 9907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // Forward decls are handled at VisitObjCClassDecl. 100a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (D->isForwardDecl()) 10107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 102d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) IndexCtx.handleObjCInterface(D); 104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) IndexCtx.indexTUDeclsInObjCContainer(); 106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) IndexCtx.indexDeclContext(D); 10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 11107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // Forward decls are handled at VisitObjCForwardProtocolDecl. 11207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (D->isForwardDecl()) 11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 11407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 11507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleObjCProtocol(D); 11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 11707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTUDeclsInObjCContainer(); 11807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexDeclContext(D); 11907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 120a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 12107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 12207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 12307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const ObjCInterfaceDecl *Class = D->getClassInterface(); 12407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!Class) 12507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 12607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 12707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (Class->isImplicitInterfaceDecl()) 12807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleObjCInterface(Class); 12907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 13007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleObjCImplementation(D); 13107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 13207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTUDeclsInObjCContainer(); 13307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexDeclContext(D); 13407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 13507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 13607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 13807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleObjCCategory(D); 13907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 14007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTUDeclsInObjCContainer(); 14107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexDeclContext(D); 14207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 14307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 14407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 14507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 14607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const ObjCCategoryDecl *Cat = D->getCategoryDecl(); 14707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!Cat) 14807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 14907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 150a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch IndexCtx.handleObjCCategoryImpl(D); 15107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 15207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTUDeclsInObjCContainer(); 15307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexDeclContext(D); 15407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 15507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 15607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 15707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCMethodDecl(ObjCMethodDecl *D) { 15807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleObjCMethod(D); 15907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTypeSourceInfo(D->getResultTypeSourceInfo(), D); 16007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (ObjCMethodDecl::param_iterator 16107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch I = D->param_begin(), E = D->param_end(); I != E; ++I) 16207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch handleDeclarator(*I, D); 16307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 16407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (D->isThisDeclarationADefinition()) { 16507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const Stmt *Body = D->getBody(); 16607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (Body) { 16707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexBody(Body, D, D); 16807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 16907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 17007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 17107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 17307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 17407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleObjCProperty(D); 17507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 17607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 17707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 17807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 17907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 18007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ObjCPropertyDecl *PD = D->getPropertyDecl(); 18107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleSynthesizedObjCProperty(D); 18207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic) 184d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return true; 18507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch assert(D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize); 18607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 18707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (ObjCIvarDecl *IvarD = D->getPropertyIvarDecl()) { 18807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!IvarD->getSynthesize()) 18907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleReference(IvarD, D->getPropertyIvarDeclLoc(), 0, 19007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch D->getDeclContext()); 19107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 19207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 19307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) { 19407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (MD->isSynthesized()) 19510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 19610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 19707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) { 19807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (MD->isSynthesized()) 19907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 20007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 20107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 20207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 20307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 20407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitNamespaceDecl(NamespaceDecl *D) { 20507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleNamespace(D); 20607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexDeclContext(D); 20707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 20807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 20907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 21007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitClassTemplateDecl(ClassTemplateDecl *D) { 21107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleClassTemplate(D); 21207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (D->isThisDeclarationADefinition()) 21307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexDeclContext(D->getTemplatedDecl()); 21407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 21507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 21607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 21707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 21807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.handleFunctionTemplate(D); 21907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch FunctionDecl *FD = D->getTemplatedDecl(); 220a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch handleDeclarator(FD, D); 2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (FD->isThisDeclarationADefinition()) { 222e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const Stmt *Body = FD->getBody(); 223e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (Body) { 224a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch IndexCtx.indexBody(Body, D, FD); 2256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 226a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 227a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return true; 228f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu } 229a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 230a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 23110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch IndexCtx.handleTypeAliasTemplate(D); 23207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); 23307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return true; 23407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 23507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}; 23607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 23707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} // anonymous namespace 23807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 23907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexDecl(const Decl *D) { 24007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D)); 24107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!Handled && isa<DeclContext>(D)) 24207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch indexDeclContext(cast<DeclContext>(D)); 24307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 24407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 24507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexDeclContext(const DeclContext *DC) { 24607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (DeclContext::decl_iterator 24707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { 24807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch indexDecl(*I); 24907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 25007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 25107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 25207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexTopLevelDecl(Decl *D) { 25307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (isNotFromSourceFile(D->getLocation())) 25407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return; 25507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 25607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (isa<ObjCMethodDecl>(D)) 25707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return; // Wait for the objc container. 2585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 25907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch indexDecl(D); 26007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 26107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 262e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void IndexingContext::indexDeclGroupRef(DeclGroupRef DG) { 26307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 26407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch indexTopLevelDecl(*I); 26507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 26607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 26707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexTUDeclsInObjCContainer() { 26807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (unsigned i = 0, e = TUDeclsInObjCContainer.size(); i != e; ++i) 26907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch indexDeclGroupRef(TUDeclsInObjCContainer[i]); 27007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch TUDeclsInObjCContainer.clear(); 27107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 27207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch