diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h index 99b0bdc811d..954df14b5d7 100644 --- a/src/plugins/cppeditor/cppeditorplugin.h +++ b/src/plugins/cppeditor/cppeditorplugin.h @@ -238,6 +238,7 @@ private slots: void test_quickfix_MoveFuncDefToDecl_FreeFuncToCpp(); void test_quickfix_MoveFuncDefToDecl_FreeFuncToCppNS(); void test_quickfix_MoveFuncDefToDecl_CtorWithInitialization(); + void test_quickfix_MoveFuncDefToDecl_structWithAssignedVariable(); void test_quickfix_AssignToLocalVariable_freeFunction(); void test_quickfix_AssignToLocalVariable_memberFunction(); diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 7c4051d389e..53c74826fd5 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -3047,6 +3047,33 @@ void CppEditorPlugin::test_quickfix_MoveFuncDefToDecl_CtorWithInitialization() data.run(&factory); } +/// Check: Definition should not be placed behind the variable. QTCREATORBUG-10303 +void CppEditorPlugin::test_quickfix_MoveFuncDefToDecl_structWithAssignedVariable() +{ + QByteArray original = + "struct Foo\n" + "{\n" + " void foo();\n" + "} bar;\n\n" + "void Foo::fo@o()\n" + "{\n" + " return;\n" + "}"; + + QByteArray expected = + "struct Foo\n" + "{\n" + " void foo()\n" + " {\n" + " return;\n" + " }\n" + "} bar;\n\n\n"; + + MoveFuncDefToDecl factory; + TestCase data(original, expected); + data.run(&factory); +} + /// Check: Add local variable for a free function. void CppEditorPlugin::test_quickfix_AssignToLocalVariable_freeFunction() { diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index a6d9dd1900b..4802a3a3464 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -4387,7 +4387,7 @@ void MoveFuncDefToDecl::match(const CppQuickFixInterface &interface, QuickFixOpe const CppRefactoringFilePtr declFile = refactoring.file(declFileName); ASTPath astPath(declFile->cppDocument()); const QList path = astPath(s->line(), s->column()); - for (int idx = 0; idx < path.size(); ++idx) { + for (int idx = path.size() - 1; idx > 0; --idx) { AST *node = path.at(idx); if (SimpleDeclarationAST *simpleDecl = node->asSimpleDeclaration()) { if (simpleDecl->symbols && !simpleDecl->symbols->next) {