From 37fde0c9d4791a2b39da03d66bad3f6dba1a185d Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 11 May 2010 10:20:51 +0200
Subject: [PATCH] Split LookupContext::lookup() in lookup() and find().

lookup() searches for symbols in the given binding and the enclosing scopes,
while find() searches for symbols only in the given binding.
---
 src/libs/cplusplus/LookupContext.cpp     | 16 +++++++++++++---
 src/libs/cplusplus/LookupContext.h       |  3 +++
 src/libs/cplusplus/ResolveExpression.cpp |  8 ++++----
 3 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index c5d6dedc96c..2cd4dea274f 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -304,7 +304,17 @@ ClassOrNamespace *ClassOrNamespace::globalNamespace() const
     return e;
 }
 
+QList<Symbol *> ClassOrNamespace::find(const Name *name)
+{
+    return lookup_helper(name, false);
+}
+
 QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
+{
+    return lookup_helper(name, true);
+}
+
+QList<Symbol *> ClassOrNamespace::lookup_helper(const Name *name, bool searchInEnclosingScope)
 {
     QList<Symbol *> result;
     if (! name)
@@ -317,7 +327,7 @@ QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
             binding = globalNamespace();
 
         if (q->nameCount() == 1)
-            return binding->lookup(q->unqualifiedNameId());
+            return binding->find(q->unqualifiedNameId());
 
         binding = binding->lookupClassOrNamespace(q->nameAt(0));
 
@@ -325,7 +335,7 @@ QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
             binding = binding->findClassOrNamespace(q->nameAt(index));
 
         if (binding)
-            result = binding->lookup(q->unqualifiedNameId());
+            result = binding->find(q->unqualifiedNameId());
 
         return result;
     }
@@ -335,7 +345,7 @@ QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
     do {
         lookup_helper(name, binding, &result, &processed, /*templateId = */ 0);
         binding = binding->_parent;
-    } while (binding);
+    } while (searchInEnclosingScope && binding);
 
     return result;
 }
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 88e273bd63b..4dff4c4cd36 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -56,6 +56,7 @@ public:
     ClassOrNamespace *globalNamespace() const;
 
     QList<Symbol *> lookup(const Name *name);
+    QList<Symbol *> find(const Name *name);
 
     ClassOrNamespace *lookupClassOrNamespace(const Name *name);
     ClassOrNamespace *findClassOrNamespace(const Name *name);
@@ -68,6 +69,8 @@ private:
     /// \internal
     ClassOrNamespace *findOrCreate(const Name *name);
 
+    QList<Symbol *> lookup_helper(const Name *name, bool searchInEnclosingScope);
+
     void addTodo(Symbol *symbol);
     void addSymbol(Symbol *symbol);
     void addEnum(Enum *e);
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index c32afc937bf..753c69c8892 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -490,7 +490,7 @@ bool ResolveExpression::visit(CallAST *ast)
 
         if (NamedType *namedTy = ty->asNamedType()) {
             if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), lastVisibleSymbol)) {
-                foreach (Symbol *overload, b->lookup(functionCallOp)) {
+                foreach (Symbol *overload, b->find(functionCallOp)) {
                     if (Function *funTy = overload->type()->asFunctionType()) {
                         if (maybeValidPrototype(funTy, actualArgumentCount)) {
                             Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType();
@@ -535,7 +535,7 @@ bool ResolveExpression::visit(ArrayAccessAST *ast)
 
         } else if (NamedType *namedTy = ty->asNamedType()) {
             if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), lastVisibleSymbol)) {
-                foreach (Symbol *overload, b->lookup(arrayAccessOp)) {
+                foreach (Symbol *overload, b->find(arrayAccessOp)) {
                     if (Function *funTy = overload->type()->asFunctionType()) {
                         Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType();
                         // ### TODO: check the actual arguments
@@ -610,7 +610,7 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i
             }
 
             if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), result.lastVisibleSymbol())) {
-                foreach (Symbol *overload, b->lookup(arrowAccessOp)) {
+                foreach (Symbol *overload, b->find(arrowAccessOp)) {
                     if (Function *funTy = overload->type()->asFunctionType()) {
                         FullySpecifiedType f = instantiate(namedTy->name(), funTy);
                         FullySpecifiedType retTy = f->asFunctionType()->returnType().simplified();
@@ -687,7 +687,7 @@ ResolveExpression::resolveMemberExpression(const QList<LookupItem> &baseResults,
 
         else if (NamedType *namedTy = ty->asNamedType()) {
             if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), r.lastVisibleSymbol())) {
-                foreach (Symbol *c, b->lookup(memberName))
+                foreach (Symbol *c, b->find(memberName))
                     results.append(LookupItem(instantiate(namedTy->name(), c), c));
             }
         }
-- 
GitLab