blob: 0b534b38814224013399ec3a4db92ac0e701545a [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"
19using namespace clang;
20using namespace idx;
21
22namespace {
23
24class EntityIndexer : public EntityHandler {
25 TranslationUnit *TU;
26 Indexer::MapTy ⤅
27
28public:
29 EntityIndexer(TranslationUnit *tu, Indexer::MapTy &map) : TU(tu), Map(map) { }
30
Argiris Kirtzidis21f89b92009-07-29 23:38:35 +000031 virtual void Handle(Entity Ent) {
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000032 if (Ent.isInternalToTU())
33 return;
34 Map[Ent].insert(TU);
35 }
36};
37
38} // anonymous namespace
39
40void Indexer::IndexAST(TranslationUnit *TU) {
Argiris Kirtzidis8f2a7222009-07-29 23:38:51 +000041 assert(TU && "Passed null TranslationUnit");
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000042 EntityIndexer Idx(TU, Map);
Argiris Kirtzidisc13d3b62009-07-29 23:38:45 +000043 Prog.FindEntities(TU->getASTContext(), Idx);
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000044}
45
46void Indexer::GetTranslationUnitsFor(Entity Ent,
Argiris Kirtzidisc13d3b62009-07-29 23:38:45 +000047 TranslationUnitHandler &Handler) {
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000048 assert(Ent.isValid() && "Expected valid Entity");
49 assert(!Ent.isInternalToTU() &&
50 "Expected an Entity visible outside of its translation unit");
51
52 MapTy::iterator I = Map.find(Ent);
53 if (I == Map.end())
54 return;
55
56 TUSetTy &Set = I->second;
57 for (TUSetTy::iterator I = Set.begin(), E = Set.end(); I != E; ++I)
Argiris Kirtzidisc13d3b62009-07-29 23:38:45 +000058 Handler.Handle(*I);
Argiris Kirtzidis43d4f2e2009-07-29 23:38:21 +000059}
60
61static Indexer::TUSetTy EmptySet;
62
63Indexer::translation_unit_iterator
64Indexer::translation_units_begin(Entity Ent) const {
65 MapTy::iterator I = Map.find(Ent);
66 if (I == Map.end())
67 return EmptySet.begin();
68
69 return I->second.begin();
70}
71
72Indexer::translation_unit_iterator
73Indexer::translation_units_end(Entity Ent) const {
74 MapTy::iterator I = Map.find(Ent);
75 if (I == Map.end())
76 return EmptySet.end();
77
78 return I->second.end();
79}
80
81bool Indexer::translation_units_empty(Entity Ent) const {
82 MapTy::iterator I = Map.find(Ent);
83 if (I == Map.end())
84 return true;
85
86 return I->second.begin() == I->second.end();
87}