From d2faf880f35537d31d3bbfa19154a93a1dd6aba6 Mon Sep 17 00:00:00 2001
From: Lorenz Haas <lykurg@gmail.com>
Date: Mon, 10 Jun 2013 17:27:09 +0200
Subject: [PATCH] CppEditor: Fix triggering AssignToLocalVariable

Do not trigger for functions inside a function call.

Task-number: QTCREATORBUG-9510
Change-Id: I908483fe80ff3ac0f737b21061375e206c1b1d1d
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
---
 src/plugins/cppeditor/cppeditorplugin.h    |  1 +
 src/plugins/cppeditor/cppquickfix_test.cpp | 16 ++++++++++++++++
 src/plugins/cppeditor/cppquickfixes.cpp    |  6 +++++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h
index 64c19e31301..9f055fadcf0 100644
--- a/src/plugins/cppeditor/cppeditorplugin.h
+++ b/src/plugins/cppeditor/cppeditorplugin.h
@@ -199,6 +199,7 @@ private slots:
     void test_quickfix_AssignToLocalVariable_noVoidMemberFunction();
     void test_quickfix_AssignToLocalVariable_noVoidStaticMemberFunction();
     void test_quickfix_AssignToLocalVariable_noFunctionInExpression();
+    void test_quickfix_AssignToLocalVariable_noFunctionInFunction();
     void test_quickfix_AssignToLocalVariable_noReturnClass();
     void test_quickfix_AssignToLocalVariable_noReturnFunc();
     void test_quickfix_AssignToLocalVariable_noSignatureMatch();
diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp
index 66aa48fd470..9cc4f67a9b3 100644
--- a/src/plugins/cppeditor/cppquickfix_test.cpp
+++ b/src/plugins/cppeditor/cppquickfix_test.cpp
@@ -2091,6 +2091,22 @@ void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noFunctionInExpression
     data.run(&factory);
 }
 
+/// Check: No trigger for functions in functions. (QTCREATORBUG-9510)
+void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noFunctionInFunction()
+{
+    const QByteArray original =
+        "int foo(int a, int b) {return a + b;}\n"
+        "int bar(int a) {return a;}\n"
+        "void baz() {\n"
+        "    int a = foo(ba@r(), bar());\n"
+        "}\n";
+    const QByteArray expected = original + "\n";
+
+    AssignToLocalVariable factory;
+    TestCase data(original, expected);
+    data.run(&factory);
+}
+
 /// Check: No trigger for functions in return statements (classes).
 void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnClass()
 {
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index 095e596ad32..e817d70c5f3 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -4227,6 +4227,8 @@ void AssignToLocalVariable::match(const CppQuickFixInterface &interface, QuickFi
                     return;
                 if (path.at(i - 1)->asReturnStatement())
                     return;
+                if (path.at(i - 1)->asCall())
+                    return;
             }
 
             if (MemberAccessAST *member = path.at(i + 1)->asMemberAccess()) { // member
@@ -4259,7 +4261,9 @@ void AssignToLocalVariable::match(const CppQuickFixInterface &interface, QuickFi
                     return;
                 if (path.at(idx)->asMemInitializer())
                     return;
-                if (path.at(i-1)->asReturnStatement())
+                if (path.at(i - 1)->asReturnStatement())
+                    return;
+                if (path.at(i - 1)->asCall())
                     return;
             }
             if (NamedTypeSpecifierAST *ts = path.at(i + 2)->asNamedTypeSpecifier()) {
-- 
GitLab