summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-10-04 14:42:37 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-10-05 14:22:05 +0200
commit189311816cc7883fd8522b5102f492d87fd1b28d (patch)
tree9c74b7878f56f61600ececde696e44af08e1d4fa /src/libs/cplusplus/LookupContext.cpp
parent5d2d31279bd7df7b69b9713114d3225fd16f774c (diff)
downloadqt-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.cpp35
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;
}
}
}