From e98664690558aafa2833e07fd0c13a003cec8b32 Mon Sep 17 00:00:00 2001
From: Lorenz Haas <lykurg@gmail.com>
Date: Wed, 12 Jun 2013 17:40:11 +0200
Subject: [PATCH] CppEditor: Resolve templates in AssignToLocalVariable

Task-number: QTCREATORBUG-9525

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

diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h
index c0fb4094c69..50b5bc141be 100644
--- a/src/plugins/cppeditor/cppeditorplugin.h
+++ b/src/plugins/cppeditor/cppeditorplugin.h
@@ -209,6 +209,7 @@ private slots:
     void test_quickfix_AssignToLocalVariable_memberFunction();
     void test_quickfix_AssignToLocalVariable_staticMemberFunction();
     void test_quickfix_AssignToLocalVariable_newExpression();
+    void test_quickfix_AssignToLocalVariable_templates();
     void test_quickfix_AssignToLocalVariable_noInitializationList();
     void test_quickfix_AssignToLocalVariable_noVoidFunction();
     void test_quickfix_AssignToLocalVariable_noVoidMemberFunction();
diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp
index 1ce9ed1aa7f..dd22a5d0892 100644
--- a/src/plugins/cppeditor/cppquickfix_test.cpp
+++ b/src/plugins/cppeditor/cppquickfix_test.cpp
@@ -2507,6 +2507,44 @@ void CppEditorPlugin::test_quickfix_AssignToLocalVariable_newExpression()
     data.run(&factory);
 }
 
+void CppEditorPlugin::test_quickfix_AssignToLocalVariable_templates()
+{
+
+    QList<TestDocumentPtr> testFiles;
+    QByteArray original;
+    QByteArray expected;
+
+    // Header File
+    original =
+        "template <typename T>\n"
+        "class List {\n"
+        "public:\n"
+        "    T first();"
+        "};\n"
+        ;
+    expected = original + "\n";
+    testFiles << TestDocument::create(original, expected, QLatin1String("file.h"));
+
+    // Source File
+    original =
+        "#include \"file.h\"\n"
+        "void foo() {\n"
+        "    List<int> list;\n"
+        "    li@st.first();\n"
+        "}";
+    expected =
+        "#include \"file.h\"\n"
+        "void foo() {\n"
+        "    List<int> list;\n"
+        "    int localFirst = list.first();\n"
+        "}\n";
+    testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp"));
+
+    AssignToLocalVariable factory;
+    TestCase data(testFiles);
+    data.run(&factory);
+}
+
 /// Check: No trigger for function inside member initialization list.
 void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noInitializationList()
 {
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index cc11e9aee11..14456b0eb24 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -4081,6 +4081,7 @@ public:
         TypeOfExpression typeOfExpression;
         typeOfExpression.init(assistInterface()->semanticInfo().doc, snapshot(),
                               assistInterface()->context().bindings());
+        typeOfExpression.setExpandTemplates(true);
         Scope *scope = file->scopeAt(m_ast->firstToken());
         const QList<LookupItem> result = typeOfExpression(file->textOf(m_ast).toUtf8(),
                                                           scope, TypeOfExpression::Preprocess);
@@ -4220,6 +4221,7 @@ void AssignToLocalVariable::match(const CppQuickFixInterface &interface, QuickFi
         TypeOfExpression typeOfExpression;
         typeOfExpression.init(interface->semanticInfo().doc, interface->snapshot(),
                               interface->context().bindings());
+        typeOfExpression.setExpandTemplates(true);
 
         // If items are empty, AssignToLocalVariableOperation will fail.
         items = typeOfExpression(file->textOf(outerAST).toUtf8(),
-- 
GitLab