of the iterator of the Indexer class.
llvm-svn: 77528
#ifndef LLVM_CLANG_INDEX_HANDLERS_H
#define LLVM_CLANG_INDEX_HANDLERS_H
+#include "llvm/ADT/SmallVector.h"
+
namespace clang {
namespace idx {
/// \brief Abstract interface for receiving Entities.
class EntityHandler {
public:
+ typedef Entity receiving_type;
+
virtual ~EntityHandler();
virtual void Handle(Entity Ent) = 0;
};
/// \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<TranslationUnitHandler> TURes;
+/// IndexProvider.GetTranslationUnitsFor(Entity, TURes);
+/// for (Storing<TranslationUnitHandler>::iterator
+/// I = TURes.begin(), E = TURes.end(); I != E; ++I) { ....
+/// @endcode
+template <typename handler_type>
+class Storing : public handler_type {
+ typedef typename handler_type::receiving_type receiving_type;
+ typedef llvm::SmallVector<receiving_type, 8> 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
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;
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();
-}
#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"
if (Ent.isInvalid() || Ent.isInternalToTU())
return ProcessDecl(D);
+ Storing<TranslationUnitHandler> 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<TUnit*>(*I);
- Decl *OtherD = Ent.getDecl(TU->getASTContext());
+ for (Storing<TranslationUnitHandler>::iterator
+ I = TURes.begin(), E = TURes.end(); I != E; ++I) {
+ Decl *OtherD = Ent.getDecl((*I)->getASTContext());
assert(OtherD && "Couldn't resolve Entity");
ProcessDecl(OtherD);
}