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_CPP_FILE_NAMESPACE_HANDLING[] = "CppFileNamespaceHandling";
const char QUICK_FIX_SETTING_MEMBER_VARIABEL_NAME_TEMPLATE[] = "MemberVariableNameTemplate"; const char QUICK_FIX_SETTING_MEMBER_VARIABEL_NAME_TEMPLATE[] = "MemberVariableNameTemplate";
const char QUICK_FIX_SETTING_VALUE_TYPES[] = "ValueTypes"; 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_TEMPLATES[] = "CustomTemplate";
const char QUICK_FIX_SETTING_CUSTOM_TEMPLATE_TYPES[] = "Types"; const char QUICK_FIX_SETTING_CUSTOM_TEMPLATE_TYPES[] = "Types";
const char QUICK_FIX_SETTING_CUSTOM_TEMPLATE_COMPARISON[] = "Comparison"; const char QUICK_FIX_SETTING_CUSTOM_TEMPLATE_COMPARISON[] = "Comparison";

View File

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

View File

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

View File

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

View File

@@ -129,6 +129,7 @@ public:
MissingNamespaceHandling cppFileNamespaceHandling = MissingNamespaceHandling::CreateMissing; MissingNamespaceHandling cppFileNamespaceHandling = MissingNamespaceHandling::CreateMissing;
QString memberVariableNameTemplate = "m_<name>"; QString memberVariableNameTemplate = "m_<name>";
QStringList valueTypes; // if contains use value. Ignores namespaces and template parameters QStringList valueTypes; // if contains use value. Ignores namespaces and template parameters
bool returnByConstRef = false;
std::vector<CustomTemplate> customTemplates; std::vector<CustomTemplate> customTemplates;
}; };
} // namespace CppEditor } // 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_addValueType, &QPushButton::clicked, then);
QObject::connect(this->ui->pushButton_removeValueType, &QPushButton::clicked, then); QObject::connect(this->ui->pushButton_removeValueType, &QPushButton::clicked, then);
QObject::connect(this->ui->valueTypes, &QListWidget::itemChanged, 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_customTemplateAssignment, &QLineEdit::textEdited, then);
QObject::connect(this->ui->lineEdit_customTemplateComparison, &QLineEdit::textEdited, then); QObject::connect(this->ui->lineEdit_customTemplateComparison, &QLineEdit::textEdited, then);
QObject::connect(this->ui->lineEdit_customTemplateReturnExpression, &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 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled
| Qt::ItemNeverHasChildren); | Qt::ItemNeverHasChildren);
} }
ui->returnByConstRefCheckBox->setChecked(settings->returnByConstRef);
ui->listWidget_customTemplates->clear(); ui->listWidget_customTemplates->clear();
for (const auto &customTemplate : settings->customTemplates) { for (const auto &customTemplate : settings->customTemplates) {
auto item = new QListWidgetItem(customTemplate.types.join(", "), 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) { for (int i = 0; i < ui->valueTypes->count(); ++i) {
settings->valueTypes << ui->valueTypes->item(i)->text(); settings->valueTypes << ui->valueTypes->item(i)->text();
} }
settings->returnByConstRef = ui->returnByConstRefCheckBox->isChecked();
settings->customTemplates.clear(); settings->customTemplates.clear();
for (int i = 0; i < ui->listWidget_customTemplates->count(); ++i) { for (int i = 0; i < ui->listWidget_customTemplates->count(); ++i) {
auto item = ui->listWidget_customTemplates->item(i); auto item = ui->listWidget_customTemplates->item(i);

View File

@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>641</width> <width>641</width>
<height>1074</height> <height>1141</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
@@ -25,9 +25,6 @@
<property name="text"> <property name="text">
<string>Default</string> <string>Default</string>
</property> </property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item row="4" column="1" alignment="Qt::AlignHCenter"> <item row="4" column="1" alignment="Qt::AlignHCenter">
@@ -329,9 +326,6 @@
<property name="text"> <property name="text">
<string>Default</string> <string>Default</string>
</property> </property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
@@ -350,9 +344,6 @@
<property name="text"> <property name="text">
<string>Generate Getters</string> <string>Generate Getters</string>
</property> </property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
@@ -371,9 +362,6 @@
<property name="text"> <property name="text">
<string>Generate Setters</string> <string>Generate Setters</string>
</property> </property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="5" column="0">
@@ -886,6 +874,16 @@
</item> </item>
</layout> </layout>
</item> </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> </layout>
</widget> </widget>
<resources/> <resources/>