IndexDecl.cpp revision e422e45a6a89d450b8eca10f671b49874e87617a
107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//===- CIndexHigh.cpp - Higher level API functions ------------------------===//
207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//
307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//                     The LLVM Compiler Infrastructure
407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//
507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// This file is distributed under the University of Illinois Open Source
607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// License. See LICENSE.TXT for details.
707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//
8a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch//===----------------------------------------------------------------------===//
9a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
10a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "IndexingContext.h"
1107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "clang/AST/DeclVisitor.h"
1307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
14a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochusing namespace clang;
15a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochusing namespace cxindex;
1607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochnamespace {
1807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass IndexingDeclVisitor : public DeclVisitor<IndexingDeclVisitor, bool> {
2007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  IndexingContext &IndexCtx;
2107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
2207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochpublic:
2307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  explicit IndexingDeclVisitor(IndexingContext &indexCtx)
2407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    : IndexCtx(indexCtx) { }
2507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
2607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  void handleDeclarator(DeclaratorDecl *D, const NamedDecl *Parent = 0) {
2707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!Parent) Parent = D;
2807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), Parent);
2907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent);
3007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
3107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
3207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitFunctionDecl(FunctionDecl *D) {
3307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleFunction(D);
3407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    handleDeclarator(D);
3507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (D->isThisDeclarationADefinition()) {
3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      const Stmt *Body = D->getBody();
3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      if (Body) {
3807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        IndexCtx.indexBody(Body, D, D);
3907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      }
4007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
4107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
4207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
43a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
4407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitVarDecl(VarDecl *D) {
4507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleVar(D);
46a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    handleDeclarator(D);
4707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexBody(D->getInit(), D);
4807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
4907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
5007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
5107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitFieldDecl(FieldDecl *D) {
5207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleField(D);
5307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    handleDeclarator(D);
5407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (D->isBitField())
5507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      IndexCtx.indexBody(D->getBitWidth(), D);
5607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    else if (D->hasInClassInitializer())
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      IndexCtx.indexBody(D->getInClassInitializer(), D);
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return true;
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  }
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  bool VisitEnumConstantDecl(EnumConstantDecl *D) {
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IndexCtx.handleEnumerator(D);
63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IndexCtx.indexBody(D->getInitExpr(), D);
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return true;
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  }
66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  bool VisitTypedefDecl(TypedefNameDecl *D) {
68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IndexCtx.handleTypedefName(D);
69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D);
70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return true;
71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  }
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  bool VisitTagDecl(TagDecl *D) {
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // Non-free standing tags are handled in indexTypeSourceInfo.
75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (D->isFreeStanding())
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      IndexCtx.indexTagDecl(D);
77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return true;
7807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
7907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci  bool VisitObjCClassDecl(ObjCClassDecl *D) {
81a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    IndexCtx.handleObjCClass(D);
82d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return true;
83d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)  }
8407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)  bool VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) {
8607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ObjCForwardProtocolDecl::protocol_loc_iterator LI = D->protocol_loc_begin();
8707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (ObjCForwardProtocolDecl::protocol_iterator
88d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)           I = D->protocol_begin(), E = D->protocol_end(); I != E; ++I, ++LI) {
8907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      SourceLocation Loc = *LI;
9007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      ObjCProtocolDecl *PD = *I;
9107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
9207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      bool isRedeclaration = PD->getLocation() != Loc;
9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      IndexCtx.handleObjCForwardProtocol(PD, Loc, isRedeclaration);
9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return true;
96a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  }
9707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
9807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
9907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Forward decls are handled at VisitObjCClassDecl.
100a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (D->isForwardDecl())
10107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      return true;
102d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IndexCtx.handleObjCInterface(D);
104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    IndexCtx.indexTUDeclsInObjCContainer();
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    IndexCtx.indexDeclContext(D);
10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
11107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Forward decls are handled at VisitObjCForwardProtocolDecl.
11207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (D->isForwardDecl())
11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      return true;
11407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
11507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleObjCProtocol(D);
11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
11707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTUDeclsInObjCContainer();
11807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexDeclContext(D);
11907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
120a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  }
12107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
12207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
12307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    const ObjCInterfaceDecl *Class = D->getClassInterface();
12407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!Class)
12507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      return true;
12607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
12707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (Class->isImplicitInterfaceDecl())
12807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      IndexCtx.handleObjCInterface(Class);
12907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
13007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleObjCImplementation(D);
13107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
13207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTUDeclsInObjCContainer();
13307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexDeclContext(D);
13407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
13507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
13607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
13807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleObjCCategory(D);
13907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
14007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTUDeclsInObjCContainer();
14107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexDeclContext(D);
14207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
14307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
14407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
14507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
14607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    const ObjCCategoryDecl *Cat = D->getCategoryDecl();
14707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!Cat)
14807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      return true;
14907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
150a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    IndexCtx.handleObjCCategoryImpl(D);
15107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTUDeclsInObjCContainer();
15307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexDeclContext(D);
15407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
15507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
15607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCMethodDecl(ObjCMethodDecl *D) {
15807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleObjCMethod(D);
15907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTypeSourceInfo(D->getResultTypeSourceInfo(), D);
16007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (ObjCMethodDecl::param_iterator
16107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch           I = D->param_begin(), E = D->param_end(); I != E; ++I)
16207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      handleDeclarator(*I, D);
16307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
16407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (D->isThisDeclarationADefinition()) {
16507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      const Stmt *Body = D->getBody();
16607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      if (Body) {
16707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        IndexCtx.indexBody(Body, D, D);
16807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      }
16907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
17007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
17107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
17307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
17407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleObjCProperty(D);
17507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D);
17607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
17707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
17807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
17907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
18007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ObjCPropertyDecl *PD = D->getPropertyDecl();
18107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleSynthesizedObjCProperty(D);
18207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)
184d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)      return true;
18507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    assert(D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize);
18607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
18707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (ObjCIvarDecl *IvarD = D->getPropertyIvarDecl()) {
18807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      if (!IvarD->getSynthesize())
18907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        IndexCtx.handleReference(IvarD, D->getPropertyIvarDeclLoc(), 0,
19007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                                 D->getDeclContext());
19107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
19207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
19307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) {
19407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      if (MD->isSynthesized())
19510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation());
19610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
19707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) {
19807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      if (MD->isSynthesized())
19907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation());
20007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
20107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
20207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
20307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
20407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitNamespaceDecl(NamespaceDecl *D) {
20507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleNamespace(D);
20607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexDeclContext(D);
20707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
20807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
20907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
21007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitClassTemplateDecl(ClassTemplateDecl *D) {
21107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleClassTemplate(D);
21207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (D->isThisDeclarationADefinition())
21307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch      IndexCtx.indexDeclContext(D->getTemplatedDecl());
21407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
21507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
21607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
21707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
21807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.handleFunctionTemplate(D);
21907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FunctionDecl *FD = D->getTemplatedDecl();
220a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    handleDeclarator(FD, D);
2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (FD->isThisDeclarationADefinition()) {
222e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)      const Stmt *Body = FD->getBody();
223e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)      if (Body) {
224a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        IndexCtx.indexBody(Body, D, FD);
2256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch      }
226a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
227a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return true;
228f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu  }
229a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
230a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
23110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    IndexCtx.handleTypeAliasTemplate(D);
23207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D);
23307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
23407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
23507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch};
23607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
23707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} // anonymous namespace
23807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
23907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexDecl(const Decl *D) {
24007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bool Handled = IndexingDeclVisitor(*this).Visit(const_cast<Decl*>(D));
24107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  if (!Handled && isa<DeclContext>(D))
24207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    indexDeclContext(cast<DeclContext>(D));
24307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
24407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
24507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexDeclContext(const DeclContext *DC) {
24607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  for (DeclContext::decl_iterator
24707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) {
24807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    indexDecl(*I);
24907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  }
25007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
25107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
25207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexTopLevelDecl(Decl *D) {
25307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  if (isNotFromSourceFile(D->getLocation()))
25407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return;
25507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
25607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  if (isa<ObjCMethodDecl>(D))
25707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return; // Wait for the objc container.
2585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
25907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  indexDecl(D);
26007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
26107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
262e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void IndexingContext::indexDeclGroupRef(DeclGroupRef DG) {
26307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
26407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    indexTopLevelDecl(*I);
26507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
26607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
26707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid IndexingContext::indexTUDeclsInObjCContainer() {
26807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  for (unsigned i = 0, e = TUDeclsInObjCContainer.size(); i != e; ++i)
26907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    indexDeclGroupRef(TUDeclsInObjCContainer[i]);
27007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  TUDeclsInObjCContainer.clear();
27107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
27207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch