2009-07-13 06:33:12 +08:00
|
|
|
//===--- IndexProvider.cpp - Map of entities to translation units ---------===//
|
2009-07-06 06:22:19 +08:00
|
|
|
//
|
|
|
|
// 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();
|
|
|
|
}
|