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