blob: 08e367a27902c037429d6a3d25f5304318bbe81d [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}