From a1fa169219423641e65f81e3fbc27f0f9fb84dd5 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Thu, 8 Sep 2011 14:01:18 +0200 Subject: [PATCH] C++: Fix duplicate items in C++ completion for Qt methods In the old code completion engine items were created on the stack and passed around by value. With the refactoring of the code assist API they became heap objects manipulated through pointers. This patch fixes one reminiscence not caught during the refactoring in which the same actual pointer was being used more than once to be appended on the list. Change-Id: I2009fb0b6aa18df57aa5ca9bde0591536ca2cd74 Reviewed-on: http://codereview.qt-project.org/4444 Reviewed-by: Qt Sanity Bot Reviewed-by: Fawzi Mohamed --- src/plugins/cpptools/cppcompletionassist.cpp | 62 ++++++++++---------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index c1585617806..ef4abb5d36c 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -1616,40 +1616,38 @@ bool CppCompletionAssistProcessor::completeQtMethod(const QListisSlot()) continue; - BasicProposalItem *item = toCompletionItem(fun); - if (item) { - unsigned count = fun->argumentCount(); - while (true) { - BasicProposalItem *ci = item; - QString signature; - signature += Overview().prettyName(fun->name()); - signature += QLatin1Char('('); - for (unsigned i = 0; i < count; ++i) { - Symbol *arg = fun->argumentAt(i); - if (i != 0) - signature += QLatin1Char(','); - signature += o.prettyType(arg->type()); - } - signature += QLatin1Char(')'); - - const QByteArray normalized = - QMetaObject::normalizedSignature(signature.toLatin1()); - - signature = QString::fromLatin1(normalized, normalized.size()); - - if (! signatures.contains(signature)) { - signatures.insert(signature); - - ci->setText(signature); // fix the completion item. - m_completions.append(ci); - } - - if (count && fun->argumentAt(count - 1)->asArgument()->hasInitializer()) - --count; - else - break; + unsigned count = fun->argumentCount(); + while (true) { + QString signature; + signature += Overview().prettyName(fun->name()); + signature += QLatin1Char('('); + for (unsigned i = 0; i < count; ++i) { + Symbol *arg = fun->argumentAt(i); + if (i != 0) + signature += QLatin1Char(','); + signature += o.prettyType(arg->type()); } + signature += QLatin1Char(')'); + + const QByteArray normalized = + QMetaObject::normalizedSignature(signature.toLatin1()); + + signature = QString::fromLatin1(normalized, normalized.size()); + + if (! signatures.contains(signature)) { + BasicProposalItem *ci = toCompletionItem(fun); + if (!ci) + break; + signatures.insert(signature); + ci->setText(signature); // fix the completion item. + m_completions.append(ci); + } + + if (count && fun->argumentAt(count - 1)->asArgument()->hasInitializer()) + --count; + else + break; } } }