[cfe-commits] r77528 - in /cfe/trunk: include/clang/Index/Handlers.h include/clang/Index/Indexer.h lib/Index/Indexer.cpp tools/index-test/index-test.cpp

Argiris Kirtzidis akyrtzi at gmail.com
Wed Jul 29 16:39:03 PDT 2009


Author: akirtzidis
Date: Wed Jul 29 18:39:03 2009
New Revision: 77528

URL: http://llvm.org/viewvc/llvm-project?rev=77528&view=rev
Log:
Introduce a helper template for the Handler classes and use it instead
of the iterator of the Indexer class.

Modified:
    cfe/trunk/include/clang/Index/Handlers.h
    cfe/trunk/include/clang/Index/Indexer.h
    cfe/trunk/lib/Index/Indexer.cpp
    cfe/trunk/tools/index-test/index-test.cpp

Modified: cfe/trunk/include/clang/Index/Handlers.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/Handlers.h?rev=77528&r1=77527&r2=77528&view=diff

==============================================================================
--- cfe/trunk/include/clang/Index/Handlers.h (original)
+++ cfe/trunk/include/clang/Index/Handlers.h Wed Jul 29 18:39:03 2009
@@ -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 @@
 /// \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 @@
 /// \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

Modified: cfe/trunk/include/clang/Index/Indexer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/Indexer.h?rev=77528&r1=77527&r2=77528&view=diff

==============================================================================
--- cfe/trunk/include/clang/Index/Indexer.h (original)
+++ cfe/trunk/include/clang/Index/Indexer.h Wed Jul 29 18:39:03 2009
@@ -40,12 +40,6 @@
   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;

Modified: cfe/trunk/lib/Index/Indexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/Indexer.cpp?rev=77528&r1=77527&r2=77528&view=diff

==============================================================================
--- cfe/trunk/lib/Index/Indexer.cpp (original)
+++ cfe/trunk/lib/Index/Indexer.cpp Wed Jul 29 18:39:03 2009
@@ -57,31 +57,3 @@
   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();
-}

Modified: cfe/trunk/tools/index-test/index-test.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/index-test/index-test.cpp?rev=77528&r1=77527&r2=77528&view=diff

==============================================================================
--- cfe/trunk/tools/index-test/index-test.cpp (original)
+++ cfe/trunk/tools/index-test/index-test.cpp Wed Jul 29 18:39:03 2009
@@ -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 @@
   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);
   }





More information about the cfe-commits mailing list