From 39d000430ee3164a5c2cea8e22558c6f4fbbfc36 Mon Sep 17 00:00:00 2001 From: Lorenz Haas Date: Thu, 18 Apr 2013 11:21:12 +0200 Subject: CppEditor: Quick fix "move definition" keeps ctor-initialization list Task-number: QTCREATORBUG-9157 Change-Id: Ic46086ba07a86292bbf48de62b69e3f33628fd86 Reviewed-by: Friedemann Kleint Reviewed-by: Nikolai Kosjar --- src/plugins/cppeditor/cppplugin.h | 2 + src/plugins/cppeditor/cppquickfix_test.cpp | 80 ++++++++++++++++++++++++++++++ src/plugins/cppeditor/cppquickfixes.cpp | 12 +++-- 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h index dd57aa5eff..c06200de9b 100644 --- a/src/plugins/cppeditor/cppplugin.h +++ b/src/plugins/cppeditor/cppplugin.h @@ -140,6 +140,7 @@ private slots: void test_quickfix_MoveFuncDefOutside_MemberFuncOutsideWithNs(); void test_quickfix_MoveFuncDefOutside_FreeFuncToCpp(); void test_quickfix_MoveFuncDefOutside_FreeFuncToCppNS(); + void test_quickfix_MoveFuncDefOutside_CtorWithInitialization(); void test_quickfix_MoveFuncDefToDecl_MemberFunc(); void test_quickfix_MoveFuncDefToDecl_MemberFuncOutside(); @@ -148,6 +149,7 @@ private slots: void test_quickfix_MoveFuncDefToDecl_MemberFuncOutsideWithNs(); void test_quickfix_MoveFuncDefToDecl_FreeFuncToCpp(); void test_quickfix_MoveFuncDefToDecl_FreeFuncToCppNS(); + void test_quickfix_MoveFuncDefToDecl_CtorWithInitialization(); // The following tests depend on the projects that are loaded on startup // and will be skipped in case no projects are loaded. diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 2107f29769..b3f32dc169 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -1351,6 +1351,46 @@ void CppPlugin::test_quickfix_MoveFuncDefOutside_FreeFuncToCppNS() data.run(&factory); } +/// Check: Move Ctor with member initialization list (QTCREATORBUG-9157). +void CppPlugin::test_quickfix_MoveFuncDefOutside_CtorWithInitialization() +{ + QList testFiles; + QByteArray original; + QByteArray expected; + + // Header File + original = + "class Foo {\n" + "public:\n" + " Fo@o() : a(42), b(3.141) {}\n" + "private:\n" + " int a;\n" + " float b;\n" + "};"; + expected = + "class Foo {\n" + "public:\n" + " Foo();\n" + "private:\n" + " int a;\n" + " float b;\n" + "};\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); + + // Source File + original ="#include \"file.h\"\n"; + expected = + "#include \"file.h\"\n" + "\n" + "Foo::Foo() : a(42), b(3.141) {}\n" + "\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + + MoveFuncDefOutside factory; + TestCase data(testFiles); + data.run(&factory); +} + /// Check: revert test_quickfix_MoveFuncDefOutside_MemberFuncToCpp() void CppPlugin::test_quickfix_MoveFuncDefToDecl_MemberFunc() { @@ -1578,3 +1618,43 @@ void CppPlugin::test_quickfix_MoveFuncDefToDecl_FreeFuncToCppNS() TestCase data(testFiles); data.run(&factory); } + +/// Check: revert test_quickfix_MoveFuncDefOutside_CtorWithInitialization() +void CppPlugin::test_quickfix_MoveFuncDefToDecl_CtorWithInitialization() +{ + QList testFiles; + QByteArray original; + QByteArray expected; + + // Header File + original = + "class Foo {\n" + "public:\n" + " Foo();\n" + "private:\n" + " int a;\n" + " float b;\n" + "};"; + expected = + "class Foo {\n" + "public:\n" + " Foo() : a(42), b(3.141) {}\n" + "private:\n" + " int a;\n" + " float b;\n" + "};\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); + + // Source File + original = + "#include \"file.h\"\n" + "\n" + "Foo::F@oo() : a(42), b(3.141) {}" + ; + expected ="#include \"file.h\"\n\n\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + + MoveFuncDefToDecl factory; + TestCase data(testFiles); + data.run(&factory); +} diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index fbabeaf7ac..715fb30eb6 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -3645,7 +3645,6 @@ public: { CppRefactoringChanges refactoring(snapshot()); CppRefactoringFilePtr fromFile = refactoring.file(m_headerFileName); - const QString textFuncBody = fromFile->textOf(m_funcDef->function_body); CppRefactoringFilePtr toFile; int insertPos = 0; Scope *scopeAtInsertPos = 0; @@ -3666,6 +3665,10 @@ public: // construct definition const QString funcDec = getDefinitionSignature(assistInterface(), m_func, toFile, scopeAtInsertPos); + QString textFuncBody; + if (m_funcDef->ctor_initializer) + textFuncBody = fromFile->textOf(m_funcDef->ctor_initializer) + QLatin1Char(' '); + textFuncBody += fromFile->textOf(m_funcDef->function_body); QString funcDef = QString::fromLatin1("\n%1 %2\n") .arg(funcDec) .arg(textFuncBody); @@ -3792,8 +3795,11 @@ public: CppRefactoringFilePtr toFile = refactoring.file(m_toFileName); ChangeSet::Range fromRange = fromFile->range(m_funcAST); const QString definitionText = fromFile->textOf(m_funcAST->function_body); - const QString wholeFunctionText = QString::fromLatin1("%1 %2").arg(m_declarationText) - .arg(definitionText); + QString wholeFunctionText = m_declarationText; + if (m_funcAST->ctor_initializer) + wholeFunctionText += QLatin1Char(' ') + fromFile->textOf(m_funcAST->ctor_initializer); + wholeFunctionText += QLatin1Char(' ') + definitionText; + // Replace declaration with function and delete old definition Utils::ChangeSet toTarget; -- cgit v1.2.1