IndexDecl.cpp revision 8818d4570b916762513e2b5ec4ca7178b1e736a9
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes//===- CIndexHigh.cpp - Higher level API functions ------------------------===// 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The LLVM Compiler Infrastructure 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// This file is distributed under the University of Illinois Open Source 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// License. See LICENSE.TXT for details. 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// 8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes//===----------------------------------------------------------------------===// 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes#include "IndexingContext.h" 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "clang/AST/DeclVisitor.h" 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectusing namespace clang; 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectusing namespace cxindex; 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectnamespace { 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass IndexingDeclVisitor : public DeclVisitor<IndexingDeclVisitor, bool> { 207365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilson IndexingContext &IndexCtx; 217365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilson 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic: 237365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilson explicit IndexingDeclVisitor(IndexingContext &indexCtx) 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : IndexCtx(indexCtx) { } 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void handleDeclarator(DeclaratorDecl *D, const NamedDecl *Parent = 0) { 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Parent) Parent = D; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!IndexCtx.indexFunctionLocalSymbols()) { 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), Parent); 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent); 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) { 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleVar(Parm); 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (FunctionDecl::param_iterator 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PI = FD->param_begin(), PE = FD->param_end(); PI != PE; ++PI) { 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleVar(*PI); 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitFunctionDecl(FunctionDecl *D) { 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleFunction(D); 46142d526f8bf90fb9bb63c637beb5299f39791f55Jesse Wilson handleDeclarator(D); 47142d526f8bf90fb9bb63c637beb5299f39791f55Jesse Wilson 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) { 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Constructor initializers. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (CXXConstructorDecl::init_iterator I = Ctor->init_begin(), 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E = Ctor->init_end(); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project I != E; ++I) { 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CXXCtorInitializer *Init = *I; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (Init->isWritten()) { 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTypeSourceInfo(Init->getTypeSourceInfo(), D); 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (const FieldDecl *Member = Init->getAnyMember()) 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleReference(Member, Init->getMemberLocation(), D, D); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexBody(Init->getInit(), D, D); 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (D->isThisDeclarationADefinition()) { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project const Stmt *Body = D->getBody(); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (Body) { 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexBody(Body, D, D); 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitVarDecl(VarDecl *D) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleVar(D); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project handleDeclarator(D); 75f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes IndexCtx.indexBody(D->getInit(), D); 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitFieldDecl(FieldDecl *D) { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleField(D); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project handleDeclarator(D); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (D->isBitField()) 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexBody(D->getBitWidth(), D); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else if (D->hasInClassInitializer()) 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexBody(D->getInClassInitializer(), D); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitEnumConstantDecl(EnumConstantDecl *D) { 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleEnumerator(D); 91f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes IndexCtx.indexBody(D->getInitExpr(), D); 92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return true; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitTypedefDecl(TypedefNameDecl *D) { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleTypedefName(D); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitTagDecl(TagDecl *D) { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Non-free standing tags are handled in indexTypeSourceInfo. 103f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes if (D->isFreeStanding()) 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTagDecl(D); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 109f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes IndexCtx.handleObjCInterface(D); 110f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (D->isThisDeclarationADefinition()) { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTUDeclsInObjCContainer(); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexDeclContext(D); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleObjCProtocol(D); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (D->isThisDeclarationADefinition()) { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTUDeclsInObjCContainer(); 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexDeclContext(D); 124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 128f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project const ObjCInterfaceDecl *Class = D->getClassInterface(); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Class) 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (Class->isImplicitInterfaceDecl()) 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleObjCInterface(Class); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleObjCImplementation(D); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes IndexCtx.indexTUDeclsInObjCContainer(); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexDeclContext(D); 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleObjCCategory(D); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTUDeclsInObjCContainer(); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexDeclContext(D); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project const ObjCCategoryDecl *Cat = D->getCategoryDecl(); 153f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes if (!Cat) 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 156f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes IndexCtx.handleObjCCategoryImpl(D); 157f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTUDeclsInObjCContainer(); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexDeclContext(D); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitObjCMethodDecl(ObjCMethodDecl *D) { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleObjCMethod(D); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTypeSourceInfo(D->getResultTypeSourceInfo(), D); 166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes for (ObjCMethodDecl::param_iterator 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project I = D->param_begin(), E = D->param_end(); I != E; ++I) 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project handleDeclarator(*I, D); 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (D->isThisDeclarationADefinition()) { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project const Stmt *Body = D->getBody(); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (Body) { 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexBody(Body, D, D); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 180f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes IndexCtx.handleObjCProperty(D); 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjCPropertyDecl *PD = D->getPropertyDecl(); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleSynthesizedObjCProperty(D); 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic) 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assert(D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 193f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes if (ObjCIvarDecl *IvarD = D->getPropertyIvarDecl()) { 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!IvarD->getSynthesize()) 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleReference(IvarD, D->getPropertyIvarDeclLoc(), 0, 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project D->getDeclContext()); 197f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes } 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) { 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (MD->isSynthesized()) 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (MD->isSynthesized()) 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return true; 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitNamespaceDecl(NamespaceDecl *D) { 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleNamespace(D); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexDeclContext(D); 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitClassTemplateDecl(ClassTemplateDecl *D) { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleClassTemplate(D); 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (D->isThisDeclarationADefinition()) 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexDeclContext(D->getTemplatedDecl()); 220f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return true; 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleFunctionTemplate(D); 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project FunctionDecl *FD = D->getTemplatedDecl(); 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project handleDeclarator(FD, D); 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (FD->isThisDeclarationADefinition()) { 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project const Stmt *Body = FD->getBody(); 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (Body) { 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexBody(Body, D, FD); 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 234f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes } 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.handleTypeAliasTemplate(D); 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}; 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} // anonymous namespace 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectvoid IndexingContext::indexDecl(const Decl *D) { 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D)); 247f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes if (!Handled && isa<DeclContext>(D)) 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indexDeclContext(cast<DeclContext>(D)); 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 251f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughesvoid IndexingContext::indexDeclContext(const DeclContext *DC) { 252f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes for (DeclContext::decl_iterator 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indexDecl(*I); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectvoid IndexingContext::indexTopLevelDecl(Decl *D) { 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isNotFromSourceFile(D->getLocation())) 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isa<ObjCMethodDecl>(D)) 263f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return; // Wait for the objc container. 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indexDecl(D); 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectvoid IndexingContext::indexDeclGroupRef(DeclGroupRef DG) { 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indexTopLevelDecl(*I); 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectvoid IndexingContext::indexTUDeclsInObjCContainer() { 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (unsigned i = 0, e = TUDeclsInObjCContainer.size(); i != e; ++i) 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indexDeclGroupRef(TUDeclsInObjCContainer[i]); 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TUDeclsInObjCContainer.clear(); 277f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes} 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project