diff options
-rw-r--r-- | include/clang/Index/Handlers.h (renamed from include/clang/Index/EntityHandler.h) | 18 | ||||
-rw-r--r-- | include/clang/Index/IndexProvider.h | 35 | ||||
-rw-r--r-- | include/clang/Index/Indexer.h | 59 | ||||
-rw-r--r-- | lib/Index/Handlers.cpp | 21 | ||||
-rw-r--r-- | lib/Index/IndexProvider.cpp | 64 | ||||
-rw-r--r-- | lib/Index/Indexer.cpp | 86 | ||||
-rw-r--r-- | lib/Index/Program.cpp | 5 | ||||
-rw-r--r-- | tools/index-test/index-test.cpp | 18 |
8 files changed, 201 insertions, 105 deletions
diff --git a/include/clang/Index/EntityHandler.h b/include/clang/Index/Handlers.h index 4cde3e7f90..631e5bb340 100644 --- a/include/clang/Index/EntityHandler.h +++ b/include/clang/Index/Handlers.h @@ -1,4 +1,4 @@ -//===--- EntityHandler.h - Interface for receiving entities -----*- C++ -*-===// +//===--- Handlers.h - Interfaces for receiving information ------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,23 +7,31 @@ // //===----------------------------------------------------------------------===// // -// Abstract interface for receiving Entities. +// Abstract interfaces for receiving information. // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_INDEX_ENTITYHANDLER_H -#define LLVM_CLANG_INDEX_ENTITYHANDLER_H +#ifndef LLVM_CLANG_INDEX_HANDLERS_H +#define LLVM_CLANG_INDEX_HANDLERS_H namespace clang { namespace idx { class Entity; + class TranslationUnit; /// \brief Abstract interface for receiving Entities. class EntityHandler { public: virtual ~EntityHandler(); - virtual void HandleEntity(Entity Ent); + virtual void HandleEntity(Entity Ent) = 0; +}; + +/// \brief Abstract interface for receiving TranslationUnits. +class TranslationUnitHandler { +public: + virtual ~TranslationUnitHandler(); + virtual void Handle(TranslationUnit *TU) = 0; }; } // namespace idx diff --git a/include/clang/Index/IndexProvider.h b/include/clang/Index/IndexProvider.h index ab86474f9a..bf776eee4f 100644 --- a/include/clang/Index/IndexProvider.h +++ b/include/clang/Index/IndexProvider.h @@ -1,4 +1,4 @@ -//===--- IndexProvider.h - Map of entities to translation units -*- C++ -*-===// +//===--- IndexProvider.h - Maps information to translation units -*- C++ -*-==// // // The LLVM Compiler Infrastructure // @@ -7,46 +7,25 @@ // //===----------------------------------------------------------------------===// // -// Maps Entities to TranslationUnits +// Maps information to TranslationUnits. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_INDEX_INDEXPROVIDER_H #define LLVM_CLANG_INDEX_INDEXPROVIDER_H -#include "llvm/ADT/SmallPtrSet.h" -#include <map> - namespace clang { namespace idx { - class Program; class Entity; - class TranslationUnit; + class TranslationUnitHandler; -/// \brief Maps Entities to TranslationUnits. +/// \brief Maps information to TranslationUnits. class IndexProvider { public: - typedef llvm::SmallPtrSet<TranslationUnit *, 4> TUSetTy; - typedef std::map<Entity, TUSetTy> MapTy; - class Indexer; - - explicit IndexProvider(Program &prog) : Prog(prog) { } - - Program &getProgram() const { return Prog; } - - /// \brief Find all Entities and map them to the given translation unit. - void IndexAST(TranslationUnit *TU); - - typedef TUSetTy::iterator translation_unit_iterator; - - translation_unit_iterator translation_units_begin(Entity Ent) const; - translation_unit_iterator translation_units_end(Entity Ent) const; - bool translation_units_empty(Entity Ent) const; - -private: - Program &Prog; - mutable MapTy Map; + virtual ~IndexProvider(); + virtual void GetTranslationUnitsFor(Entity Ent, + TranslationUnitHandler *Handler) = 0; }; } // namespace idx diff --git a/include/clang/Index/Indexer.h b/include/clang/Index/Indexer.h new file mode 100644 index 0000000000..a7c29581a0 --- /dev/null +++ b/include/clang/Index/Indexer.h @@ -0,0 +1,59 @@ +//===--- Indexer.h - IndexProvider implementation ---------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// IndexProvider implementation. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_INDEX_INDEXER_H +#define LLVM_CLANG_INDEX_INDEXER_H + +#include "clang/Index/IndexProvider.h" +#include "llvm/ADT/SmallPtrSet.h" +#include <map> + +namespace clang { + +namespace idx { + class Program; + class TranslationUnit; + +/// \brief Maps information to TranslationUnits. +class Indexer : public IndexProvider { +public: + typedef llvm::SmallPtrSet<TranslationUnit *, 4> TUSetTy; + typedef std::map<Entity, TUSetTy> MapTy; + + explicit Indexer(Program &prog) : Prog(prog) { } + + Program &getProgram() const { return Prog; } + + /// \brief Find all Entities and map them to the given translation unit. + void IndexAST(TranslationUnit *TU); + + virtual void GetTranslationUnitsFor(Entity Ent, + TranslationUnitHandler *Handler); + + typedef TUSetTy::iterator translation_unit_iterator; + + translation_unit_iterator translation_units_begin(Entity Ent) const; + translation_unit_iterator translation_units_end(Entity Ent) const; + bool translation_units_empty(Entity Ent) const; + +private: + Program &Prog; + MapTy Map; + CtxTUMapTy CtxTUMap; +}; + +} // namespace idx + +} // namespace clang + +#endif diff --git a/lib/Index/Handlers.cpp b/lib/Index/Handlers.cpp new file mode 100644 index 0000000000..c94314b295 --- /dev/null +++ b/lib/Index/Handlers.cpp @@ -0,0 +1,21 @@ +//===--- Handlers.cpp - Interfaces for receiving information ----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Abstract interfaces for receiving information. +// +//===----------------------------------------------------------------------===// + +#include "clang/Index/Handlers.h" +#include "clang/Index/Entity.h" +using namespace clang; +using namespace idx; + +// Out-of-line to give the virtual tables a home. +EntityHandler::~EntityHandler() { } +TranslationUnitHandler::~TranslationUnitHandler() { } diff --git a/lib/Index/IndexProvider.cpp b/lib/Index/IndexProvider.cpp index 38317eb9c2..eea0988757 100644 --- a/lib/Index/IndexProvider.cpp +++ b/lib/Index/IndexProvider.cpp @@ -1,74 +1,20 @@ -//===--- IndexProvider.cpp - Map of entities to translation units ---------===// +//===- IndexProvider.cpp - Maps information to translation units -*- C++ -*-==// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source -// License. See LICENSaE.TXT for details. +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // -// Maps Entities to TranslationUnits +// Maps information to TranslationUnits. // //===----------------------------------------------------------------------===// #include "clang/Index/IndexProvider.h" -#include "clang/Index/Program.h" #include "clang/Index/Entity.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) { - if (Ent.isInternalToTU()) - return; - - 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); -} - -static IndexProvider::TUSetTy EmptySet; - -IndexProvider::translation_unit_iterator -IndexProvider::translation_units_begin(Entity Ent) const { - MapTy::iterator I = Map.find(Ent); - if (I == Map.end()) - return EmptySet.begin(); - - 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 EmptySet.end(); - - 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(); -} +// Out-of-line to give the virtual table a home. +IndexProvider::~IndexProvider() { } diff --git a/lib/Index/Indexer.cpp b/lib/Index/Indexer.cpp new file mode 100644 index 0000000000..58787d1485 --- /dev/null +++ b/lib/Index/Indexer.cpp @@ -0,0 +1,86 @@ +//===--- Indexer.cpp - IndexProvider implementation -------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// IndexProvider implementation. +// +//===----------------------------------------------------------------------===// + +#include "clang/Index/Indexer.h" +#include "clang/Index/Program.h" +#include "clang/Index/Entity.h" +#include "clang/Index/Handlers.h" +#include "clang/Index/TranslationUnit.h" +using namespace clang; +using namespace idx; + +namespace { + +class EntityIndexer : public EntityHandler { + TranslationUnit *TU; + Indexer::MapTy ⤅ + +public: + EntityIndexer(TranslationUnit *tu, Indexer::MapTy &map) : TU(tu), Map(map) { } + + virtual void HandleEntity(Entity Ent) { + if (Ent.isInternalToTU()) + return; + Map[Ent].insert(TU); + } +}; + +} // anonymous namespace + +void Indexer::IndexAST(TranslationUnit *TU) { + EntityIndexer Idx(TU, Map); + Prog.FindEntities(TU->getASTContext(), &Idx); +} + +void Indexer::GetTranslationUnitsFor(Entity Ent, + TranslationUnitHandler *Handler) { + assert(Ent.isValid() && "Expected valid Entity"); + assert(!Ent.isInternalToTU() && + "Expected an Entity visible outside of its translation unit"); + + MapTy::iterator I = Map.find(Ent); + if (I == Map.end()) + return; + + TUSetTy &Set = I->second; + for (TUSetTy::iterator I = Set.begin(), E = Set.end(); I != E; ++I) + Handler->Handle(*I); +} + +static Indexer::TUSetTy EmptySet; + +Indexer::translation_unit_iterator +Indexer::translation_units_begin(Entity Ent) const { + MapTy::iterator I = Map.find(Ent); + if (I == Map.end()) + return EmptySet.begin(); + + return I->second.begin(); +} + +Indexer::translation_unit_iterator +Indexer::translation_units_end(Entity Ent) const { + MapTy::iterator I = Map.find(Ent); + if (I == Map.end()) + return EmptySet.end(); + + return I->second.end(); +} + +bool Indexer::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(); +} diff --git a/lib/Index/Program.cpp b/lib/Index/Program.cpp index 73759dc95c..48c85f8472 100644 --- a/lib/Index/Program.cpp +++ b/lib/Index/Program.cpp @@ -13,7 +13,7 @@ #include "clang/Index/Program.h" #include "ProgramImpl.h" -#include "clang/Index/EntityHandler.h" +#include "clang/Index/Handlers.h" #include "clang/Index/TranslationUnit.h" #include "clang/AST/DeclBase.h" #include "clang/AST/ASTContext.h" @@ -22,11 +22,8 @@ using namespace clang; using namespace idx; // Out-of-line to give the virtual tables a home. -EntityHandler::~EntityHandler() { } TranslationUnit::~TranslationUnit() { } -void EntityHandler::HandleEntity(Entity Ent) { } - Program::Program() : Impl(new ProgramImpl()) { } Program::~Program() { diff --git a/tools/index-test/index-test.cpp b/tools/index-test/index-test.cpp index 4516e31365..a88d270327 100644 --- a/tools/index-test/index-test.cpp +++ b/tools/index-test/index-test.cpp @@ -33,7 +33,7 @@ //===----------------------------------------------------------------------===// #include "clang/Index/Program.h" -#include "clang/Index/IndexProvider.h" +#include "clang/Index/Indexer.h" #include "clang/Index/Entity.h" #include "clang/Index/TranslationUnit.h" #include "clang/Index/ASTLocation.h" @@ -141,7 +141,7 @@ static void ProcessDecl(Decl *D) { } } -static void ProcessASTLocation(ASTLocation ASTLoc, IndexProvider &IdxProvider) { +static void ProcessASTLocation(ASTLocation ASTLoc, Indexer &Idxer) { assert(ASTLoc.isValid()); Decl *D = ASTLoc.getReferencedDecl(); @@ -151,14 +151,14 @@ static void ProcessASTLocation(ASTLocation ASTLoc, IndexProvider &IdxProvider) { return; } - Entity Ent = Entity::get(D, IdxProvider.getProgram()); + Entity Ent = Entity::get(D, Idxer.getProgram()); if (Ent.isInvalid() || Ent.isInternalToTU()) return ProcessDecl(D); // Find the "same" Decl in other translation units and print information. - for (IndexProvider::translation_unit_iterator - I = IdxProvider.translation_units_begin(Ent), - E = IdxProvider.translation_units_end(Ent); I != E; ++I) { + for (Indexer::translation_unit_iterator + I = Idxer.translation_units_begin(Ent), + E = Idxer.translation_units_end(Ent); I != E; ++I) { TUnit *TU = static_cast<TUnit*>(*I); Decl *OtherD = Ent.getDecl(TU->getASTContext()); assert(OtherD && "Couldn't resolve Entity"); @@ -178,7 +178,7 @@ int main(int argc, char **argv) { FileManager FileMgr; Program Prog; - IndexProvider IdxProvider(Prog); + Indexer Idxer(Prog); llvm::SmallVector<TUnit*, 4> TUnits; // If no input was specified, read from stdin. @@ -200,7 +200,7 @@ int main(int argc, char **argv) { TUnit *TU = new TUnit(AST.take(), InFile); TUnits.push_back(TU); - IdxProvider.IndexAST(TU); + Idxer.IndexAST(TU); } ASTLocation ASTLoc; @@ -253,7 +253,7 @@ int main(int argc, char **argv) { FirstAST->getASTContext().getCommentForDecl(ASTLoc.getDecl())) OS << "Comment associated with this declaration:\n" << Comment << "\n"; } else { - ProcessASTLocation(ASTLoc, IdxProvider); + ProcessASTLocation(ASTLoc, Idxer); } } |