IndexDecl.cpp revision 6d968363877388f0a0268711d59367907b465ae1
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 29db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis if (!IndexCtx.indexFunctionLocalSymbols()) { 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 2162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitClassTemplateDecl(ClassTemplateDecl *D) { 2172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleClassTemplate(D); 2182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (D->isThisDeclarationADefinition()) 2192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexDeclContext(D->getTemplatedDecl()); 2202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 2236d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis bool VisitClassTemplateSpecializationDecl( 2246d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis ClassTemplateSpecializationDecl *D) { 2256d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis // FIXME: Notify subsequent callbacks that info comes from implicit 2266d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis // instantiation. 2276d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis if (D->isThisDeclarationADefinition()) 2286d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis IndexCtx.indexTagDecl(D); 2296d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis return true; 2306d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis } 2316d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis 2322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 2332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleFunctionTemplate(D); 2342957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis FunctionDecl *FD = D->getTemplatedDecl(); 235e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(FD, D); 2362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (FD->isThisDeclarationADefinition()) { 2372957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const Stmt *Body = FD->getBody(); 2382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (Body) { 239e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, FD); 2402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 244b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 2452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 2462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleTypeAliasTemplate(D); 2472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); 248b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 2494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}; 2514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} // anonymous namespace 2534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDecl(const Decl *D) { 255d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis if (D->isImplicit() && shouldIgnoreIfImplicit(D)) 256d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis return; 257d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis 2584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D)); 2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!Handled && isa<DeclContext>(D)) 2604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclContext(cast<DeclContext>(D)); 2614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDeclContext(const DeclContext *DC) { 2644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (DeclContext::decl_iterator 2654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { 2664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDecl(*I); 2674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 27021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexTopLevelDecl(Decl *D) { 27121ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 27221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; 2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 27421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isa<ObjCMethodDecl>(D)) 27521ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; // Wait for the objc container. 2764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 27721ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexDecl(D); 27821ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis} 27921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis 28021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexDeclGroupRef(DeclGroupRef DG) { 28121ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 28221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexTopLevelDecl(*I); 2834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexTUDeclsInObjCContainer() { 2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (unsigned i = 0, e = TUDeclsInObjCContainer.size(); i != e; ++i) 2874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclGroupRef(TUDeclsInObjCContainer[i]); 2884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis TUDeclsInObjCContainer.clear(); 2894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 290