diff options
Diffstat (limited to 'lib/Sema/SemaLookup.cpp')
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index abb265da49..da2deec02a 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -181,6 +181,66 @@ BasePaths *Sema::LookupResult::getBasePaths() const { return reinterpret_cast<BasePaths *>(First); } +Sema::LookupResult::iterator::reference +Sema::LookupResult::iterator::operator*() const { + switch (Result->StoredKind) { + case SingleDecl: + return reinterpret_cast<Decl*>(Current); + + case OverloadedDeclFromIdResolver: + return *IdentifierResolver::iterator::getFromOpaqueValue(Current); + + case OverloadedDeclFromDeclContext: + return *reinterpret_cast<DeclContext::lookup_iterator>(Current); + + case AmbiguousLookup: + assert(false && "Cannot look into ambiguous lookup results"); + break; + } + + return 0; +} + +Sema::LookupResult::iterator& Sema::LookupResult::iterator::operator++() { + switch (Result->StoredKind) { + case SingleDecl: + Current = reinterpret_cast<uintptr_t>((Decl*)0); + break; + + case OverloadedDeclFromIdResolver: { + IdentifierResolver::iterator I + = IdentifierResolver::iterator::getFromOpaqueValue(Current); + ++I; + Current = I.getAsOpaqueValue(); + break; + } + + case OverloadedDeclFromDeclContext: { + DeclContext::lookup_iterator I + = reinterpret_cast<DeclContext::lookup_iterator>(Current); + ++I; + Current = reinterpret_cast<uintptr_t>(I); + break; + } + + case AmbiguousLookup: + assert(false && "Cannot look into ambiguous lookup results"); + break; + } + + return *this; +} + +Sema::LookupResult::iterator Sema::LookupResult::begin() { + assert(StoredKind != AmbiguousLookup && "Lookup into an ambiguous result"); + return iterator(this, First); +} + +Sema::LookupResult::iterator Sema::LookupResult::end() { + assert(StoredKind != AmbiguousLookup && "Lookup into an ambiguous result"); + return iterator(this, Last); +} + // Retrieve the set of identifier namespaces that correspond to a // specific kind of name lookup. inline unsigned |