blob: 57bfc5b4fbfd2afa6386a668d1f4039f283786eb [file] [log] [blame]
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +00001//===--- Indexer.cpp - IndexProvider implementation -------------*- C++ -*-===//
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// IndexProvider implementation.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Index/Indexer.h"
15#include "clang/Index/Program.h"
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000016#include "clang/Index/Handlers.h"
17#include "clang/Index/TranslationUnit.h"
Argyrios Kyrtzidisd88284b2009-07-29 23:41:18 +000018#include "ASTVisitor.h"
Argyrios Kyrtzidis52f1d472009-07-29 23:39:52 +000019#include "clang/AST/DeclBase.h"
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000020using namespace clang;
21using namespace idx;
22
23namespace {
24
25class EntityIndexer : public EntityHandler {
26 TranslationUnit *TU;
27 Indexer::MapTy ⤅
Mike Stump1eb44332009-09-09 15:08:12 +000028
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000029public:
30 EntityIndexer(TranslationUnit *tu, Indexer::MapTy &map) : TU(tu), Map(map) { }
31
Argyrios Kyrtzidis77b4a792009-07-29 23:38:35 +000032 virtual void Handle(Entity Ent) {
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000033 if (Ent.isInternalToTU())
34 return;
35 Map[Ent].insert(TU);
36 }
37};
38
Argyrios Kyrtzidisd88284b2009-07-29 23:41:18 +000039class SelectorIndexer : public ASTVisitor<SelectorIndexer> {
40 Program &Prog;
41 TranslationUnit *TU;
42 Indexer::SelMapTy &Map;
43
44public:
45 SelectorIndexer(Program &prog, TranslationUnit *tu, Indexer::SelMapTy &map)
46 : Prog(prog), TU(tu), Map(map) { }
47
48 void VisitObjCMethodDecl(ObjCMethodDecl *D) {
49 Map[GlobalSelector::get(D->getSelector(), Prog)].insert(TU);
50 Base::VisitObjCMethodDecl(D);
51 }
52
53 void VisitObjCMessageExpr(ObjCMessageExpr *Node) {
54 Map[GlobalSelector::get(Node->getSelector(), Prog)].insert(TU);
55 Base::VisitObjCMessageExpr(Node);
56 }
57};
58
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000059} // anonymous namespace
60
61void Indexer::IndexAST(TranslationUnit *TU) {
Argyrios Kyrtzidisdaf253d2009-07-29 23:38:51 +000062 assert(TU && "Passed null TranslationUnit");
Argyrios Kyrtzidisd88284b2009-07-29 23:41:18 +000063 ASTContext &Ctx = TU->getASTContext();
64 CtxTUMap[&Ctx] = TU;
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000065 EntityIndexer Idx(TU, Map);
Argyrios Kyrtzidisd88284b2009-07-29 23:41:18 +000066 Prog.FindEntities(Ctx, Idx);
Mike Stump1eb44332009-09-09 15:08:12 +000067
Argyrios Kyrtzidisd88284b2009-07-29 23:41:18 +000068 SelectorIndexer SelIdx(Prog, TU, SelMap);
69 SelIdx.Visit(Ctx.getTranslationUnitDecl());
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000070}
71
72void Indexer::GetTranslationUnitsFor(Entity Ent,
Argyrios Kyrtzidis16d8bcf2009-07-29 23:38:45 +000073 TranslationUnitHandler &Handler) {
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000074 assert(Ent.isValid() && "Expected valid Entity");
Argyrios Kyrtzidis52f1d472009-07-29 23:39:52 +000075
76 if (Ent.isInternalToTU()) {
77 Decl *D = Ent.getInternalDecl();
78 CtxTUMapTy::iterator I = CtxTUMap.find(&D->getASTContext());
79 if (I != CtxTUMap.end())
80 Handler.Handle(I->second);
81 return;
82 }
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000083
84 MapTy::iterator I = Map.find(Ent);
85 if (I == Map.end())
86 return;
Mike Stump1eb44332009-09-09 15:08:12 +000087
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000088 TUSetTy &Set = I->second;
89 for (TUSetTy::iterator I = Set.begin(), E = Set.end(); I != E; ++I)
Argyrios Kyrtzidis16d8bcf2009-07-29 23:38:45 +000090 Handler.Handle(*I);
Argyrios Kyrtzidisb17dc462009-07-29 23:38:21 +000091}
Argyrios Kyrtzidisd88284b2009-07-29 23:41:18 +000092
93void Indexer::GetTranslationUnitsFor(GlobalSelector Sel,
94 TranslationUnitHandler &Handler) {
95 assert(Sel.isValid() && "Expected valid GlobalSelector");
96
97 SelMapTy::iterator I = SelMap.find(Sel);
98 if (I == SelMap.end())
99 return;
Mike Stump1eb44332009-09-09 15:08:12 +0000100
Argyrios Kyrtzidisd88284b2009-07-29 23:41:18 +0000101 TUSetTy &Set = I->second;
102 for (TUSetTy::iterator I = Set.begin(), E = Set.end(); I != E; ++I)
103 Handler.Handle(*I);
104}