diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-07-21 00:07:06 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-07-21 00:07:06 +0000 |
commit | f7cf15ca3c9bee7c0348f549e7a8f0af32b5fa54 (patch) | |
tree | 05e1fd135984a32777ddfbd291bfdc913046d50a /lib/Index/IndexProvider.cpp | |
parent | 07ef804f918d8aade8739a02e78c6209fd3062a9 (diff) |
Change the semantics for Entity.
Entity can now refer to declarations that are not visible outside the translation unit.
It is a wrapper of a pointer union, it's either a Decl* for declarations that don't
"cross" translation units, or an EntityImpl* which is associated with the specific "visible" Decl.
Included is a test case for handling fields across translation units.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76515 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Index/IndexProvider.cpp')
-rw-r--r-- | lib/Index/IndexProvider.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/Index/IndexProvider.cpp b/lib/Index/IndexProvider.cpp index 074a83d9a6..38317eb9c2 100644 --- a/lib/Index/IndexProvider.cpp +++ b/lib/Index/IndexProvider.cpp @@ -13,6 +13,7 @@ #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; @@ -25,7 +26,10 @@ class IndexProvider::Indexer : public EntityHandler { public: Indexer(TranslationUnit *tu, MapTy &map) : TU(tu), Map(map) { } - virtual void HandleEntity(Entity *Ent) { + virtual void HandleEntity(Entity Ent) { + if (Ent.isInternalToTU()) + return; + MapTy::iterator I = Map.find(Ent); if (I != Map.end()) { I->second.insert(TU); @@ -41,25 +45,27 @@ void IndexProvider::IndexAST(TranslationUnit *TU) { Prog.FindEntities(TU->getASTContext(), &Idx); } +static IndexProvider::TUSetTy EmptySet; + IndexProvider::translation_unit_iterator -IndexProvider::translation_units_begin(Entity *Ent) const { +IndexProvider::translation_units_begin(Entity Ent) const { MapTy::iterator I = Map.find(Ent); if (I == Map.end()) - return translation_unit_iterator(0); + return EmptySet.begin(); return I->second.begin(); } IndexProvider::translation_unit_iterator -IndexProvider::translation_units_end(Entity *Ent) const { +IndexProvider::translation_units_end(Entity Ent) const { MapTy::iterator I = Map.find(Ent); if (I == Map.end()) - return translation_unit_iterator(0); + return EmptySet.end(); return I->second.end(); } -bool IndexProvider::translation_units_empty(Entity *Ent) const { +bool IndexProvider::translation_units_empty(Entity Ent) const { MapTy::iterator I = Map.find(Ent); if (I == Map.end()) return true; |