blob: cce0bf705aa235e26b4651aeba78817af42a41a4 [file] [log] [blame]
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +00001//===- CIndexHigh.cpp - Higher level API functions ------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "IndexingContext.h"
11
12#include "clang/AST/RecursiveASTVisitor.h"
13
14using namespace clang;
15using namespace cxindex;
16
17namespace {
18
19class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> {
20 IndexingContext &IndexCtx;
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000021 const NamedDecl *Parent;
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000022 const DeclContext *ParentDC;
23
Argyrios Kyrtzidiseffdbf52011-11-18 00:26:51 +000024 typedef RecursiveASTVisitor<BodyIndexer> base;
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000025public:
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000026 BodyIndexer(IndexingContext &indexCtx,
27 const NamedDecl *Parent, const DeclContext *DC)
Argyrios Kyrtzidisa80f1bf2012-01-12 02:34:39 +000028 : IndexCtx(indexCtx), Parent(Parent), ParentDC(DC) { }
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000029
30 bool shouldWalkTypesOfTypeLocs() const { return false; }
31
32 bool TraverseTypeLoc(TypeLoc TL) {
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000033 IndexCtx.indexTypeLoc(TL, Parent, ParentDC);
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000034 return true;
35 }
36
Argyrios Kyrtzidis9f777352012-01-23 16:58:38 +000037 bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) {
38 IndexCtx.indexNestedNameSpecifierLoc(NNS, Parent, ParentDC);
39 return true;
40 }
41
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000042 bool VisitDeclRefExpr(DeclRefExpr *E) {
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000043 IndexCtx.handleReference(E->getDecl(), E->getLocation(),
44 Parent, ParentDC, E);
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000045 return true;
46 }
47
48 bool VisitMemberExpr(MemberExpr *E) {
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000049 IndexCtx.handleReference(E->getMemberDecl(), E->getMemberLoc(),
50 Parent, ParentDC, E);
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000051 return true;
52 }
53
Argyrios Kyrtzidisa1bed4c2012-02-22 02:10:41 +000054 bool VisitDesignatedInitExpr(DesignatedInitExpr *E) {
55 for (DesignatedInitExpr::reverse_designators_iterator
56 D = E->designators_rbegin(), DEnd = E->designators_rend();
57 D != DEnd; ++D) {
58 if (D->isFieldDesignator())
59 IndexCtx.handleReference(D->getField(), D->getFieldLoc(),
60 Parent, ParentDC, E);
61 }
62 return true;
63 }
64
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000065 bool VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000066 IndexCtx.handleReference(E->getDecl(), E->getLocation(),
67 Parent, ParentDC, E);
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +000068 return true;
69 }
Argyrios Kyrtzidis321e3022011-10-18 15:13:11 +000070
71 bool VisitObjCMessageExpr(ObjCMessageExpr *E) {
Argyrios Kyrtzidiseffdbf52011-11-18 00:26:51 +000072 if (TypeSourceInfo *Cls = E->getClassReceiverTypeInfo())
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000073 IndexCtx.indexTypeSourceInfo(Cls, Parent, ParentDC);
Argyrios Kyrtzidiseffdbf52011-11-18 00:26:51 +000074
Argyrios Kyrtzidis321e3022011-10-18 15:13:11 +000075 if (ObjCMethodDecl *MD = E->getMethodDecl())
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000076 IndexCtx.handleReference(MD, E->getSelectorStartLoc(),
77 Parent, ParentDC, E,
Argyrios Kyrtzidisa80f1bf2012-01-12 02:34:39 +000078 E->isImplicit() ? CXIdxEntityRef_Implicit
79 : CXIdxEntityRef_Direct);
Argyrios Kyrtzidis321e3022011-10-18 15:13:11 +000080 return true;
81 }
Argyrios Kyrtzidis0c7735e52011-10-18 15:50:50 +000082
83 bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
84 if (E->isImplicitProperty()) {
85 if (ObjCMethodDecl *MD = E->getImplicitPropertyGetter())
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000086 IndexCtx.handleReference(MD, E->getLocation(), Parent, ParentDC, E,
Argyrios Kyrtzidiseffdbf52011-11-18 00:26:51 +000087 CXIdxEntityRef_Implicit);
Argyrios Kyrtzidis0c7735e52011-10-18 15:50:50 +000088 if (ObjCMethodDecl *MD = E->getImplicitPropertySetter())
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000089 IndexCtx.handleReference(MD, E->getLocation(), Parent, ParentDC, E,
Argyrios Kyrtzidiseffdbf52011-11-18 00:26:51 +000090 CXIdxEntityRef_Implicit);
Argyrios Kyrtzidis0c7735e52011-10-18 15:50:50 +000091 } else {
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000092 IndexCtx.handleReference(E->getExplicitProperty(), E->getLocation(),
93 Parent, ParentDC, E);
Argyrios Kyrtzidis0c7735e52011-10-18 15:50:50 +000094 }
95 return true;
96 }
Argyrios Kyrtzidiseffdbf52011-11-18 00:26:51 +000097
Argyrios Kyrtzidis4c910b12011-11-22 07:24:51 +000098 bool VisitCXXConstructExpr(CXXConstructExpr *E) {
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +000099 IndexCtx.handleReference(E->getConstructor(), E->getLocation(),
100 Parent, ParentDC, E);
Argyrios Kyrtzidis4c910b12011-11-22 07:24:51 +0000101 return true;
102 }
Argyrios Kyrtzidisfb7d1452012-01-14 00:11:49 +0000103
Argyrios Kyrtzidisa2a299e2012-02-08 01:21:13 +0000104 bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
105 if (E->getOperatorLoc().isInvalid())
106 return true; // implicit.
107 return base::TraverseCXXOperatorCallExpr(E);
108 }
109
Argyrios Kyrtzidisfb7d1452012-01-14 00:11:49 +0000110 bool VisitDeclStmt(DeclStmt *S) {
Argyrios Kyrtzidis7e747952012-02-14 22:23:11 +0000111 if (IndexCtx.shouldIndexFunctionLocalSymbols())
Argyrios Kyrtzidisfb7d1452012-01-14 00:11:49 +0000112 IndexCtx.indexDeclGroupRef(S->getDeclGroup());
113 return true;
114 }
Richard Smith19582e82012-02-15 02:07:05 +0000115
Douglas Gregor30093832012-02-15 00:54:55 +0000116 bool TraverseLambdaCapture(LambdaExpr::Capture C) {
117 if (C.capturesThis())
118 return true;
Richard Smith19582e82012-02-15 02:07:05 +0000119
120 if (IndexCtx.shouldIndexFunctionLocalSymbols())
Douglas Gregor30093832012-02-15 00:54:55 +0000121 IndexCtx.handleReference(C.getCapturedVar(), C.getLocation(),
122 Parent, ParentDC);
123 return true;
124 }
125
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +0000126};
127
128} // anonymous namespace
129
Argyrios Kyrtzidis25cb0ff2011-12-13 18:47:41 +0000130void IndexingContext::indexBody(const Stmt *S, const NamedDecl *Parent,
131 const DeclContext *DC) {
132 if (!S)
133 return;
134
135 if (DC == 0)
136 DC = Parent->getLexicalDeclContext();
137 BodyIndexer(*this, Parent, DC).TraverseStmt(const_cast<Stmt*>(S));
Argyrios Kyrtzidisdc199a32011-10-17 19:48:19 +0000138}