CppEditor: Mark generated setter as slot only for QObject-derived class

Fixes: QTCREATORBUG-25789
Change-Id: I79174bcd617eb54540009491031cfae380383c41
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-10-21 10:54:48 +02:00
parent 86061fb44a
commit 404cf0f632
2 changed files with 32 additions and 12 deletions

View File

@@ -3236,6 +3236,8 @@ void QuickfixTest::testGenerateGetterSetterOnlySetter()
QList<TestDocumentPtr> testDocuments; QList<TestDocumentPtr> testDocuments;
QByteArray original; QByteArray original;
QByteArray expected; QByteArray expected;
QuickFixSettings s;
s->setterAsSlot = true; // To be ignored, as we don't have QObjects here.
// Header File // Header File
original = original =
@@ -3263,7 +3265,6 @@ void QuickfixTest::testGenerateGetterSetterOnlySetter()
"}\n"; "}\n";
testDocuments << CppTestDocument::create("file.cpp", original, expected); testDocuments << CppTestDocument::create("file.cpp", original, expected);
QuickFixSettings s;
s->setterInCppFileFrom = 1; s->setterInCppFileFrom = 1;
s->setterParameterNameTemplate = "value"; s->setterParameterNameTemplate = "value";
@@ -3547,10 +3548,12 @@ void QuickfixTest::testInsertQtPropertyMembers_data()
QTest::addColumn<QByteArray>("expected"); QTest::addColumn<QByteArray>("expected");
QTest::newRow("InsertQtPropertyMembers") QTest::newRow("InsertQtPropertyMembers")
<< _("struct XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"struct XmarksTheSpot : public QObject {\n"
" @Q_PROPERTY(int it READ getIt WRITE setIt RESET resetIt NOTIFY itChanged)\n" " @Q_PROPERTY(int it READ getIt WRITE setIt RESET resetIt NOTIFY itChanged)\n"
"};\n") "};\n")
<< _("struct XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"struct XmarksTheSpot : public QObject {\n"
" Q_PROPERTY(int it READ getIt WRITE setIt RESET resetIt NOTIFY itChanged)\n" " Q_PROPERTY(int it READ getIt WRITE setIt RESET resetIt NOTIFY itChanged)\n"
"\n" "\n"
"public:\n" "public:\n"
@@ -3582,10 +3585,12 @@ void QuickfixTest::testInsertQtPropertyMembers_data()
"}\n"); "}\n");
QTest::newRow("InsertQtPropertyMembersResetWithoutSet") QTest::newRow("InsertQtPropertyMembersResetWithoutSet")
<< _("struct XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"struct XmarksTheSpot : public QObject {\n"
" @Q_PROPERTY(int it READ getIt RESET resetIt NOTIFY itChanged)\n" " @Q_PROPERTY(int it READ getIt RESET resetIt NOTIFY itChanged)\n"
"};\n") "};\n")
<< _("struct XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"struct XmarksTheSpot : public QObject {\n"
" Q_PROPERTY(int it READ getIt RESET resetIt NOTIFY itChanged)\n" " Q_PROPERTY(int it READ getIt RESET resetIt NOTIFY itChanged)\n"
"\n" "\n"
"public:\n" "public:\n"
@@ -3615,10 +3620,12 @@ void QuickfixTest::testInsertQtPropertyMembers_data()
"}\n"); "}\n");
QTest::newRow("InsertQtPropertyMembersResetWithoutSetAndNotify") QTest::newRow("InsertQtPropertyMembersResetWithoutSetAndNotify")
<< _("struct XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"struct XmarksTheSpot : public QObject {\n"
" @Q_PROPERTY(int it READ getIt RESET resetIt)\n" " @Q_PROPERTY(int it READ getIt RESET resetIt)\n"
"};\n") "};\n")
<< _("struct XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"struct XmarksTheSpot : public QObject {\n"
" Q_PROPERTY(int it READ getIt RESET resetIt)\n" " Q_PROPERTY(int it READ getIt RESET resetIt)\n"
"\n" "\n"
"public:\n" "public:\n"
@@ -3642,13 +3649,15 @@ void QuickfixTest::testInsertQtPropertyMembers_data()
"}\n"); "}\n");
QTest::newRow("InsertQtPropertyMembersPrivateBeforePublic") QTest::newRow("InsertQtPropertyMembersPrivateBeforePublic")
<< _("class XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"class XmarksTheSpot : public QObject {\n"
"private:\n" "private:\n"
" @Q_PROPERTY(int it READ getIt WRITE setIt NOTIFY itChanged)\n" " @Q_PROPERTY(int it READ getIt WRITE setIt NOTIFY itChanged)\n"
"public:\n" "public:\n"
" void find();\n" " void find();\n"
"};\n") "};\n")
<< _("class XmarksTheSpot {\n" << _("struct QObject { void connect(); }\n"
"class XmarksTheSpot : public QObject {\n"
"private:\n" "private:\n"
" Q_PROPERTY(int it READ getIt WRITE setIt NOTIFY itChanged)\n" " Q_PROPERTY(int it READ getIt WRITE setIt NOTIFY itChanged)\n"
" int m_it;\n" " int m_it;\n"

View File

@@ -3971,9 +3971,20 @@ void GetterSetterRefactoringHelper::performGeneration(ExistingGetterSetterData d
} }
// setter declaration // setter declaration
const InsertionPointLocator::AccessSpec setterAccessSpec = m_settings->setterAsSlot InsertionPointLocator::AccessSpec setterAccessSpec = InsertionPointLocator::Public;
? InsertionPointLocator::PublicSlot if (m_settings->setterAsSlot) {
: InsertionPointLocator::Public; const QByteArray connectName = "connect";
const Identifier connectId(connectName.data(), connectName.size());
const QList<LookupItem> items = m_operation->context().lookup(&connectId, data.clazz);
for (const LookupItem &item : items) {
if (item.declaration() && item.declaration()->enclosingClass()
&& overview.prettyName(item.declaration()->enclosingClass()->name())
== "QObject") {
setterAccessSpec = InsertionPointLocator::PublicSlot;
break;
}
}
}
const auto createSetterBodyWithSignal = [this, &getSetTemplate, &data] { const auto createSetterBodyWithSignal = [this, &getSetTemplate, &data] {
QString body; QString body;
QTextStream setter(&body); QTextStream setter(&body);