Modify the Indexer class so that it can return the TranslationUnit that internal
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 29 Jul 2009 23:39:52 +0000 (23:39 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 29 Jul 2009 23:39:52 +0000 (23:39 +0000)
decls originated from.

llvm-svn: 77534

clang/include/clang/Index/Indexer.h
clang/lib/Index/Entity.cpp
clang/lib/Index/Indexer.cpp

index 3597dbf..4fa3616 100644 (file)
 
 #include "clang/Index/IndexProvider.h"
 #include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/DenseMap.h"
 #include <map>
 
 namespace clang {
+  class ASTContext;
 
 namespace idx {
   class Program;
@@ -28,6 +30,7 @@ namespace idx {
 class Indexer : public IndexProvider {
 public:
   typedef llvm::SmallPtrSet<TranslationUnit *, 4> TUSetTy;
+  typedef llvm::DenseMap<ASTContext *, TranslationUnit *> CtxTUMapTy;
   typedef std::map<Entity, TUSetTy> MapTy;
 
   explicit Indexer(Program &prog) : Prog(prog) { }
index 85b4f2e..d331100 100644 (file)
@@ -59,11 +59,12 @@ Entity EntityGetter::VisitNamedDecl(NamedDecl *D) {
     return Entity(D);
 
   // FIXME: Only works for DeclarationNames that are identifiers.
+  // Treats other DeclarationNames as internal Decls for now..
 
   DeclarationName Name = D->getDeclName();
 
   if (!Name.isIdentifier())
-    return Entity();
+    return Entity(D);
 
   IdentifierInfo *II = Name.getAsIdentifierInfo();
   if (!II)
index 08e367a..ddc22f7 100644 (file)
@@ -16,6 +16,7 @@
 #include "clang/Index/Entity.h"
 #include "clang/Index/Handlers.h"
 #include "clang/Index/TranslationUnit.h"
+#include "clang/AST/DeclBase.h"
 using namespace clang;
 using namespace idx;
 
@@ -39,6 +40,7 @@ public:
 
 void Indexer::IndexAST(TranslationUnit *TU) {
   assert(TU && "Passed null TranslationUnit");
+  CtxTUMap[&TU->getASTContext()] = TU;
   EntityIndexer Idx(TU, Map);
   Prog.FindEntities(TU->getASTContext(), Idx);
 }
@@ -46,8 +48,14 @@ void Indexer::IndexAST(TranslationUnit *TU) {
 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");
+
+  if (Ent.isInternalToTU()) {
+    Decl *D = Ent.getInternalDecl();
+    CtxTUMapTy::iterator I = CtxTUMap.find(&D->getASTContext());
+    if (I != CtxTUMap.end())
+      Handler.Handle(I->second);
+    return;
+  }
 
   MapTy::iterator I = Map.find(Ent);
   if (I == Map.end())