diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-10-04 14:42:37 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-10-05 14:22:05 +0200 |
commit | 189311816cc7883fd8522b5102f492d87fd1b28d (patch) | |
tree | 9c74b7878f56f61600ececde696e44af08e1d4fa /src/libs/cplusplus/LookupContext.cpp | |
parent | 5d2d31279bd7df7b69b9713114d3225fd16f774c (diff) | |
download | qt-creator-189311816cc7883fd8522b5102f492d87fd1b28d.tar.gz |
Resolve local using namespace directives.
Reviewed-by: Erik Verbruggen
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r-- | src/libs/cplusplus/LookupContext.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 813a50bb8a..8619502e51 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -238,8 +238,21 @@ ClassOrNamespace *LookupContext::globalNamespace() const ClassOrNamespace *LookupContext::lookupType(const Name *name, Scope *scope) const { - if (ClassOrNamespace *b = bindings()->lookupType(scope)) + if (! scope) { + return 0; + } else if (Block *block = scope->asBlock()) { + for (unsigned i = 0; i < block->memberCount(); ++i) { + if (UsingNamespaceDirective *u = block->memberAt(i)->asUsingNamespaceDirective()) { + if (ClassOrNamespace *uu = lookupType(u->name(), scope->enclosingNamespace())) { + if (ClassOrNamespace *r = uu->lookupType(name)) + return r; + } + } + } + return lookupType(name, scope->enclosingScope()); + } else if (ClassOrNamespace *b = bindings()->lookupType(scope)) { return b->lookupType(name); + } return 0; } @@ -257,25 +270,19 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const return candidates; for (; scope; scope = scope->enclosingScope()) { - if ((name->isNameId() || name->isTemplateNameId()) && scope->isBlock()) { + if (name->identifier() != 0 && scope->isBlock()) { bindings()->lookupInScope(name, scope, &candidates, /*templateId = */ 0, /*binding=*/ 0); if (! candidates.isEmpty()) break; // it's a local. - for (unsigned index = 0; index < scope->memberCount(); ++index) { - Symbol *member = scope->memberAt(index); + for (unsigned i = 0; i < scope->memberCount(); ++i) { + if (UsingNamespaceDirective *u = scope->memberAt(i)->asUsingNamespaceDirective()) { + if (ClassOrNamespace *uu = lookupType(u->name(), scope->enclosingNamespace())) { + candidates = uu->find(name); - if (UsingNamespaceDirective *u = member->asUsingNamespaceDirective()) { - if (Namespace *enclosingNamespace = u->enclosingNamespace()->asNamespace()) { - if (ClassOrNamespace *b = bindings()->lookupType(enclosingNamespace)) { - if (ClassOrNamespace *uu = b->lookupType(u->name())) { - candidates = uu->find(name); - - if (! candidates.isEmpty()) - return candidates; - } - } + if (! candidates.isEmpty()) + return candidates; } } } |