IndexDecl.cpp revision 754a5d14d58213beb0502720e66fef8fa86a21cf
14e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===- CIndexHigh.cpp - Higher level API functions ------------------------===// 24e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 34e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 44e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 54e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 64e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 74e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 84e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 94e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "IndexingContext.h" 114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "clang/AST/DeclVisitor.h" 134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace clang; 154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxindex; 164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisnamespace { 184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisclass IndexingDeclVisitor : public DeclVisitor<IndexingDeclVisitor, bool> { 204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexingContext &IndexCtx; 214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidispublic: 234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis explicit IndexingDeclVisitor(IndexingContext &indexCtx) 244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis : IndexCtx(indexCtx) { } 254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 26e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis void handleDeclarator(DeclaratorDecl *D, const NamedDecl *Parent = 0) { 27e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis if (!Parent) Parent = D; 28db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis 2958d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis if (!IndexCtx.shouldIndexFunctionLocalSymbols()) { 30db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), Parent); 31db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent); 32db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis } else { 33db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) { 34db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis IndexCtx.handleVar(Parm); 35db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 36db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis for (FunctionDecl::param_iterator 37db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis PI = FD->param_begin(), PE = FD->param_end(); PI != PE; ++PI) { 38db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis IndexCtx.handleVar(*PI); 39db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis } 40db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis } 41db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis } 42e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis } 43e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis 44d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis void handleObjCMethod(ObjCMethodDecl *D) { 45d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis IndexCtx.handleObjCMethod(D); 46d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (D->isImplicit()) 47d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis return; 48d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis 49d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getResultTypeSourceInfo(), D); 50d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis for (ObjCMethodDecl::param_iterator 51d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis I = D->param_begin(), E = D->param_end(); I != E; ++I) 52d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis handleDeclarator(*I, D); 53d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis 54d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 55d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 56d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (Body) { 57d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, D); 58d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis } 59d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis } 60d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis } 61d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis 624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFunctionDecl(FunctionDecl *D) { 634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleFunction(D); 64e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 658818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis 668818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) { 678818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis // Constructor initializers. 688818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis for (CXXConstructorDecl::init_iterator I = Ctor->init_begin(), 698818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis E = Ctor->init_end(); 708818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis I != E; ++I) { 718818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis CXXCtorInitializer *Init = *I; 728818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis if (Init->isWritten()) { 738818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(Init->getTypeSourceInfo(), D); 748818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis if (const FieldDecl *Member = Init->getAnyMember()) 758818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis IndexCtx.handleReference(Member, Init->getMemberLocation(), D, D); 768818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis IndexCtx.indexBody(Init->getInit(), D, D); 778818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis } 788818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis } 798818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis } 808818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis 814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Body) { 84e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, D); 854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitVarDecl(VarDecl *D) { 914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleVar(D); 92e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 93e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInit(), D); 944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFieldDecl(FieldDecl *D) { 984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleField(D); 99e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 100e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis if (D->isBitField()) 101e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getBitWidth(), D); 102e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis else if (D->hasInClassInitializer()) 103e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInClassInitializer(), D); 1044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitEnumConstantDecl(EnumConstantDecl *D) { 1084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleEnumerator(D); 109e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInitExpr(), D); 1104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 113754a5d14d58213beb0502720e66fef8fa86a21cfArgyrios Kyrtzidis bool VisitTypedefNameDecl(TypedefNameDecl *D) { 1142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleTypedefName(D); 1154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 1164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitTagDecl(TagDecl *D) { 1204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Non-free standing tags are handled in indexTypeSourceInfo. 1214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isFreeStanding()) 1224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTagDecl(D); 1234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 127dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCInterface(D); 1284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 129375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor if (D->isThisDeclarationADefinition()) { 130375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor IndexCtx.indexTUDeclsInObjCContainer(); 131375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor IndexCtx.indexDeclContext(D); 132375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor } 1334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 137dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCProtocol(D); 1384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 139bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor if (D->isThisDeclarationADefinition()) { 140bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor IndexCtx.indexTUDeclsInObjCContainer(); 141bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor IndexCtx.indexDeclContext(D); 142bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor } 1434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 147e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis const ObjCInterfaceDecl *Class = D->getClassInterface(); 14837f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis if (!Class) 14937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis return true; 15037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis 151e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis if (Class->isImplicitInterfaceDecl()) 152e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis IndexCtx.handleObjCInterface(Class); 153e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis 154dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCImplementation(D); 1554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 157390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis 158390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis // Index the ivars first to make sure the synthesized ivars are indexed 159390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis // before indexing the methods that can reference them. 160390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis for (ObjCImplementationDecl::ivar_iterator 161390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis IvarI = D->ivar_begin(), 162390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis IvarE = D->ivar_end(); IvarI != IvarE; ++IvarI) { 163390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis IndexCtx.indexDecl(*IvarI); 164390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis } 165390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis for (DeclContext::decl_iterator 166390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis I = D->decls_begin(), E = D->decls_end(); I != E; ++I) { 167390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis if (!isa<ObjCIvarDecl>(*I)) 168390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis IndexCtx.indexDecl(*I); 169390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis } 170390fff8e8b480fa146ffc14cbc63a1c2f9e2d206Argyrios Kyrtzidis 1714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 175dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCCategory(D); 1764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 18337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis const ObjCCategoryDecl *Cat = D->getCategoryDecl(); 18437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis if (!Cat) 185dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return true; 186dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 187dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCCategoryImpl(D); 188dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 1894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCMethodDecl(ObjCMethodDecl *D) { 195d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis // Methods associated with a property, even user-declared ones, are 196d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis // handled when we handle the property. 197d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (D->isSynthesized()) 198d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis return true; 1994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 200d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis handleObjCMethod(D); 2014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 2024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 205d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (ObjCMethodDecl *MD = D->getGetterMethodDecl()) 206d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (MD->getLexicalDeclContext() == D->getLexicalDeclContext()) 207d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis handleObjCMethod(MD); 208d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (ObjCMethodDecl *MD = D->getSetterMethodDecl()) 209d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis if (MD->getLexicalDeclContext() == D->getLexicalDeclContext()) 210d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis handleObjCMethod(MD); 2114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCProperty(D); 2124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 2134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 214b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 215b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 216b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 217b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis ObjCPropertyDecl *PD = D->getPropertyDecl(); 218b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCProperty(D); 219b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 220b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic) 221b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 222b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis assert(D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize); 223b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 224b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCIvarDecl *IvarD = D->getPropertyIvarDecl()) { 225b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (!IvarD->getSynthesize()) 226b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleReference(IvarD, D->getPropertyIvarDeclLoc(), 0, 227b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis D->getDeclContext()); 228b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 229b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 230b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) { 231b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (MD->isSynthesized()) 232f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation(), 233f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis D->getLexicalDeclContext()); 234b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 235b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) { 236b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (MD->isSynthesized()) 237f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation(), 238f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis D->getLexicalDeclContext()); 239b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 2402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 24368478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis bool VisitNamespaceDecl(NamespaceDecl *D) { 24468478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis IndexCtx.handleNamespace(D); 24568478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis IndexCtx.indexDeclContext(D); 24668478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis return true; 24768478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis } 24868478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis 249911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis bool VisitUsingDecl(UsingDecl *D) { 250911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // FIXME: Parent for the following is CXIdxEntity_Unexposed with no USR, 251911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // we should do better. 252911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 253911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), D); 254911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis for (UsingDecl::shadow_iterator 255911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis I = D->shadow_begin(), E = D->shadow_end(); I != E; ++I) { 256911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.handleReference((*I)->getUnderlyingDecl(), D->getLocation(), 257911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis D, D->getLexicalDeclContext()); 258911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis } 259911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis return true; 260911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis } 261911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 262911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis bool VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 263911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // FIXME: Parent for the following is CXIdxEntity_Unexposed with no USR, 264911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // we should do better. 265911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 266911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), D); 267911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.handleReference(D->getNominatedNamespaceAsWritten(), 268911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis D->getLocation(), D, D->getLexicalDeclContext()); 269911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis return true; 270911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis } 271911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 2722957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitClassTemplateDecl(ClassTemplateDecl *D) { 2732957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleClassTemplate(D); 2742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (D->isThisDeclarationADefinition()) 2752957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexDeclContext(D->getTemplatedDecl()); 2762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 2796d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis bool VisitClassTemplateSpecializationDecl( 2806d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis ClassTemplateSpecializationDecl *D) { 28158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis // FIXME: Notify subsequent callbacks if info comes from implicit 2826d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis // instantiation. 28358d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis if (D->isThisDeclarationADefinition() && 28458d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis (IndexCtx.shouldIndexImplicitTemplateInsts() || 28558d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis !IndexCtx.isTemplateImplicitInstantiation(D))) 2866d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis IndexCtx.indexTagDecl(D); 2876d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis return true; 2886d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis } 2896d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis 2902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 2912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleFunctionTemplate(D); 2922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis FunctionDecl *FD = D->getTemplatedDecl(); 293e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(FD, D); 2942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (FD->isThisDeclarationADefinition()) { 2952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const Stmt *Body = FD->getBody(); 2962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (Body) { 297e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, FD); 2982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 3002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 3012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 302b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 3032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 3042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleTypeAliasTemplate(D); 3052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); 306b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 3074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}; 3094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} // anonymous namespace 3114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDecl(const Decl *D) { 313d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis if (D->isImplicit() && shouldIgnoreIfImplicit(D)) 314d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis return; 315d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis 3164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D)); 3174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!Handled && isa<DeclContext>(D)) 3184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclContext(cast<DeclContext>(D)); 3194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDeclContext(const DeclContext *DC) { 3224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (DeclContext::decl_iterator 3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { 3244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDecl(*I); 3254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 32821ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexTopLevelDecl(Decl *D) { 32921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 33021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; 3314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 33221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isa<ObjCMethodDecl>(D)) 33321ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; // Wait for the objc container. 3344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 33521ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexDecl(D); 33621ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis} 33721ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis 33821ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexDeclGroupRef(DeclGroupRef DG) { 33921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 34021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexTopLevelDecl(*I); 3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexTUDeclsInObjCContainer() { 34430a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis while (!TUDeclsInObjCContainer.empty()) { 34530a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis DeclGroupRef DG = TUDeclsInObjCContainer.front(); 34630a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis TUDeclsInObjCContainer.pop_front(); 34730a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis indexDeclGroupRef(DG); 34830a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis } 3494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 350