IndexDecl.cpp revision 4e7064fa7e344e8f87a5b8457e96dfdd252c4a9e
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 264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFunctionDecl(FunctionDecl *D) { 274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleFunction(D); 284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Body) { 324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeStartedStatementBody(D, D); 334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexBody(Body, D); 344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeEndedContainer(D); 354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitVarDecl(VarDecl *D) { 414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleVar(D); 424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFieldDecl(FieldDecl *D) { 474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleField(D); 484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitEnumConstantDecl(EnumConstantDecl *D) { 534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleEnumerator(D); 544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitTypedefDecl(TypedefDecl *D) { 584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleTypedef(D); 594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitTagDecl(TagDecl *D) { 644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Non-free standing tags are handled in indexTypeSourceInfo. 654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isFreeStanding()) 664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTagDecl(D); 674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCClassDecl(ObjCClassDecl *D) { 714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl(); 724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Ref->getInterface()->getLocation() == Ref->getLocation()) { 734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCInterface(Ref->getInterface()); 744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else { 754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleReference(Ref->getInterface(), 764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Ref->getLocation(), 774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 0, 784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Ref->getInterface()->getDeclContext()); 794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { 844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ObjCForwardProtocolDecl::protocol_loc_iterator LI = D->protocol_loc_begin(); 854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (ObjCForwardProtocolDecl::protocol_iterator 864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = D->protocol_begin(), E = D->protocol_end(); I != E; ++I, ++LI) { 874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation Loc = *LI; 884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ObjCProtocolDecl *PD = *I; 894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (PD->getLocation() == Loc) { 914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCProtocol(PD); 924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else { 934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleReference(PD, Loc, 0, PD->getDeclContext()); 944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 1004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Only definitions are handled here. 1014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isForwardDecl()) 1024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!D->isInitiallyForwardDecl()) 1054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCInterface(D); 1064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeStartedObjCContainer(D); 1094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.defineObjCInterface(D); 1104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeEndedContainer(D); 1124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 1164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Only definitions are handled here. 1174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isForwardDecl()) 1184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!D->isInitiallyForwardDecl()) 1214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCProtocol(D); 1224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeStartedObjCContainer(D); 1254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeEndedContainer(D); 1274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 1314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ObjCInterfaceDecl *Class = D->getClassInterface(); 1324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Class->isImplicitInterfaceDecl()) 1334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCInterface(Class); 1344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeStartedObjCContainer(D); 1374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeEndedContainer(D); 1394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 1434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!D->IsClassExtension()) 1444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCCategory(D); 1454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeStartedObjCContainer(D); 1484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeEndedContainer(D); 1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 1544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeStartedObjCContainer(D); 1564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeEndedContainer(D); 1584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCMethodDecl(ObjCMethodDecl *D) { 1624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCMethod(D); 1634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getResultTypeSourceInfo(), D); 1644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (ObjCMethodDecl::param_iterator 1654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = D->param_begin(), E = D->param_end(); I != E; ++I) 1664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo((*I)->getTypeSourceInfo(), D); 1674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 1704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Body) { 1714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeStartedStatementBody(D, D); 1724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexBody(Body, D); 1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.invokeEndedContainer(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; 1834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}; 1854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} // anonymous namespace 1874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDecl(const Decl *D) { 1894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D)); 1904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!Handled && isa<DeclContext>(D)) 1914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclContext(cast<DeclContext>(D)); 1924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDeclContext(const DeclContext *DC) { 1954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (DeclContext::decl_iterator 1964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { 1974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDecl(*I); 1984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDeclGroupRef(DeclGroupRef DG) { 2024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) { 2034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Decl *D = *I; 2044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 2054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isa<ObjCMethodDecl>(D)) 2084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis continue; // Wait for the objc container. 2094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDecl(D); 2114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexTUDeclsInObjCContainer() { 2154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (unsigned i = 0, e = TUDeclsInObjCContainer.size(); i != e; ++i) 2164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclGroupRef(TUDeclsInObjCContainer[i]); 2174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis TUDeclsInObjCContainer.clear(); 2184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 219