CppEditor: Make value vs const ref return type configurable

... in the quickfix settings.
Also change the default: With mandatory RVO and move semantics, value
return types are the right choice most of the time.

Fixes: QTCREATORBUG-25790
Change-Id: I68fc6c616358478ba893101b3e04aa6bbbe79348
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
This commit is contained in:
Christian Kandeler
2022-09-12 17:36:52 +02:00
parent 75e35cc4f2
commit 4119181762
7 changed files with 27 additions and 15 deletions

View File

@@ -49,6 +49,7 @@ const char QUICK_FIX_SETTING_SETTER_PARAMETER_NAME[] = "SetterParameterName";
const char QUICK_FIX_SETTING_CPP_FILE_NAMESPACE_HANDLING[] = "CppFileNamespaceHandling";
const char QUICK_FIX_SETTING_MEMBER_VARIABEL_NAME_TEMPLATE[] = "MemberVariableNameTemplate";
const char QUICK_FIX_SETTING_VALUE_TYPES[] = "ValueTypes";
const char QUICK_FIX_SETTING_RETURN_BY_CONST_REF[] = "ReturnNonValueTypesByConstRef";
const char QUICK_FIX_SETTING_CUSTOM_TEMPLATES[] = "CustomTemplate";
const char QUICK_FIX_SETTING_CUSTOM_TEMPLATE_TYPES[] = "Types";
const char QUICK_FIX_SETTING_CUSTOM_TEMPLATE_COMPARISON[] = "Comparison";

View File

@@ -2722,6 +2722,7 @@ void QuickfixTest::testGenerateGetterSetterValueTypes()
s->getterInCppFileFrom = 0;
s->getterNameTemplate = "get<Name>";
s->valueTypes << "Value";
s->returnByConstRef = true;
GenerateGetterSetter factory;
QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), operation);
@@ -3434,6 +3435,7 @@ public:
s->getterOutsideClassFrom = 0;
s->getterInCppFileFrom = 0;
s->getterNameTemplate = "get<Name>";
s->returnByConstRef = true;
GenerateGetterSetter factory;
QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 1);
@@ -3615,6 +3617,7 @@ void QuickfixTest::testGenerateGettersSetters()
s->setterParameterNameTemplate = "value";
s->setterOutsideClassFrom = 1;
s->getterOutsideClassFrom = 1;
s->returnByConstRef = true;
TestFactory factory;
QuickFixOperationTest({CppTestDocument::create("file.h", original, expected)}, &factory);

View File

@@ -3881,7 +3881,7 @@ void GetterSetterRefactoringHelper::performGeneration(ExistingGetterSetterData d
}
const FullySpecifiedType returnTypeHeader = [&] {
if (!getSetTemplate.returnTypeTemplate.has_value())
return parameterType;
return m_settings->returnByConstRef ? parameterType : memberVariableType;
QString typeTemplate = getSetTemplate.returnTypeTemplate.value();
if (returnTypeTemplateParameter.has_value())
typeTemplate.replace(Pattern::TEMPLATE_PARAMETER_PATTERN,
@@ -3947,7 +3947,7 @@ void GetterSetterRefactoringHelper::performGeneration(ExistingGetterSetterData d
data.clazz,
targetFile,
targetLoc);
if (!isValueType)
if (m_settings->returnByConstRef && !isValueType)
return makeConstRef(returnType);
return returnType;
}

View File

@@ -79,6 +79,8 @@ void CppQuickFixSettings::loadSettingsFrom(QSettings *s)
def.memberVariableNameTemplate)
.toString();
valueTypes = s->value(Constants::QUICK_FIX_SETTING_VALUE_TYPES, def.valueTypes).toStringList();
returnByConstRef = s->value(Constants::QUICK_FIX_SETTING_RETURN_BY_CONST_REF,
def.returnByConstRef).toBool();
customTemplates = def.customTemplates;
int size = s->beginReadArray(Constants::QUICK_FIX_SETTING_CUSTOM_TEMPLATES);
if (size > 0)
@@ -171,6 +173,10 @@ void CppQuickFixSettings::saveSettingsTo(QSettings *s)
Constants::QUICK_FIX_SETTING_VALUE_TYPES,
valueTypes,
def.valueTypes);
QtcSettings::setValueWithDefault(s,
Constants::QUICK_FIX_SETTING_RETURN_BY_CONST_REF,
returnByConstRef,
def.returnByConstRef);
if (customTemplates == def.customTemplates) {
s->remove(Constants::QUICK_FIX_SETTING_CUSTOM_TEMPLATES);
} else {

View File

@@ -129,6 +129,7 @@ public:
MissingNamespaceHandling cppFileNamespaceHandling = MissingNamespaceHandling::CreateMissing;
QString memberVariableNameTemplate = "m_<name>";
QStringList valueTypes; // if contains use value. Ignores namespaces and template parameters
bool returnByConstRef = false;
std::vector<CustomTemplate> customTemplates;
};
} // namespace CppEditor

View File

@@ -79,6 +79,7 @@ e.g. name = "m_test_foo_":
QObject::connect(this->ui->pushButton_addValueType, &QPushButton::clicked, then);
QObject::connect(this->ui->pushButton_removeValueType, &QPushButton::clicked, then);
QObject::connect(this->ui->valueTypes, &QListWidget::itemChanged, then);
QObject::connect(this->ui->returnByConstRefCheckBox, &QCheckBox::clicked, then);
QObject::connect(this->ui->lineEdit_customTemplateAssignment, &QLineEdit::textEdited, then);
QObject::connect(this->ui->lineEdit_customTemplateComparison, &QLineEdit::textEdited, then);
QObject::connect(this->ui->lineEdit_customTemplateReturnExpression, &QLineEdit::textEdited, then);
@@ -142,6 +143,7 @@ void CppQuickFixSettingsWidget::loadSettings(CppQuickFixSettings *settings)
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled
| Qt::ItemNeverHasChildren);
}
ui->returnByConstRefCheckBox->setChecked(settings->returnByConstRef);
ui->listWidget_customTemplates->clear();
for (const auto &customTemplate : settings->customTemplates) {
auto item = new QListWidgetItem(customTemplate.types.join(", "),
@@ -201,6 +203,7 @@ void CppQuickFixSettingsWidget::saveSettings(CppQuickFixSettings *settings)
for (int i = 0; i < ui->valueTypes->count(); ++i) {
settings->valueTypes << ui->valueTypes->item(i)->text();
}
settings->returnByConstRef = ui->returnByConstRefCheckBox->isChecked();
settings->customTemplates.clear();
for (int i = 0; i < ui->listWidget_customTemplates->count(); ++i) {
auto item = ui->listWidget_customTemplates->item(i);

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>641</width>
<height>1074</height>
<height>1141</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
@@ -25,9 +25,6 @@
<property name="text">
<string>Default</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="4" column="1" alignment="Qt::AlignHCenter">
@@ -329,9 +326,6 @@
<property name="text">
<string>Default</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="2">
@@ -350,9 +344,6 @@
<property name="text">
<string>Generate Getters</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -371,9 +362,6 @@
<property name="text">
<string>Generate Setters</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="5" column="0">
@@ -886,6 +874,16 @@
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="returnByConstRefCheckBox">
<property name="text">
<string>Return non-value types by const reference</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>