IndexDecl.cpp revision bd9482d859a74bf2c45ef8b8aedec61c0e1c8374
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; 28e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), Parent); 29e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent); 30e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis } 31e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis 324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFunctionDecl(FunctionDecl *D) { 334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleFunction(D); 34e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Body) { 38e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, D); 394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitVarDecl(VarDecl *D) { 454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleVar(D); 46e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 47e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInit(), D); 484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitFieldDecl(FieldDecl *D) { 524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleField(D); 53e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(D); 54e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis if (D->isBitField()) 55e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getBitWidth(), D); 56e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis else if (D->hasInClassInitializer()) 57e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInClassInitializer(), D); 584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitEnumConstantDecl(EnumConstantDecl *D) { 624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleEnumerator(D); 63e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(D->getInitExpr(), D); 644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitTypedefDecl(TypedefNameDecl *D) { 682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleTypedefName(D); 694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitTagDecl(TagDecl *D) { 744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Non-free standing tags are handled in indexTypeSourceInfo. 754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isFreeStanding()) 764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTagDecl(D); 774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 81dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCInterface(D); 824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 83375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor if (D->isThisDeclarationADefinition()) { 84375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor IndexCtx.indexTUDeclsInObjCContainer(); 85375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor IndexCtx.indexDeclContext(D); 86375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor } 874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 91dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCProtocol(D); 924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 93bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor if (D->isThisDeclarationADefinition()) { 94bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor IndexCtx.indexTUDeclsInObjCContainer(); 95bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor IndexCtx.indexDeclContext(D); 96bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor } 974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 101e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis const ObjCInterfaceDecl *Class = D->getClassInterface(); 10237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis if (!Class) 10337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis return true; 10437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis 105e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis if (Class->isImplicitInterfaceDecl()) 106e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis IndexCtx.handleObjCInterface(Class); 107e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis 108dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCImplementation(D); 1094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 116dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCCategory(D); 1174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 12437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis const ObjCCategoryDecl *Cat = D->getCategoryDecl(); 12537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis if (!Cat) 126dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return true; 127dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 128dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis IndexCtx.handleObjCCategoryImpl(D); 129dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 1304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTUDeclsInObjCContainer(); 1314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexDeclContext(D); 1324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCMethodDecl(ObjCMethodDecl *D) { 1364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCMethod(D); 1374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getResultTypeSourceInfo(), D); 1384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (ObjCMethodDecl::param_iterator 1394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = D->param_begin(), E = D->param_end(); I != E; ++I) 140e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(*I, D); 1414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 1434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const Stmt *Body = D->getBody(); 1444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Body) { 145e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, D); 1464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 1494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 1524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.handleObjCProperty(D); 1534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); 1544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 155b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 156b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 157b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 158b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis ObjCPropertyDecl *PD = D->getPropertyDecl(); 159b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCProperty(D); 160b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 161b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic) 162b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 163b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis assert(D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize); 164b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 165b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCIvarDecl *IvarD = D->getPropertyIvarDecl()) { 166b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (!IvarD->getSynthesize()) 167b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleReference(IvarD, D->getPropertyIvarDeclLoc(), 0, 168b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis D->getDeclContext()); 169b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 170b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 171b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) { 172b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (MD->isSynthesized()) 173b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 174b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 175b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) { 176b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (MD->isSynthesized()) 177b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); 178b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 1792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 1802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 1812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 18268478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis bool VisitNamespaceDecl(NamespaceDecl *D) { 18368478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis IndexCtx.handleNamespace(D); 18468478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis IndexCtx.indexDeclContext(D); 18568478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis return true; 18668478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis } 18768478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis 1882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitClassTemplateDecl(ClassTemplateDecl *D) { 1892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleClassTemplate(D); 1902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (D->isThisDeclarationADefinition()) 1912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexDeclContext(D->getTemplatedDecl()); 1922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 1932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 1942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 1952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 1962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleFunctionTemplate(D); 1972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis FunctionDecl *FD = D->getTemplatedDecl(); 198e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis handleDeclarator(FD, D); 1992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (FD->isThisDeclarationADefinition()) { 2002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const Stmt *Body = FD->getBody(); 2012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (Body) { 202e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis IndexCtx.indexBody(Body, D, FD); 2032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 2052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 2062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 207b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 2082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 2092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.handleTypeAliasTemplate(D); 2102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); 211b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 2124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}; 2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} // anonymous namespace 2164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDecl(const Decl *D) { 2184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D)); 2194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!Handled && isa<DeclContext>(D)) 2204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclContext(cast<DeclContext>(D)); 2214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexDeclContext(const DeclContext *DC) { 2244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (DeclContext::decl_iterator 2254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) { 2264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDecl(*I); 2274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 2284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 23021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexTopLevelDecl(Decl *D) { 23121ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 23221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; 2334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 23421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (isa<ObjCMethodDecl>(D)) 23521ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; // Wait for the objc container. 2364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 23721ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexDecl(D); 23821ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis} 23921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis 24021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::indexDeclGroupRef(DeclGroupRef DG) { 24121ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 24221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis indexTopLevelDecl(*I); 2434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::indexTUDeclsInObjCContainer() { 2464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (unsigned i = 0, e = TUDeclsInObjCContainer.size(); i != e; ++i) 2474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis indexDeclGroupRef(TUDeclsInObjCContainer[i]); 2484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis TUDeclsInObjCContainer.clear(); 2494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 250