From 8b514657ccb686f51a54ea9c3ab07e8877cada15 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 16 Oct 2009 12:22:33 +0200 Subject: Added support to complete function-call operators. --- src/plugins/cpptools/cppcodecompletion.cpp | 54 +++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 13 deletions(-) (limited to 'src/plugins/cpptools/cppcodecompletion.cpp') diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 16bda30448..42cd69ff77 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -857,7 +857,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) } if (! resolvedTypes.isEmpty()) { - if (m_completionOperator == T_LPAREN && completeConstructorOrFunction(resolvedTypes)) { + if (m_completionOperator == T_LPAREN && completeConstructorOrFunction(resolvedTypes, context)) { return m_startPosition; } else if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) && @@ -884,16 +884,19 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) QTextCursor tc(edit->document()); tc.setPosition(index); - QString baseExpression = expressionUnderCursor(tc); + + const QString baseExpression = expressionUnderCursor(tc); // Resolve the type of this expression - QList results = - typeOfExpression(baseExpression, thisDocument, lastVisibleSymbol, TypeOfExpression::Preprocess); + const QList results = + typeOfExpression(baseExpression, thisDocument, + lastVisibleSymbol, + TypeOfExpression::Preprocess); // If it's a class, add completions for the constructors foreach (const TypeOfExpression::Result &result, results) { if (result.first->isClassType()) { - if (completeConstructorOrFunction(results)) + if (completeConstructorOrFunction(results, context)) return m_startPosition; break; } @@ -905,12 +908,13 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) return -1; } -bool CppCodeCompletion::completeConstructorOrFunction(const QList &results) +bool CppCodeCompletion::completeConstructorOrFunction(const QList &results, + const LookupContext &context) { QList functions; foreach (const TypeOfExpression::Result &result, results) { - FullySpecifiedType exprTy = result.first; + FullySpecifiedType exprTy = result.first.simplified(); if (Class *klass = exprTy->asClassType()) { Name *className = klass->name(); @@ -940,8 +944,8 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QListasFunctionType()) { @@ -950,10 +954,6 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QListscope() != fun->scope()) continue; // skip fun, it's an hidden declaration. - Name *name = fun->name(); - if (QualifiedNameId *q = fun->name()->asQualifiedNameId()) - name = q->unqualifiedNameId(); - bool newOverload = true; foreach (Function *f, functions) { @@ -967,7 +967,35 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QListoperatorNameId(OperatorNameId::FunctionCallOp); + + foreach (const TypeOfExpression::Result &result, results) { + FullySpecifiedType ty = result.first.simplified(); + + if (NamedType *namedTy = ty->asNamedType()) { + const QList classObjectCandidates = resolveClass(namedTy->name(), result, context); + foreach (Symbol *classObjectCandidate, classObjectCandidates) { + if (Class *klass = classObjectCandidate->asClass()) { + const QList overloads = + resolveExpression.resolveMember(functionCallOp, klass, + namedTy->name()); + + foreach (const TypeOfExpression::Result &overloadResult, overloads) { + FullySpecifiedType overloadTy = overloadResult.first.simplified(); + + if (Function *funTy = overloadTy->asFunctionType()) + functions.append(funTy); + } + } + } + } + } } if (! functions.isEmpty()) { -- cgit v1.2.1