From 6a3382d8de632380b0ffdd7e199844fcf977830f Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 28 May 2009 12:39:18 +0200
Subject: [PATCH] Say hello to LookupContext::resolveNestedNameSpecifier()

---
 src/libs/cplusplus/LookupContext.cpp | 63 ++++++++++++----------------
 src/libs/cplusplus/LookupContext.h   |  3 ++
 2 files changed, 29 insertions(+), 37 deletions(-)

diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 5723433aca0..ed2afed6edd 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -126,59 +126,48 @@ bool LookupContext::maybeValidSymbol(Symbol *symbol,
     return false;
 }
 
-QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q,
-                                                      const QList<Scope *> &visibleScopes,
-                                                      ResolveMode mode) const
+QList<Scope *> LookupContext::resolveNestedNameSpecifier(QualifiedNameId *q,
+                                                          const QList<Scope *> &visibleScopes) const
 {
-    QList<Scope *> scopes = visibleScopes;
     QList<Symbol *> candidates;
+    QList<Scope *> scopes = visibleScopes;
 
-    for (unsigned i = 0; i < q->nameCount(); ++i) {
+    for (unsigned i = 0; i < q->nameCount() - 1; ++i) {
         Name *name = q->nameAt(i);
 
-        if (i + 1 == q->nameCount())
-            candidates = resolve(name, scopes, mode);
-        else
-            candidates = resolveClassOrNamespace(name, scopes);
+        candidates = resolveClassOrNamespace(name, scopes);
 
-        if (candidates.isEmpty() || i + 1 == q->nameCount())
+        if (candidates.isEmpty())
             break;
 
         scopes.clear();
+
         foreach (Symbol *candidate, candidates) {
-            if (ScopedSymbol *scoped = candidate->asScopedSymbol()) {
-                scopes.append(scoped->members());
-            }
+            ScopedSymbol *scoped = candidate->asScopedSymbol();
+            Scope *members = scoped->members();
+
+            if (! scopes.contains(members))
+                scopes.append(members);
         }
     }
 
-    Identifier *id = q->identifier();
-    foreach (Scope *scope, visibleScopes) {
-        Symbol *symbol = scope->lookat(id);
-        for (; symbol; symbol = symbol->next()) {
-            if (! symbol->name())
-                continue;
-            else if (! maybeValidSymbol(symbol, mode, candidates))
-                continue;
-            QualifiedNameId *qq = symbol->name()->asQualifiedNameId();
-            if (! qq)
-                continue;
-            if (q->nameCount() > qq->nameCount())
-                continue;
+    return scopes;
+}
+
+QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q,
+                                                      const QList<Scope *> &visibleScopes,
+                                                      ResolveMode mode) const
+{
+    QList<Scope *> scopes;
 
-            for (int i = q->nameCount() - 1; i != -1; --i) {
-                Name *a = q->nameAt(i);
-                Name *b = qq->nameAt(i);
+    if (q->nameCount() == 1)
+        scopes = visibleScopes;     // ### handle global scope lookup
+    else
+        scopes = resolveNestedNameSpecifier(q, visibleScopes);
 
-                if (! a->isEqualTo(b))
-                    break;
-                else if (i == 0)
-                    candidates.append(symbol);
-            }
-        }
-    }
+    // ### expand the scopes.
 
-    return candidates;
+    return resolve(q->unqualifiedNameId(), scopes, mode);
 }
 
 QList<Symbol *> LookupContext::resolveOperatorNameId(OperatorNameId *opId,
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 4985e11f741..fcfac578262 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -123,6 +123,9 @@ private:
                                           const QList<Scope *> &visibleScopes,
                                           ResolveMode mode) const;
 
+    QList<Scope *> resolveNestedNameSpecifier(QualifiedNameId *q,
+                                               const QList<Scope *> &visibleScopes) const;
+
     Identifier *identifier(const Name *name) const;
 
     QList<Scope *> buildVisibleScopes();
-- 
GitLab