IndexDecl.cpp revision 58d2dbea680a75de266c5eff77cc15c323cfd48a
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 444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFunctionDecl(FunctionDecl *D) { 454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleFunction(D); 46e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 478818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis 488818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) { 498818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis // Constructor initializers. 508818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis for (CXXConstructorDecl::init_iterator I = Ctor->init_begin(), 518818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis E = Ctor->init_end(); 528818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis I != E; ++I) { 538818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis CXXCtorInitializer *Init = *I; 548818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis if (Init->isWritten()) { 558818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(Init->getTypeSourceInfo(), D); 568818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis if (const FieldDecl *Member = Init->getAnyMember()) 578818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis IndexCtx.handleReference(Member, Init->getMemberLocation(), D, D); 588818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis IndexCtx.indexBody(Init->getInit(), D, D); 598818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis } 608818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis } 618818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis } 628818d4570b916762513e2b5ec4ca7178b1e736a9Argyrios Kyrtzidis 634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Body) { 66e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, D); 674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitVarDecl(VarDecl *D) { 734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleVar(D); 74e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 75e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInit(), D); 764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFieldDecl(FieldDecl *D) { 804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleField(D); 81e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 82e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis if (D->isBitField()) 83e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getBitWidth(), D); 84e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis else if (D->hasInClassInitializer()) 85e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInClassInitializer(), D); 864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitEnumConstantDecl(EnumConstantDecl *D) { 904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleEnumerator(D); 91e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInitExpr(), D); 924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitTypedefDecl(TypedefNameDecl *D) { 962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleTypedefName(D); 974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitTagDecl(TagDecl *D) { 1024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Non-free standing tags are handled in indexTypeSourceInfo. 1034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isFreeStanding()) 1044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTagDecl(D); 1054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 109dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCInterface(D); 1104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 111375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor if (D->isThisDeclarationADefinition()) { 112375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor IndexCtx.indexTUDeclsInObjCContainer(); 113375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor IndexCtx.indexDeclContext(D); 114375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor } 1154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 119dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCProtocol(D); 1204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 121bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor if (D->isThisDeclarationADefinition()) { 122bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor IndexCtx.indexTUDeclsInObjCContainer(); 123bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor IndexCtx.indexDeclContext(D); 124bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor } 1254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 129e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis const ObjCInterfaceDecl *Class = D->getClassInterface(); 13037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis if (!Class) 13137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis return true; 13237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis 133e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis if (Class->isImplicitInterfaceDecl()) 134e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis IndexCtx.handleObjCInterface(Class); 135e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis 136dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCImplementation(D); 1374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 144dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCCategory(D); 1454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 15237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis const ObjCCategoryDecl *Cat = D->getCategoryDecl(); 15337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis if (!Cat) 154dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return true; 155dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 156dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCCategoryImpl(D); 157dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 1584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCMethodDecl(ObjCMethodDecl *D) { 1644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCMethod(D); 1654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getResultTypeSourceInfo(), D); 1664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (ObjCMethodDecl::param_iterator 1674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = D->param_begin(), E = D->param_end(); I != E; ++I) 168e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(*I, D); 1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 1714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 1724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Body) { 173e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, D); 1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 1804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCProperty(D); 1814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 1824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 183b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 184b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 185b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 186b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis ObjCPropertyDecl *PD = D->getPropertyDecl(); 187b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCProperty(D); 188b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 189b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic) 190b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 191b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis assert(D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize); 192b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 193b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCIvarDecl *IvarD = D->getPropertyIvarDecl()) { 194b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (!IvarD->getSynthesize()) 195b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleReference(IvarD, D->getPropertyIvarDeclLoc(), 0, 196b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis D->getDeclContext()); 197b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 198b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 199b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) { 200b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (MD->isSynthesized()) 201b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 202b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 203b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) { 204b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (MD->isSynthesized()) 205b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 206b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 2072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 21068478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis bool VisitNamespaceDecl(NamespaceDecl *D) { 21168478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis IndexCtx.handleNamespace(D); 21268478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis IndexCtx.indexDeclContext(D); 21368478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis return true; 21468478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis } 21568478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis 216911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis bool VisitUsingDecl(UsingDecl *D) { 217911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // FIXME: Parent for the following is CXIdxEntity_Unexposed with no USR, 218911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // we should do better. 219911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 220911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), D); 221911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis for (UsingDecl::shadow_iterator 222911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis I = D->shadow_begin(), E = D->shadow_end(); I != E; ++I) { 223911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.handleReference((*I)->getUnderlyingDecl(), D->getLocation(), 224911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis D, D->getLexicalDeclContext()); 225911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis } 226911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis return true; 227911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis } 228911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 229911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis bool VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 230911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // FIXME: Parent for the following is CXIdxEntity_Unexposed with no USR, 231911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis // we should do better. 232911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 233911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), D); 234911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis IndexCtx.handleReference(D->getNominatedNamespaceAsWritten(), 235911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis D->getLocation(), D, D->getLexicalDeclContext()); 236911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis return true; 237911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis } 238911d717307e0d90980699cf75204c22e4462b45dArgyrios Kyrtzidis 2392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitClassTemplateDecl(ClassTemplateDecl *D) { 2402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleClassTemplate(D); 2412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (D->isThisDeclarationADefinition()) 2422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexDeclContext(D->getTemplatedDecl()); 2432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 2466d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis bool VisitClassTemplateSpecializationDecl( 2476d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis ClassTemplateSpecializationDecl *D) { 24858d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis // FIXME: Notify subsequent callbacks if info comes from implicit 2496d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis // instantiation. 25058d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis if (D->isThisDeclarationADefinition() && 25158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis (IndexCtx.shouldIndexImplicitTemplateInsts() || 25258d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis !IndexCtx.isTemplateImplicitInstantiation(D))) 2536d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis IndexCtx.indexTagDecl(D); 2546d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis return true; 2556d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis } 2566d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis 2572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 2582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleFunctionTemplate(D); 2592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis FunctionDecl *FD = D->getTemplatedDecl(); 260e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(FD, D); 2612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (FD->isThisDeclarationADefinition()) { 2622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const Stmt *Body = FD->getBody(); 2632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (Body) { 264e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, FD); 2652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 269b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 2702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 2712957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleTypeAliasTemplate(D); 2722957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); 273b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}; 2764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} // anonymous namespace 2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDecl(const Decl *D) { 280d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis if (D->isImplicit() && shouldIgnoreIfImplicit(D)) 281d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis return; 282d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis 2834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D)); 2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!Handled && isa<DeclContext>(D)) 2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclContext(cast<DeclContext>(D)); 2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDeclContext(const DeclContext *DC) { 2894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (DeclContext::decl_iterator 2904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { 2914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDecl(*I); 2924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 29521ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexTopLevelDecl(Decl *D) { 29621ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 29721ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; 2984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 29921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isa<ObjCMethodDecl>(D)) 30021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; // Wait for the objc container. 3014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 30221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexDecl(D); 30321ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis} 30421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis 30521ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexDeclGroupRef(DeclGroupRef DG) { 30621ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 30721ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexTopLevelDecl(*I); 3084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexTUDeclsInObjCContainer() { 3114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (unsigned i = 0, e = TUDeclsInObjCContainer.size(); i != e; ++i) 3124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclGroupRef(TUDeclsInObjCContainer[i]); 3134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis TUDeclsInObjCContainer.clear(); 3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 315