From d25c5f35ca127c5b1aca0e296bccfbcc4c9247e9 Mon Sep 17 00:00:00 2001
From: Lorenz Haas <lykurg@gmail.com>
Date: Tue, 14 May 2013 11:10:15 +0200
Subject: [PATCH] CppEditor: InsertDefFromDecl: Hide when definition already
 exists

"Add Definition Inside/Outside Class" was wrongly shown when there was
already an definition outside the class.

Change-Id: I6409080c6a1a3abdd4511f7db14ecb4f63458411
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
---
 src/plugins/cppeditor/cppeditorplugin.h    |  1 +
 src/plugins/cppeditor/cppquickfix_test.cpp | 15 +++++++++++++++
 src/plugins/cppeditor/cppquickfixes.cpp    |  7 +++++++
 3 files changed, 23 insertions(+)

diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h
index d8714bb99c9..40c8b1ac48a 100644
--- a/src/plugins/cppeditor/cppeditorplugin.h
+++ b/src/plugins/cppeditor/cppeditorplugin.h
@@ -157,6 +157,7 @@ private slots:
     void test_quickfix_InsertDefFromDecl_headerSource_namespace2();
     void test_quickfix_InsertDefFromDecl_freeFunction();
     void test_quickfix_InsertDefFromDecl_insideClass();
+    void test_quickfix_InsertDefFromDecl_notTriggeringWhenDefinitionExists();
 
     void test_quickfix_InsertDeclFromDef();
 
diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp
index 35423c5b548..25059217b59 100644
--- a/src/plugins/cppeditor/cppquickfix_test.cpp
+++ b/src/plugins/cppeditor/cppquickfix_test.cpp
@@ -893,6 +893,21 @@ void CppEditorPlugin::test_quickfix_InsertDefFromDecl_insideClass()
     data.run(&factory, 1);
 }
 
+/// Check not triggering when definition exists
+void CppEditorPlugin::test_quickfix_InsertDefFromDecl_notTriggeringWhenDefinitionExists()
+{
+    const QByteArray original =
+            "class Foo {\n"
+            "    void b@ar();\n"
+            "};\n"
+            "void Foo::bar() {}\n";
+    const QByteArray expected = original + "\n";
+
+    InsertDefFromDecl factory;
+    TestCase data(original, expected);
+    data.run(&factory, 1);
+}
+
 // Function for one of InsertDeclDef section cases
 void insertToSectionDeclFromDef(const QByteArray &section, int sectionIndex)
 {
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index 0b42f5bfbb8..5d67df6037b 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -2621,6 +2621,13 @@ void InsertDefFromDecl::match(const CppQuickFixInterface &interface, QuickFixOpe
                             const QString cppFileName = correspondingHeaderOrSource(
                                         interface->fileName(), &isHeaderFile);
 
+                            // Check if there is already a definition
+                            CppTools::SymbolFinder symbolFinder;
+                            if (symbolFinder.findMatchingDefinition(decl, interface->snapshot(),
+                                                                    true)) {
+                                return;
+                            }
+
                             // Insert Position: Implementation File
                             if (isHeaderFile && !cppFileName.isEmpty()) {
                                 CppRefactoringChanges refactoring(interface->snapshot());
-- 
GitLab