From: Argyrios Kyrtzidis Date: Wed, 29 Jul 2009 23:39:03 +0000 (+0000) Subject: Introduce a helper template for the Handler classes and use it instead X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f1a0fd852f29d3ff6f1ee7a39f4d339dd24aa9ea;p=platform%2Fupstream%2Fllvm.git Introduce a helper template for the Handler classes and use it instead of the iterator of the Indexer class. llvm-svn: 77528 --- diff --git a/clang/include/clang/Index/Handlers.h b/clang/include/clang/Index/Handlers.h index 638edc8..4a7b855 100644 --- a/clang/include/clang/Index/Handlers.h +++ b/clang/include/clang/Index/Handlers.h @@ -14,6 +14,8 @@ #ifndef LLVM_CLANG_INDEX_HANDLERS_H #define LLVM_CLANG_INDEX_HANDLERS_H +#include "llvm/ADT/SmallVector.h" + namespace clang { namespace idx { @@ -23,6 +25,8 @@ namespace idx { /// \brief Abstract interface for receiving Entities. class EntityHandler { public: + typedef Entity receiving_type; + virtual ~EntityHandler(); virtual void Handle(Entity Ent) = 0; }; @@ -30,10 +34,36 @@ public: /// \brief Abstract interface for receiving TranslationUnits. class TranslationUnitHandler { public: + typedef TranslationUnit* receiving_type; + virtual ~TranslationUnitHandler(); virtual void Handle(TranslationUnit *TU) = 0; }; + +/// \brief Helper for the Handler classes. Stores the objects into a vector. +/// example: +/// @code +/// Storing TURes; +/// IndexProvider.GetTranslationUnitsFor(Entity, TURes); +/// for (Storing::iterator +/// I = TURes.begin(), E = TURes.end(); I != E; ++I) { .... +/// @endcode +template +class Storing : public handler_type { + typedef typename handler_type::receiving_type receiving_type; + typedef llvm::SmallVector StoreTy; + StoreTy Store; +public: + virtual void Handle(receiving_type Obj) { + Store.push_back(Obj); + } + + typedef typename StoreTy::const_iterator iterator; + iterator begin() const { return Store.begin(); } + iterator end() const { return Store.end(); } +}; + } // namespace idx } // namespace clang diff --git a/clang/include/clang/Index/Indexer.h b/clang/include/clang/Index/Indexer.h index 88a2ace..3597dbf 100644 --- a/clang/include/clang/Index/Indexer.h +++ b/clang/include/clang/Index/Indexer.h @@ -40,12 +40,6 @@ public: 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; diff --git a/clang/lib/Index/Indexer.cpp b/clang/lib/Index/Indexer.cpp index 0b534b3..08e367a 100644 --- a/clang/lib/Index/Indexer.cpp +++ b/clang/lib/Index/Indexer.cpp @@ -57,31 +57,3 @@ void Indexer::GetTranslationUnitsFor(Entity Ent, 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/clang/tools/index-test/index-test.cpp b/clang/tools/index-test/index-test.cpp index a88d270..78ffd37 100644 --- a/clang/tools/index-test/index-test.cpp +++ b/clang/tools/index-test/index-test.cpp @@ -38,6 +38,7 @@ #include "clang/Index/TranslationUnit.h" #include "clang/Index/ASTLocation.h" #include "clang/Index/DeclReferenceMap.h" +#include "clang/Index/Handlers.h" #include "clang/Index/Utils.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CommandLineSourceLoc.h" @@ -155,12 +156,13 @@ static void ProcessASTLocation(ASTLocation ASTLoc, Indexer &Idxer) { if (Ent.isInvalid() || Ent.isInternalToTU()) return ProcessDecl(D); + Storing TURes; + Idxer.GetTranslationUnitsFor(Ent, TURes); + // Find the "same" Decl in other translation units and print information. - for (Indexer::translation_unit_iterator - I = Idxer.translation_units_begin(Ent), - E = Idxer.translation_units_end(Ent); I != E; ++I) { - TUnit *TU = static_cast(*I); - Decl *OtherD = Ent.getDecl(TU->getASTContext()); + for (Storing::iterator + I = TURes.begin(), E = TURes.end(); I != E; ++I) { + Decl *OtherD = Ent.getDecl((*I)->getASTContext()); assert(OtherD && "Couldn't resolve Entity"); ProcessDecl(OtherD); }