OSDN Git Service

C++: Fix duplicate items in C++ completion for Qt methods
authorLeandro Melo <leandro.melo@nokia.com>
Thu, 8 Sep 2011 12:01:18 +0000 (14:01 +0200)
committerEike Ziller <eike.ziller@nokia.com>
Mon, 12 Sep 2011 06:39:49 +0000 (08:39 +0200)
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 <qt_sanity_bot@ovi.com>
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
(cherry picked from commit a1fa169219423641e65f81e3fbc27f0f9fb84dd5)

src/plugins/cpptools/cppcompletionassist.cpp

index d2c458f..dddbca6 100644 (file)
@@ -1614,40 +1614,38 @@ bool CppCompletionAssistProcessor::completeQtMethod(const QList<CPlusPlus::Looku
                     continue;
                 else if (! wantSignals && ! fun->isSlot())
                     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());
+                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(')');
 
-                        if (! signatures.contains(signature)) {
-                            signatures.insert(signature);
+                    const QByteArray normalized =
+                            QMetaObject::normalizedSignature(signature.toLatin1());
 
-                            ci->setText(signature); // fix the completion item.
-                            m_completions.append(ci);
-                        }
+                    signature = QString::fromLatin1(normalized, normalized.size());
 
-                        if (count && fun->argumentAt(count - 1)->asArgument()->hasInitializer())
-                            --count;
-                        else
+                    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;
                 }
             }
         }