llvm-project/clang/lib/Index/IndexProvider.cpp

69 lines
1.8 KiB
C++

//===--- IndexProvider.cpp - Map of entities to translation units ---------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSaE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Maps Entities to TranslationUnits
//
//===----------------------------------------------------------------------===//
#include "clang/Index/IndexProvider.h"
#include "clang/Index/Program.h"
#include "clang/Index/EntityHandler.h"
#include "clang/Index/TranslationUnit.h"
using namespace clang;
using namespace idx;
class IndexProvider::Indexer : public EntityHandler {
TranslationUnit *TU;
MapTy ⤅
public:
Indexer(TranslationUnit *tu, MapTy &map) : TU(tu), Map(map) { }
virtual void HandleEntity(Entity *Ent) {
MapTy::iterator I = Map.find(Ent);
if (I != Map.end()) {
I->second.insert(TU);
return;
}
Map[Ent].insert(TU);
}
};
void IndexProvider::IndexAST(TranslationUnit *TU) {
Indexer Idx(TU, Map);
Prog.FindEntities(TU->getASTContext(), &Idx);
}
IndexProvider::translation_unit_iterator
IndexProvider::translation_units_begin(Entity *Ent) const {
MapTy::iterator I = Map.find(Ent);
if (I == Map.end())
return translation_unit_iterator(0);
return I->second.begin();
}
IndexProvider::translation_unit_iterator
IndexProvider::translation_units_end(Entity *Ent) const {
MapTy::iterator I = Map.find(Ent);
if (I == Map.end())
return translation_unit_iterator(0);
return I->second.end();
}
bool IndexProvider::translation_units_empty(Entity *Ent) const {
MapTy::iterator I = Map.find(Ent);
if (I == Map.end())
return true;
return I->second.begin() == I->second.end();
}