OSDN Git Service

Resolve local using namespace directives.
authorRoberto Raggi <roberto.raggi@nokia.com>
Mon, 4 Oct 2010 12:42:37 +0000 (14:42 +0200)
committerRoberto Raggi <roberto.raggi@nokia.com>
Tue, 5 Oct 2010 12:22:05 +0000 (14:22 +0200)
Reviewed-by: Erik Verbruggen
src/libs/cplusplus/LookupContext.cpp

index 813a50b..8619502 100644 (file)
@@ -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;
                     }
                 }
             }