From f6f0c81021f16c31f014ab5d43bc2dab2702ce3e Mon Sep 17 00:00:00 2001
From: Roberto Raggi <qtc-committer@nokia.com>
Date: Tue, 30 Dec 2008 11:35:30 +0100
Subject: [PATCH] Improved CppCodeCompletion::completeScope(). Added simple
 support for typedefs.

---
 src/plugins/cpptools/cppcodecompletion.cpp | 33 +++++++++++++++-------
 src/plugins/cpptools/cppcodecompletion.h   |  3 +-
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 075a55b96e9..947bea8f6f7 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -515,7 +515,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
             } if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) &&
                       completeMember(exprTy, resolvedTypes, context)) {
                 return m_startPosition;
-            } else if (m_completionOperator == T_COLON_COLON && completeScope(exprTy, resolvedTypes, context)) {
+            } else if (m_completionOperator == T_COLON_COLON && completeScope(resolvedTypes, context)) {
                 return m_startPosition;
             } else if (m_completionOperator == T_SIGNAL && completeSignal(exprTy, resolvedTypes, context)) {
                 return m_startPosition;
@@ -682,32 +682,45 @@ bool CppCodeCompletion::completeMember(FullySpecifiedType,
     return false;
 }
 
-bool CppCodeCompletion::completeScope(FullySpecifiedType exprTy,
-                                      const QList<TypeOfExpression::Result> &resolvedTypes,
+bool CppCodeCompletion::completeScope(const QList<TypeOfExpression::Result> &results,
                                       const LookupContext &context)
 {
+    if (results.isEmpty())
+        return false; // nothing to do.
+
     // Search for a class or a namespace.
-    foreach (TypeOfExpression::Result p, resolvedTypes) {
-        if (p.first->isClass() || p.first->isNamespace()) {
-            exprTy = p.first;
+    TypeOfExpression::Result result(FullySpecifiedType(), 0);
+    foreach (result, results) {
+        FullySpecifiedType ty = result.first;
+
+        if (ty->isClass() || ty->isNamespace())
             break;
-        }
     }
 
-    if (exprTy->asNamespace()) {
+    FullySpecifiedType exprTy = result.first;
+    if (! exprTy) {
+        return false;
+    } else if (exprTy->asNamespace()) {
         QList<Symbol *> candidates;
-        foreach (TypeOfExpression::Result p, resolvedTypes) {
+        foreach (TypeOfExpression::Result p, results) {
             if (Namespace *ns = p.first->asNamespace())
                 candidates.append(ns);
         }
         completeNamespace(candidates, context);
     } else if (exprTy->isClass()) {
         QList<Symbol *> candidates;
-        foreach (TypeOfExpression::Result p, resolvedTypes) {
+        foreach (TypeOfExpression::Result p, results) {
             if (Class *k = p.first->asClass())
                 candidates.append(k);
         }
         completeClass(candidates, context);
+    } else if (Symbol *symbol = result.second) {
+        if (symbol->isTypedef()) {
+            SymbolsForDotAccess symbolsForDotAccess;
+            const QList<Symbol *> candidates = symbolsForDotAccess(result,
+                                                                   context);
+            completeClass(candidates, context);
+        }
     }
 
     return ! m_completions.isEmpty();
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index baf278e71d0..faaaec3570b 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -100,8 +100,7 @@ private:
                         const QList<CPlusPlus::TypeOfExpression::Result> &,
                         const CPlusPlus::LookupContext &context);
 
-    bool completeScope(CPlusPlus::FullySpecifiedType exprTy,
-                       const QList<CPlusPlus::TypeOfExpression::Result> &,
+    bool completeScope(const QList<CPlusPlus::TypeOfExpression::Result> &,
                        const CPlusPlus::LookupContext &context);
 
     void completeNamespace(const QList<CPlusPlus::Symbol *> &candidates,
-- 
GitLab