forked from qt-creator/qt-creator
CppEditor: Extend Q_PROPERTY quickfix
... to also generate the RESET function. Fixes: QTCREATORBUG-11809 Change-Id: I94789227230a67f074ff5fdc76ad8113d2870dd6 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user