blob: ddc22f7fbc02756264c621cfc760320974e23bcb [file] [log] [blame]
Argiris Kirtzidis43d4f2e2009-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"
16#include "clang/Index/Entity.h"
17#include "clang/Index/Handlers.h"
18#include "clang/Index/TranslationUnit.h"
Argiris Kirtzidis933afdf2009-07-29 23:39:52 +000019#include "clang/AST/DeclBase.h"
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000020using namespace clang;
21using namespace idx;
22
23namespace {
24
25class EntityIndexer : public EntityHandler {
26 TranslationUnit *TU;
27 Indexer::MapTy ⤅
28
29public:
30 EntityIndexer(TranslationUnit *tu, Indexer::MapTy &map) : TU(tu), Map(map) { }
31
Argiris Kirtzidis21f89b92009-07-29 23:38:35 +000032 virtual void Handle(Entity Ent) {
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000033 if (Ent.isInternalToTU())
34 return;
35 Map[Ent].insert(TU);
36 }
37};
38
39} // anonymous namespace
40
41void Indexer::IndexAST(TranslationUnit *TU) {
Argiris Kirtzidis8f2a7222009-07-29 23:38:51 +000042 assert(TU && "Passed null TranslationUnit");
Argiris Kirtzidis933afdf2009-07-29 23:39:52 +000043 CtxTUMap[&TU->getASTContext()] = TU;
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000044 EntityIndexer Idx(TU, Map);
Argiris Kirtzidisc13d3b62009-07-29 23:38:45 +000045 Prog.FindEntities(TU->getASTContext(), Idx);
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000046}
47
48void Indexer::GetTranslationUnitsFor(Entity Ent,
Argiris Kirtzidisc13d3b62009-07-29 23:38:45 +000049 TranslationUnitHandler &Handler) {
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000050 assert(Ent.isValid() && "Expected valid Entity");
Argiris Kirtzidis933afdf2009-07-29 23:39:52 +000051
52 if (Ent.isInternalToTU()) {
53 Decl *D = Ent.getInternalDecl();
54 CtxTUMapTy::iterator I = CtxTUMap.find(&D->getASTContext());
55 if (I != CtxTUMap.end())
56 Handler.Handle(I->second);
57 return;
58 }
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000059
60 MapTy::iterator I = Map.find(Ent);
61 if (I == Map.end())
62 return;
63
64 TUSetTy &Set = I->second;
65 for (TUSetTy::iterator I = Set.begin(), E = Set.end(); I != E; ++I)
Argiris Kirtzidisc13d3b62009-07-29 23:38:45 +000066 Handler.Handle(*I);
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000067}