diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h index 99b0bdc811ddbd182d539d505790794e74ecc6b0..954df14b5d7e9860ffd0605c7a8ca9615ac212bf 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 7c4051d389ee477a62cdfe0e473298ff7f89dfb0..53c74826fd59adf33774ef9d9b0a41a7f8c484c2 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 a6d9dd1900b2809ba155356998387fd0cb42caf6..4802a3a3464ca3065197d43fecae192f4705e412 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<AST *> 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) {