diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h index 54a971a3225..3bf01566785 100644 --- a/src/plugins/cppeditor/cppeditorplugin.h +++ b/src/plugins/cppeditor/cppeditorplugin.h @@ -174,6 +174,7 @@ private slots: void test_quickfix_MoveAllFuncDefOutside_MemberFuncOutside(); void test_quickfix_MoveAllFuncDefOutside_DoNotTriggerOnBaseClass(); void test_quickfix_MoveAllFuncDefOutside_classWithBaseClass(); + void test_quickfix_MoveAllFuncDefOutside_ignoreMacroCode(); void test_quickfix_MoveFuncDefToDecl_MemberFunc(); void test_quickfix_MoveFuncDefToDecl_MemberFuncOutside(); diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 4375d8a0bda..1ad54e67c0c 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -4102,6 +4102,34 @@ void CppEditorPlugin::test_quickfix_MoveAllFuncDefOutside_classWithBaseClass() QuickFixOperationTest(singleDocument(original, expected), &factory); } +/// Check: Do not take macro expanded code into account (QTCREATORBUG-13900) +void CppEditorPlugin::test_quickfix_MoveAllFuncDefOutside_ignoreMacroCode() +{ + QByteArray original = + "#define FAKE_Q_OBJECT int bar() {return 5;}\n" + "class Fo@o {\n" + " FAKE_Q_OBJECT\n" + " int f1()\n" + " {\n" + " return 1;\n" + " }\n" + "};\n"; + QByteArray expected = + "#define FAKE_Q_OBJECT int bar() {return 5;}\n" + "class Foo {\n" + " FAKE_Q_OBJECT\n" + " int f1();\n" + "};\n" + "\n\n" + "int Foo::f1()\n" + "{\n" + " return 1;\n" + "}\n"; + + MoveAllFuncDefOutside factory; + QuickFixOperationTest(singleDocument(original, expected), &factory); +} + void CppEditorPlugin::test_quickfix_AssignToLocalVariable_templates() { diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index b005b525e21..a0b182fae1d 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -4650,8 +4650,10 @@ public: { MoveFuncDefRefactoringHelper helper(this, m_type, m_headerFileName, m_cppFileName); for (DeclarationListAST *it = m_classDef->member_specifier_list; it; it = it->next) { - if (FunctionDefinitionAST *funcAST = it->value->asFunctionDefinition()) - helper.performMove(funcAST); + if (FunctionDefinitionAST *funcAST = it->value->asFunctionDefinition()) { + if (funcAST->symbol && !funcAST->symbol->isGenerated()) + helper.performMove(funcAST); + } } helper.applyChanges(); } @@ -4685,9 +4687,11 @@ void MoveAllFuncDefOutside::match(const CppQuickFixInterface &interface, QuickFi // Determine if the class has at least one function definition bool classContainsFunctions = false; for (DeclarationListAST *it = classAST->member_specifier_list; it; it = it->next) { - if (it->value->asFunctionDefinition()) { - classContainsFunctions = true; - break; + if (FunctionDefinitionAST *funcAST = it->value->asFunctionDefinition()) { + if (funcAST->symbol && !funcAST->symbol->isGenerated()) { + classContainsFunctions = true; + break; + } } } if (!classContainsFunctions)