blob: 38317eb9c2cffe7062fdc52eb8a1d214a29535d3 [file] [log] [blame]
Chris Lattnerc3a65402009-07-12 22:33:12 +00001//===--- IndexProvider.cpp - Map of entities to translation units ---------===//
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSaE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Maps Entities to TranslationUnits
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Index/IndexProvider.h"
15#include "clang/Index/Program.h"
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000016#include "clang/Index/Entity.h"
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000017#include "clang/Index/EntityHandler.h"
18#include "clang/Index/TranslationUnit.h"
19using namespace clang;
20using namespace idx;
21
22class IndexProvider::Indexer : public EntityHandler {
23 TranslationUnit *TU;
24 MapTy ⤅
25
26public:
27 Indexer(TranslationUnit *tu, MapTy &map) : TU(tu), Map(map) { }
28
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000029 virtual void HandleEntity(Entity Ent) {
30 if (Ent.isInternalToTU())
31 return;
32
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000033 MapTy::iterator I = Map.find(Ent);
34 if (I != Map.end()) {
35 I->second.insert(TU);
36 return;
37 }
38
39 Map[Ent].insert(TU);
40 }
41};
42
43void IndexProvider::IndexAST(TranslationUnit *TU) {
44 Indexer Idx(TU, Map);
45 Prog.FindEntities(TU->getASTContext(), &Idx);
46}
47
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000048static IndexProvider::TUSetTy EmptySet;
49
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000050IndexProvider::translation_unit_iterator
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000051IndexProvider::translation_units_begin(Entity Ent) const {
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000052 MapTy::iterator I = Map.find(Ent);
53 if (I == Map.end())
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000054 return EmptySet.begin();
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000055
56 return I->second.begin();
57}
58
59IndexProvider::translation_unit_iterator
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000060IndexProvider::translation_units_end(Entity Ent) const {
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000061 MapTy::iterator I = Map.find(Ent);
62 if (I == Map.end())
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000063 return EmptySet.end();
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000064
65 return I->second.end();
66}
67
Argyrios Kyrtzidisf7cf15c2009-07-21 00:07:06 +000068bool IndexProvider::translation_units_empty(Entity Ent) const {
Argyrios Kyrtzidis9eec4ed2009-07-05 22:22:19 +000069 MapTy::iterator I = Map.find(Ent);
70 if (I == Map.end())
71 return true;
72
73 return I->second.begin() == I->second.end();
74}