From 94411bfaefc805513bb00283aac55e77888dac79 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Wed, 19 Jan 2011 16:39:28 +0100
Subject: [PATCH] Fixed argument completion for destructors.

Task-number: QTCREATORBUG-2854
---
 src/plugins/cpptools/cppcodecompletion.cpp | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 302bcd5ae08..74464fb0d1a 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1289,6 +1289,8 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
     // the function signature.
 
     // check if function signature autocompletion is appropriate
+    // Also check if the function name is a destructor name.
+    bool isDestructor = false;
     if (! functions.isEmpty() && ! toolTipOnly) {
 
         // function definitions will only happen in class or namespace scope,
@@ -1314,7 +1316,7 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
             tc.setPosition(endOfExpression);
             BackwardsScanner bs(tc);
             const int startToken = bs.startToken();
-            const int lineStartToken = bs.startOfLine(startToken);
+            int lineStartToken = bs.startOfLine(startToken);
             // make sure the required tokens are actually available
             bs.LA(startToken - lineStartToken);
             QString possibleDecl = bs.mid(lineStartToken).trimmed().append("();");
@@ -1327,12 +1329,24 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
                     if (sd->declarator_list &&
                         sd->declarator_list && sd->declarator_list->value->postfix_declarator_list
                         && sd->declarator_list->value->postfix_declarator_list->value->asFunctionDeclarator()) {
+
                         autocompleteSignature = true;
+
+                        CoreDeclaratorAST *coreDecl = sd->declarator_list->value->core_declarator;
+                        if (coreDecl && coreDecl->asDeclaratorId() && coreDecl->asDeclaratorId()->name) {
+                            NameAST *declName = coreDecl->asDeclaratorId()->name;
+                            if (declName->asDestructorName()) {
+                                isDestructor = true;
+                            } else if (QualifiedNameAST *qName = declName->asQualifiedName()) {
+                                if (qName->unqualified_name && qName->unqualified_name->asDestructorName())
+                                    isDestructor = true;
+                            }
+                        }
                     }
                 }
             }
 
-            if (autocompleteSignature) {
+            if (autocompleteSignature && !isDestructor) {
                 // set up signature autocompletion
                 foreach (Function *f, functions) {
                     Overview overview;
@@ -1352,7 +1366,7 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
         }
     }
 
-    if (! functions.empty()) {
+    if (! functions.empty() && !isDestructor) {
         // set up function call tooltip
 
         // Recreate if necessary
-- 
GitLab