diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 396a207ef1f..402f1d01eac 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -1552,11 +1552,11 @@ void CppEditorPlugin::test_quickfix_data() QTest::newRow("InsertQtPropertyMembers") << CppQuickFixFactoryPtr(new InsertQtPropertyMembers) << _("struct XmarksTheSpot {\n" - " @Q_PROPERTY(int it READ getIt WRITE setIt NOTIFY itChanged)\n" + " @Q_PROPERTY(int it READ getIt WRITE setIt RESET resetIt NOTIFY itChanged)\n" "};\n" ) << _("struct XmarksTheSpot {\n" - " Q_PROPERTY(int it READ getIt WRITE setIt NOTIFY itChanged)\n" + " Q_PROPERTY(int it READ getIt WRITE setIt RESET resetIt NOTIFY itChanged)\n" "\n" "public:\n" " int getIt() const\n" @@ -1573,6 +1573,10 @@ void CppEditorPlugin::test_quickfix_data() " m_it = it;\n" " emit itChanged(m_it);\n" " }\n" + " void resetIt()\n" + " {\n" + " setIt({}); // TODO: Adapt to use your actual default value\n" + " }\n" "\n" "signals:\n" " void itChanged(int it);\n" @@ -1582,6 +1586,67 @@ void CppEditorPlugin::test_quickfix_data() "};\n" ); + QTest::newRow("InsertQtPropertyMembersResetWithoutSet") + << CppQuickFixFactoryPtr(new InsertQtPropertyMembers) + << _("struct XmarksTheSpot {\n" + " @Q_PROPERTY(int it READ getIt RESET resetIt NOTIFY itChanged)\n" + "};\n" + ) + << _("struct XmarksTheSpot {\n" + " Q_PROPERTY(int it READ getIt RESET resetIt NOTIFY itChanged)\n" + "\n" + "public:\n" + " int getIt() const\n" + " {\n" + " return m_it;\n" + " }\n" + "\n" + "public slots:\n" + " void resetIt()\n" + " {\n" + " static const int defaultValue{}; // TODO: Adapt to use your actual default value\n" + " if (m_it == defaultValue)\n" + " return;\n" + "\n" + " m_it = defaultValue;\n" + " emit itChanged(m_it);\n" + " }\n" + "\n" + "signals:\n" + " void itChanged(int it);\n" + "\n" + "private:\n" + " int m_it;\n" + "};\n" + ); + + QTest::newRow("InsertQtPropertyMembersResetWithoutSetAndNotify") + << CppQuickFixFactoryPtr(new InsertQtPropertyMembers) + << _("struct XmarksTheSpot {\n" + " @Q_PROPERTY(int it READ getIt RESET resetIt)\n" + "};\n" + ) + << _("struct XmarksTheSpot {\n" + " Q_PROPERTY(int it READ getIt RESET resetIt)\n" + "\n" + "public:\n" + " int getIt() const\n" + " {\n" + " return m_it;\n" + " }\n" + "\n" + "public slots:\n" + " void resetIt()\n" + " {\n" + " static const int defaultValue{}; // TODO: Adapt to use your actual default value\n" + " m_it = defaultValue;\n" + " }\n" + "\n" + "private:\n" + " int m_it;\n" + "};\n" + ); + QTest::newRow("InsertQtPropertyMembersPrivateBeforePublic") << CppQuickFixFactoryPtr(new InsertQtPropertyMembers) << _("class XmarksTheSpot {\n" diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index aea20b8accf..8c65166aa1d 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -5022,19 +5022,21 @@ public: GenerateGetter = 1 << 0, GenerateSetter = 1 << 1, GenerateSignal = 1 << 2, - GenerateStorage = 1 << 3 + GenerateStorage = 1 << 3, + GenerateReset = 1 << 4 }; InsertQtPropertyMembersOp(const CppQuickFixInterface &interface, int priority, QtPropertyDeclarationAST *declaration, Class *klass, int generateFlags, - const QString &getterName, const QString &setterName, const QString &signalName, - const QString &storageName) + const QString &getterName, const QString &setterName, const QString &resetName, + const QString &signalName, const QString &storageName) : CppQuickFixOperation(interface, priority) , m_declaration(declaration) , m_class(klass) , m_generateFlags(generateFlags) , m_getterName(getterName) , m_setterName(setterName) + , m_resetName(resetName) , m_signalName(signalName) , m_storageName(storageName) { @@ -5065,6 +5067,7 @@ public: } // setter declaration + InsertionLocation setterLoc; if (m_generateFlags & GenerateSetter) { QString setterDeclaration; QTextStream setter(&setterDeclaration); @@ -5081,11 +5084,36 @@ public: setter << m_storageName << " = " << baseName << ";\nemit " << m_signalName << '(' << m_storageName << ");\n}\n"; } - InsertionLocation setterLoc = locator.methodDeclarationInClass(file->fileName(), m_class, InsertionPointLocator::PublicSlot); + setterLoc = locator.methodDeclarationInClass(file->fileName(), m_class, InsertionPointLocator::PublicSlot); QTC_ASSERT(setterLoc.isValid(), return); insertAndIndent(file, &declarations, setterLoc, setterDeclaration); } + // reset declaration + if (m_generateFlags & GenerateReset) { + QString declaration; + QTextStream stream(&declaration); + stream << "void " << m_resetName << "()\n{\n"; + if (m_generateFlags & GenerateSetter) { + stream << m_setterName << "({}); // TODO: Adapt to use your actual default value\n"; + } else { + stream << "static const " << typeName << " defaultValue{}; " + "// TODO: Adapt to use your actual default value\n"; + if (!m_signalName.isEmpty()) + stream << "if (" << m_storageName << " == defaultValue)\nreturn;\n\n"; + stream << m_storageName << " = defaultValue;\n"; + if (!m_signalName.isEmpty()) + stream << "emit " << m_signalName << '(' << m_storageName << ");\n"; + } + stream << "}\n"; + const InsertionLocation loc = setterLoc.isValid() + ? InsertionLocation(setterLoc.fileName(), {}, {}, setterLoc.line(), 1) + : locator.methodDeclarationInClass(file->fileName(), m_class, + InsertionPointLocator::PublicSlot); + QTC_ASSERT(loc.isValid(), return); + insertAndIndent(file, &declarations, loc, declaration); + } + // signal declaration if (m_generateFlags & GenerateSignal) { const QString declaration = QLatin1String("void ") + m_signalName + QLatin1Char('(') @@ -5124,6 +5152,7 @@ private: int m_generateFlags; QString m_getterName; QString m_setterName; + QString m_resetName; QString m_signalName; QString m_storageName; }; @@ -5156,6 +5185,7 @@ void InsertQtPropertyMembers::match(const CppQuickFixInterface &interface, const QString propertyName = file->textOf(qtPropertyDeclaration->property_name); QString getterName; QString setterName; + QString resetName; QString signalName; int generateFlags = 0; QtPropertyDeclarationItemListAST *it = qtPropertyDeclaration->property_declaration_item_list; @@ -5167,6 +5197,9 @@ void InsertQtPropertyMembers::match(const CppQuickFixInterface &interface, } else if (!qstrcmp(tokenString, "WRITE")) { setterName = file->textOf(it->value->expression); generateFlags |= InsertQtPropertyMembersOp::GenerateSetter; + } else if (!qstrcmp(tokenString, "RESET")) { + resetName = file->textOf(it->value->expression); + generateFlags |= InsertQtPropertyMembersOp::GenerateReset; } else if (!qstrcmp(tokenString, "NOTIFY")) { signalName = file->textOf(it->value->expression); generateFlags |= InsertQtPropertyMembersOp::GenerateSignal; @@ -5187,6 +5220,8 @@ void InsertQtPropertyMembers::match(const CppQuickFixInterface &interface, generateFlags &= ~InsertQtPropertyMembersOp::GenerateGetter; else if (name == setterName) generateFlags &= ~InsertQtPropertyMembersOp::GenerateSetter; + else if (name == resetName) + generateFlags &= ~InsertQtPropertyMembersOp::GenerateReset; else if (name == signalName) generateFlags &= ~InsertQtPropertyMembersOp::GenerateSignal; } else if (member->asDeclaration()) { @@ -5200,7 +5235,7 @@ void InsertQtPropertyMembers::match(const CppQuickFixInterface &interface, return; result << new InsertQtPropertyMembersOp(interface, path.size() - 1, qtPropertyDeclaration, c, - generateFlags, getterName, setterName, + generateFlags, getterName, setterName, resetName, signalName, storageName); }