CppEditor: Use JS-based transformations

... when generating member variables, getters, setters etc.
This provides more flexibility than the custom template syntax used so
far and is also less idiosyncratic.

Fixes: QTCREATORBUG-32302
Change-Id: I1640809e5cba6ad5b90cd4d6ee1871501b77c048
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2025-01-15 17:07:04 +01:00
parent 317adcbf81
commit d14d25ad17
6 changed files with 82 additions and 145 deletions

View File

@@ -38,16 +38,17 @@ const char QUICK_FIX_SETTING_GETTER_IN_CPP_FILE_FROM[] = "GettersInCppFileFrom";
const char QUICK_FIX_SETTING_SETTER_OUTSIDE_CLASS_FROM[] = "SettersOutsideClassFrom"; const char QUICK_FIX_SETTING_SETTER_OUTSIDE_CLASS_FROM[] = "SettersOutsideClassFrom";
const char QUICK_FIX_SETTING_SETTER_IN_CPP_FILE_FROM[] = "SettersInCppFileFrom"; const char QUICK_FIX_SETTING_SETTER_IN_CPP_FILE_FROM[] = "SettersInCppFileFrom";
const char QUICK_FIX_SETTING_GETTER_ATTRIBUTES[] = "GetterAttributes"; const char QUICK_FIX_SETTING_GETTER_ATTRIBUTES[] = "GetterAttributes";
const char QUICK_FIX_SETTING_GETTER_NAME_TEMPLATE[] = "GetterNameTemplate"; const char QUICK_FIX_SETTING_GETTER_NAME_TEMPLATE[] = "GetterNameTemplateV2";
const char QUICK_FIX_SETTING_SETTER_NAME_TEMPLATE[] = "SetterNameTemplate"; const char QUICK_FIX_SETTING_SETTER_NAME_TEMPLATE[] = "SetterNameTemplateV2";
const char QUICK_FIX_SETTING_SIGNAL_NAME_TEMPLATE[] = "SignalNameTemplate"; const char QUICK_FIX_SETTING_SIGNAL_NAME_TEMPLATE[] = "SignalNameTemplateV2";
const char QUICK_FIX_SETTING_RESET_NAME_TEMPLATE[] = "ResetNameTemplate"; const char QUICK_FIX_SETTING_RESET_NAME_TEMPLATE[] = "ResetNameTemplateV2";
const char QUICK_FIX_SETTING_SIGNAL_WITH_NEW_VALUE[] = "SignalWithNewValue"; const char QUICK_FIX_SETTING_SIGNAL_WITH_NEW_VALUE[] = "SignalWithNewValue";
const char QUICK_FIX_SETTING_SETTER_AS_SLOT[] = "SetterAsSlot"; const char QUICK_FIX_SETTING_SETTER_AS_SLOT[] = "SetterAsSlot";
const char QUICK_FIX_SETTING_SETTER_PARAMETER_NAME[] = "SetterParameterName"; const char QUICK_FIX_SETTING_SETTER_PARAMETER_NAME[] = "SetterParameterNameV2";
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_USE_AUTO[] = "UseAutoInAssignToVar"; const char QUICK_FIX_SETTING_USE_AUTO[] = "UseAutoInAssignToVar";
const char QUICK_FIX_SETTING_MEMBER_VARIABEL_NAME_TEMPLATE[] = "MemberVariableNameTemplate"; const char QUICK_FIX_SETTING_MEMBER_VARIABLE_NAME_TEMPLATE[] = "MemberVariableNameTemplateV2";
const char QUICK_FIX_SETTING_REVERSE_MEMBER_VARIABLE_NAME_TEMPLATE[] = "ReverseMemberVariableNameTemplate";
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_RETURN_BY_CONST_REF[] = "ReturnNonValueTypesByConstRef";
const char QUICK_FIX_SETTING_CUSTOM_TEMPLATES[] = "CustomTemplate"; const char QUICK_FIX_SETTING_CUSTOM_TEMPLATES[] = "CustomTemplate";

View File

@@ -131,15 +131,11 @@ static QString memberBaseName(const QString &name)
}; };
QString baseName = name; QString baseName = name;
CppQuickFixSettings *settings = CppQuickFixProjectsSettings::getQuickFixSettings( const CppQuickFixSettings * const settings = CppQuickFixProjectsSettings::getQuickFixSettings(
ProjectExplorer::ProjectTree::currentProject()); ProjectExplorer::ProjectTree::currentProject());
const QString &nameTemplate = settings->memberVariableNameTemplate; if (!settings->nameFromMemberVariableTemplate.isEmpty()) {
const QString prefix = nameTemplate.left(nameTemplate.indexOf('<')); return CppQuickFixSettings::replaceNamePlaceholders(
const QString postfix = nameTemplate.mid(nameTemplate.lastIndexOf('>') + 1); settings->nameFromMemberVariableTemplate, name);
if (name.startsWith(prefix) && name.endsWith(postfix)) {
const QString base = name.mid(prefix.length(), name.length() - postfix.length());
if (validName(base))
return base;
} }
// Remove leading and trailing "_" // Remove leading and trailing "_"
@@ -2863,8 +2859,7 @@ private slots:
QuickFixSettings s; QuickFixSettings s;
s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::CreateMissing; s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::CreateMissing;
s->setterParameterNameTemplate = "value"; s->setterParameterNameTemplate = "\"value\"";
s->getterNameTemplate = "get<Name>";
s->setterInCppFileFrom = 1; s->setterInCppFileFrom = 1;
s->getterInCppFileFrom = 1; s->getterInCppFileFrom = 1;
GenerateGetterSetter factory; GenerateGetterSetter factory;
@@ -2986,7 +2981,7 @@ private slots:
QuickFixSettings s; QuickFixSettings s;
s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::AddUsingDirective; s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::AddUsingDirective;
s->setterParameterNameTemplate = "value"; s->setterParameterNameTemplate = "\"value\"";
s->setterInCppFileFrom = 1; s->setterInCppFileFrom = 1;
if (std::strstr(QTest::currentDataTag(), "unnamed nested") != nullptr) if (std::strstr(QTest::currentDataTag(), "unnamed nested") != nullptr)
@@ -3118,7 +3113,7 @@ private slots:
QuickFixSettings s; QuickFixSettings s;
s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::RewriteType; s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::RewriteType;
s->setterParameterNameTemplate = "value"; s->setterParameterNameTemplate = "\"value\"";
s->setterInCppFileFrom = 1; s->setterInCppFileFrom = 1;
if (std::strstr(QTest::currentDataTag(), "unnamed nested") != nullptr) if (std::strstr(QTest::currentDataTag(), "unnamed nested") != nullptr)
@@ -3306,12 +3301,20 @@ private slots:
QuickFixSettings s; QuickFixSettings s;
s->setterInCppFileFrom = 0; s->setterInCppFileFrom = 0;
s->getterInCppFileFrom = 0; s->getterInCppFileFrom = 0;
s->setterNameTemplate = "Seet_<Name>"; s->setterNameTemplate = R"js("Seet_" + name[0].toUpperCase() + name.slice(1))js";
s->getterNameTemplate = "give_me_<snake>"; s->getterNameTemplate = R"js("give_me_" + name.replace(/([A-Z])/g,
s->signalNameTemplate = "new<Camel>Value"; function(v) { return "_" + v.toLowerCase(); }))js";
s->setterParameterNameTemplate = "New_<Snake>"; s->signalNameTemplate = R"js("new" + name[0].toUpperCase()
s->resetNameTemplate = "set_<camel>_toDefault"; + name.slice(1).replace(/_([a-z])/g, function(v) { return v.slice(1).toUpperCase(); })
s->memberVariableNameTemplate = "mem_<name>"; + "Value")js";
s->setterParameterNameTemplate = R"js("New_" + name[0].toUpperCase()
+ name.slice(1).replace(/([A-Z])/g,
"_" + "$1").replace(/(_[a-z])/g, function(v) { return v.toUpperCase(); }))js";
s->resetNameTemplate = R"js("set_" + name.replace(/_([a-z])/g,
function(v) { return v.slice(1).toUpperCase(); }) + "_toDefault")js";
s->memberVariableNameTemplate = R"js("mem_" + name)js";
if (QByteArray(QTest::currentDataTag()) == "create methods with given member variable")
s->nameFromMemberVariableTemplate = R"js(name.slice(4))js";
if (operation == 0) { if (operation == 0) {
InsertQtPropertyMembers factory; InsertQtPropertyMembers factory;
QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), operation); QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), operation);
@@ -3572,7 +3575,6 @@ private slots:
QuickFixSettings s; QuickFixSettings s;
s->setterInCppFileFrom = 0; s->setterInCppFileFrom = 0;
s->getterInCppFileFrom = 0; s->getterInCppFileFrom = 0;
s->getterNameTemplate = "get<Name>";
s->valueTypes << "Value"; s->valueTypes << "Value";
s->returnByConstRef = true; s->returnByConstRef = true;
@@ -3644,7 +3646,6 @@ void Foo::setBar(const custom<N2::test> &newBar)
QuickFixSettings s; QuickFixSettings s;
s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::AddUsingDirective; s->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::AddUsingDirective;
s->getterNameTemplate = "get<Name>";
s->getterInCppFileFrom = 1; s->getterInCppFileFrom = 1;
s->signalWithNewValue = true; s->signalWithNewValue = true;
CppQuickFixSettings::CustomTemplate t; CppQuickFixSettings::CustomTemplate t;
@@ -3684,7 +3685,7 @@ void Foo::setBar(const custom<N2::test> &newBar)
testDocuments << CppTestDocument::create("file.h", original, expected); testDocuments << CppTestDocument::create("file.h", original, expected);
QuickFixSettings s; QuickFixSettings s;
s->setterParameterNameTemplate = "<name>"; s->setterParameterNameTemplate = "name";
s->setterInCppFileFrom = 0; s->setterInCppFileFrom = 0;
GenerateGetterSetter factory; GenerateGetterSetter factory;
@@ -4023,7 +4024,8 @@ void Foo::setBar(const custom<N2::test> &newBar)
QFETCH(QByteArray, expected); QFETCH(QByteArray, expected);
QuickFixSettings s; QuickFixSettings s;
s->setterParameterNameTemplate = "<name>"; s->getterNameTemplate = "name";
s->setterParameterNameTemplate = "name";
s->getterInCppFileFrom = 1; s->getterInCppFileFrom = 1;
s->setterInCppFileFrom = 1; s->setterInCppFileFrom = 1;
@@ -4069,7 +4071,6 @@ void Foo::setBar(const custom<N2::test> &newBar)
QuickFixSettings s; QuickFixSettings s;
s->getterInCppFileFrom = 1; s->getterInCppFileFrom = 1;
s->getterNameTemplate = "get<Name>";
GenerateGetterSetter factory; GenerateGetterSetter factory;
QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 1); QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 1);
} }
@@ -4110,7 +4111,7 @@ void Foo::setBar(const custom<N2::test> &newBar)
testDocuments << CppTestDocument::create("file.cpp", original, expected); testDocuments << CppTestDocument::create("file.cpp", original, expected);
s->setterInCppFileFrom = 1; s->setterInCppFileFrom = 1;
s->setterParameterNameTemplate = "value"; s->setterParameterNameTemplate = "\"value\"";
GenerateGetterSetter factory; GenerateGetterSetter factory;
QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 0); QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 0);
@@ -4123,7 +4124,8 @@ void Foo::setBar(const custom<N2::test> &newBar)
QByteArray expected; QByteArray expected;
QuickFixSettings s; QuickFixSettings s;
s->setterInCppFileFrom = 1; s->setterInCppFileFrom = 1;
s->setterParameterNameTemplate = "value"; s->getterNameTemplate = "name";
s->setterParameterNameTemplate = "\"value\"";
// Header File // Header File
original = R"( original = R"(
@@ -4213,8 +4215,7 @@ void Foo::setBar(const custom<N2::test> &newBar)
QuickFixSettings s; QuickFixSettings s;
s->setterOutsideClassFrom = 1; s->setterOutsideClassFrom = 1;
s->getterOutsideClassFrom = 1; s->getterOutsideClassFrom = 1;
s->setterParameterNameTemplate = "value"; s->setterParameterNameTemplate = "\"value\"";
s->getterNameTemplate = "get<Name>";
GenerateGetterSetter factory; GenerateGetterSetter factory;
QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 4); QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 4);
@@ -4251,7 +4252,7 @@ void Foo::setBar(const custom<N2::test> &newBar)
QuickFixSettings s; QuickFixSettings s;
s->setterOutsideClassFrom = 1; s->setterOutsideClassFrom = 1;
s->setterParameterNameTemplate = "value"; s->setterParameterNameTemplate = "\"value\"";
GenerateGetterSetter factory; GenerateGetterSetter factory;
QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 0); QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 0);
@@ -4288,7 +4289,6 @@ void Foo::setBar(const custom<N2::test> &newBar)
QuickFixSettings s; QuickFixSettings s;
s->getterOutsideClassFrom = 0; s->getterOutsideClassFrom = 0;
s->getterInCppFileFrom = 0; s->getterInCppFileFrom = 0;
s->getterNameTemplate = "get<Name>";
s->returnByConstRef = true; s->returnByConstRef = true;
GenerateGetterSetter factory; GenerateGetterSetter factory;
@@ -4448,8 +4448,7 @@ private slots:
QFETCH(QByteArray, expected); QFETCH(QByteArray, expected);
QuickFixSettings s; QuickFixSettings s;
s->getterNameTemplate = "get<Name>"; s->setterParameterNameTemplate = "\"value\"";
s->setterParameterNameTemplate = "value";
s->setterOutsideClassFrom = 1; s->setterOutsideClassFrom = 1;
s->getterOutsideClassFrom = 1; s->getterOutsideClassFrom = 1;
s->returnByConstRef = true; s->returnByConstRef = true;
@@ -4613,7 +4612,7 @@ private slots:
QuickFixSettings s; QuickFixSettings s;
s->setterAsSlot = true; s->setterAsSlot = true;
s->setterInCppFileFrom = 0; s->setterInCppFileFrom = 0;
s->setterParameterNameTemplate = "<name>"; s->setterParameterNameTemplate = "name";
s->signalWithNewValue = true; s->signalWithNewValue = true;
InsertQtPropertyMembers factory; InsertQtPropertyMembers factory;

View File

@@ -7,6 +7,7 @@
#include "../cppeditorconstants.h" #include "../cppeditorconstants.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/jsexpander.h>
#include <utils/qtcsettings.h> #include <utils/qtcsettings.h>
@@ -25,17 +26,7 @@ CppQuickFixSettings::CppQuickFixSettings(bool loadGlobalSettings)
void CppQuickFixSettings::loadGlobalSettings() void CppQuickFixSettings::loadGlobalSettings()
{ {
// TODO remove the conversion of the old setting preferGetterNameWithoutGetPrefix of the
// CppCodeStyleSettings in 4.16 (also remove the member preferGetterNameWithoutGetPrefix)
getterNameTemplate = "__dummy";
loadSettingsFrom(Core::ICore::settings()); loadSettingsFrom(Core::ICore::settings());
if (getterNameTemplate == "__dummy") {
// there was no saved property for getterNameTemplate
if (CppCodeStyleSettings::currentGlobalCodeStyle().preferGetterNameWithoutGetPrefix)
getterNameTemplate = "<name>";
else
getterNameTemplate = "get<Name>";
}
} }
void CppQuickFixSettings::loadSettingsFrom(QtcSettings *s) void CppQuickFixSettings::loadSettingsFrom(QtcSettings *s)
@@ -81,9 +72,13 @@ void CppQuickFixSettings::loadSettingsFrom(QtcSettings *s)
.toInt()); .toInt());
useAuto = s->value(Constants::QUICK_FIX_SETTING_USE_AUTO, def.useAuto).toBool(); useAuto = s->value(Constants::QUICK_FIX_SETTING_USE_AUTO, def.useAuto).toBool();
memberVariableNameTemplate = s->value(Constants::QUICK_FIX_SETTING_MEMBER_VARIABEL_NAME_TEMPLATE, memberVariableNameTemplate = s->value(Constants::QUICK_FIX_SETTING_MEMBER_VARIABLE_NAME_TEMPLATE,
def.memberVariableNameTemplate) def.memberVariableNameTemplate)
.toString(); .toString();
nameFromMemberVariableTemplate
= s->value(Constants::QUICK_FIX_SETTING_REVERSE_MEMBER_VARIABLE_NAME_TEMPLATE,
def.nameFromMemberVariableTemplate)
.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, returnByConstRef = s->value(Constants::QUICK_FIX_SETTING_RETURN_BY_CONST_REF,
def.returnByConstRef).toBool(); def.returnByConstRef).toBool();
@@ -151,9 +146,12 @@ void CppQuickFixSettings::saveSettingsTo(QtcSettings *s)
s->setValueWithDefault(Constants::QUICK_FIX_SETTING_CPP_FILE_NAMESPACE_HANDLING, s->setValueWithDefault(Constants::QUICK_FIX_SETTING_CPP_FILE_NAMESPACE_HANDLING,
int(cppFileNamespaceHandling), int(cppFileNamespaceHandling),
int(def.cppFileNamespaceHandling)); int(def.cppFileNamespaceHandling));
s->setValueWithDefault(Constants::QUICK_FIX_SETTING_MEMBER_VARIABEL_NAME_TEMPLATE, s->setValueWithDefault(Constants::QUICK_FIX_SETTING_MEMBER_VARIABLE_NAME_TEMPLATE,
memberVariableNameTemplate, memberVariableNameTemplate,
def.memberVariableNameTemplate); def.memberVariableNameTemplate);
s->setValueWithDefault(Constants::QUICK_FIX_SETTING_REVERSE_MEMBER_VARIABLE_NAME_TEMPLATE,
nameFromMemberVariableTemplate,
def.nameFromMemberVariableTemplate);
s->setValueWithDefault(Constants::QUICK_FIX_SETTING_SETTER_PARAMETER_NAME, s->setValueWithDefault(Constants::QUICK_FIX_SETTING_SETTER_PARAMETER_NAME,
setterParameterNameTemplate, setterParameterNameTemplate,
def.setterParameterNameTemplate); def.setterParameterNameTemplate);
@@ -224,84 +222,16 @@ void CppQuickFixSettings::setDefaultSettings()
customTemplates.push_back(unique_ptr); customTemplates.push_back(unique_ptr);
} }
QString toUpperCamelCase(const QString &s)
{
auto parts = s.split('_');
if (parts.size() == 1)
return s;
QString camel;
camel.reserve(s.length() - parts.size() + 1);
for (const auto &part : parts) {
camel += part[0].toUpper();
camel += part.mid(1);
}
return camel;
}
QString toSnakeCase(const QString &s, bool upperSnakeCase)
{
QString snake;
snake.reserve(s.length() + 5);
if (upperSnakeCase)
snake += s[0].toUpper();
else
snake += s[0].toLower();
for (int i = 1; i < s.length(); ++i) {
if (s[i].isUpper() && s[i - 1].isLower()) {
snake += '_';
if (upperSnakeCase)
snake += s[i].toUpper();
else
snake += s[i].toLower();
} else {
if (s[i - 1] == '_') {
if (upperSnakeCase)
snake += s[i].toUpper();
else
snake += s[i].toLower();
} else {
snake += s[i];
}
}
}
return snake;
}
QString CppQuickFixSettings::replaceNamePlaceholders(const QString &nameTemplate, QString CppQuickFixSettings::replaceNamePlaceholders(const QString &nameTemplate,
const QString &name) const QString &name)
{ {
const int start = nameTemplate.indexOf("<"); Core::JsExpander expander;
const int end = nameTemplate.indexOf(">"); QString jsError;
if (start < 0 || end < 0) const auto jsExpr = QString("(function(name) { return %1; })(\"%2\")").arg(nameTemplate, name);
return nameTemplate; const QString jsRes = expander.evaluate(jsExpr, &jsError);
if (!jsError.isEmpty())
const auto before = nameTemplate.left(start); return jsError; // TODO: Use Utils::Result?
const auto after = nameTemplate.right(nameTemplate.length() - end - 1); return jsRes;
if (name.isEmpty())
return before + after;
// const auto charBefore = start >= 1 ? nameTemplate.at(start - 1) : QChar{};
const auto nameType = nameTemplate.mid(start + 1, end - start - 1);
if (nameType == "name") {
return before + name + after;
} else if (nameType == "Name") {
return before + name.at(0).toUpper() + name.mid(1) + after;
} else if (nameType == "camel") {
auto camel = toUpperCamelCase(name);
camel.data()[0] = camel.data()[0].toLower();
return before + camel + after;
} else if (nameType == "Camel") {
return before + toUpperCamelCase(name) + after;
} else if (nameType == "snake") {
return before + toSnakeCase(name, false) + after;
} else if (nameType == "Snake") {
return before + toSnakeCase(name, true) + after;
} else {
return "templateHasErrors";
}
} }
auto removeAndExtractTemplate(QString type) auto removeAndExtractTemplate(QString type)

View File

@@ -117,15 +117,16 @@ public:
int setterOutsideClassFrom = 0; int setterOutsideClassFrom = 0;
int setterInCppFileFrom = 1; int setterInCppFileFrom = 1;
QString getterAttributes; // e.g. [[nodiscard]] QString getterAttributes; // e.g. [[nodiscard]]
QString getterNameTemplate = "<name>"; // or get<Name> QString getterNameTemplate = R"js("get" + name[0].toUpperCase() + name.slice(1))js";
QString setterNameTemplate = "set<Name>"; // or set_<name> or Set<Name> QString setterNameTemplate = R"js("set" + name[0].toUpperCase() + name.slice(1))js";
QString setterParameterNameTemplate = "new<Name>"; QString setterParameterNameTemplate = R"js("new" + name[0].toUpperCase() + name.slice(1))js";
QString signalNameTemplate = "<name>Changed"; QString signalNameTemplate = R"js(name + "Changed")js";
QString resetNameTemplate = "reset<Name>"; QString resetNameTemplate = R"js("reset" + name[0].toUpperCase() + name.slice(1))js";
bool signalWithNewValue = false; bool signalWithNewValue = false;
bool setterAsSlot = false; bool setterAsSlot = false;
MissingNamespaceHandling cppFileNamespaceHandling = MissingNamespaceHandling::CreateMissing; MissingNamespaceHandling cppFileNamespaceHandling = MissingNamespaceHandling::CreateMissing;
QString memberVariableNameTemplate = "m_<name>"; QString memberVariableNameTemplate = R"js("m_" + name)js";
QString nameFromMemberVariableTemplate;
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; bool returnByConstRef = false;
bool useAuto = true; bool useAuto = true;

View File

@@ -104,38 +104,39 @@ CppQuickFixSettingsWidget::CppQuickFixSettingsWidget()
const QString placeHolderTect = Tr::tr("See tool tip for more information"); const QString placeHolderTect = Tr::tr("See tool tip for more information");
const QString toolTip = Tr::tr( const QString toolTip = Tr::tr(
R"==(Use <name> for the variable "A JavaScript expression acting as the return value of a function taking a parameter "
Use <camel> for camel case "called \"name\"");
Use <snake> for snake case CppQuickFixSettings defaultSettings;
Use <Name>, <Camel> and <Snake> for upper case
e.g. name = "m_test_foo_":
"set_<name> => "set_test_foo"
"set<Name> => "setTest_foo"
"set<Camel> => "setTestFoo")==");
m_lineEdit_getterAttribute = new QLineEdit; m_lineEdit_getterAttribute = new QLineEdit;
m_lineEdit_getterAttribute->setPlaceholderText(Tr::tr("For example, [[nodiscard]]")); m_lineEdit_getterAttribute->setPlaceholderText(Tr::tr("For example, [[nodiscard]]"));
m_lineEdit_getterName = new QLineEdit; m_lineEdit_getterName = new QLineEdit;
m_lineEdit_getterName->setPlaceholderText(placeHolderTect); m_lineEdit_getterName->setPlaceholderText(defaultSettings.getterNameTemplate);
m_lineEdit_getterName->setToolTip(toolTip); m_lineEdit_getterName->setToolTip(toolTip);
m_lineEdit_setterName = new QLineEdit; m_lineEdit_setterName = new QLineEdit;
m_lineEdit_setterName->setPlaceholderText(placeHolderTect); m_lineEdit_setterName->setPlaceholderText(defaultSettings.setterNameTemplate);
m_lineEdit_setterName->setToolTip(toolTip); m_lineEdit_setterName->setToolTip(toolTip);
m_lineEdit_setterParameter = new QLineEdit; m_lineEdit_setterParameter = new QLineEdit;
m_lineEdit_setterParameter->setPlaceholderText(Tr::tr("For example, new<Name>")); m_lineEdit_setterParameter->setPlaceholderText(defaultSettings.setterParameterNameTemplate);
m_lineEdit_setterParameter->setToolTip(toolTip); m_lineEdit_setterParameter->setToolTip(toolTip);
m_checkBox_setterSlots = new QCheckBox(Tr::tr("Setters should be slots")); m_checkBox_setterSlots = new QCheckBox(Tr::tr("Setters should be slots"));
m_lineEdit_resetName = new QLineEdit; m_lineEdit_resetName = new QLineEdit;
m_lineEdit_resetName->setPlaceholderText(Tr::tr("Normally reset<Name>")); m_lineEdit_resetName->setPlaceholderText(defaultSettings.resetNameTemplate);
m_lineEdit_resetName->setToolTip(toolTip); m_lineEdit_resetName->setToolTip(toolTip);
m_lineEdit_signalName = new QLineEdit; m_lineEdit_signalName = new QLineEdit;
m_lineEdit_signalName->setPlaceholderText(Tr::tr("Normally <name>Changed")); m_lineEdit_signalName->setPlaceholderText(defaultSettings.signalNameTemplate);
m_lineEdit_signalName->setToolTip(toolTip); m_lineEdit_signalName->setToolTip(toolTip);
m_checkBox_signalWithNewValue = new QCheckBox( m_checkBox_signalWithNewValue = new QCheckBox(
Tr::tr("Generate signals with the new value as parameter")); Tr::tr("Generate signals with the new value as parameter"));
m_lineEdit_memberVariableName = new QLineEdit; m_lineEdit_memberVariableName = new QLineEdit;
m_lineEdit_memberVariableName->setPlaceholderText(Tr::tr("For example, m_<name>")); m_lineEdit_memberVariableName->setPlaceholderText(defaultSettings.memberVariableNameTemplate);
m_lineEdit_memberVariableName->setToolTip(toolTip); m_lineEdit_memberVariableName->setToolTip(toolTip);
m_lineEdit_nameFromMemberVariable = new QLineEdit;
m_lineEdit_nameFromMemberVariable->setToolTip(
Tr::tr(
"How to get from the member variable to the semantic name.\n"
"This is the reverse of the operation above.\n"
"Leave empty to apply heuristics."));
m_radioButton_generateMissingNamespace = new QRadioButton(Tr::tr("Generate missing namespaces")); m_radioButton_generateMissingNamespace = new QRadioButton(Tr::tr("Generate missing namespaces"));
m_radioButton_addUsingnamespace = new QRadioButton(Tr::tr("Add \"using namespace ...\"")); m_radioButton_addUsingnamespace = new QRadioButton(Tr::tr("Add \"using namespace ...\""));
@@ -253,6 +254,7 @@ e.g. name = "m_test_foo_":
Tr::tr("Signal name:"), m_lineEdit_signalName, br, Tr::tr("Signal name:"), m_lineEdit_signalName, br,
m_checkBox_signalWithNewValue, br, m_checkBox_signalWithNewValue, br,
Tr::tr("Member variable name:"), m_lineEdit_memberVariableName, br, Tr::tr("Member variable name:"), m_lineEdit_memberVariableName, br,
Tr::tr("Name from member variable:"), m_lineEdit_nameFromMemberVariable, br,
}, },
}, },
Group { Group {
@@ -312,6 +314,7 @@ e.g. name = "m_test_foo_":
connect(m_lineEdit_getterAttribute, &QLineEdit::textEdited, then); connect(m_lineEdit_getterAttribute, &QLineEdit::textEdited, then);
connect(m_lineEdit_getterName, &QLineEdit::textEdited, then); connect(m_lineEdit_getterName, &QLineEdit::textEdited, then);
connect(m_lineEdit_memberVariableName, &QLineEdit::textEdited, then); connect(m_lineEdit_memberVariableName, &QLineEdit::textEdited, then);
connect(m_lineEdit_nameFromMemberVariable, &QLineEdit::textEdited, then);
connect(m_lineEdit_resetName, &QLineEdit::textEdited, then); connect(m_lineEdit_resetName, &QLineEdit::textEdited, then);
connect(m_lineEdit_setterName, &QLineEdit::textEdited, then); connect(m_lineEdit_setterName, &QLineEdit::textEdited, then);
connect(m_lineEdit_setterParameter, &QLineEdit::textEdited, then); connect(m_lineEdit_setterParameter, &QLineEdit::textEdited, then);
@@ -348,6 +351,7 @@ void CppQuickFixSettingsWidget::loadSettings(CppQuickFixSettings *settings)
m_lineEdit_resetName->setText(settings->resetNameTemplate); m_lineEdit_resetName->setText(settings->resetNameTemplate);
m_lineEdit_signalName->setText(settings->signalNameTemplate); m_lineEdit_signalName->setText(settings->signalNameTemplate);
m_lineEdit_memberVariableName->setText(settings->memberVariableNameTemplate); m_lineEdit_memberVariableName->setText(settings->memberVariableNameTemplate);
m_lineEdit_nameFromMemberVariable->setText(settings->nameFromMemberVariableTemplate);
m_checkBox_setterSlots->setChecked(settings->setterAsSlot); m_checkBox_setterSlots->setChecked(settings->setterAsSlot);
m_checkBox_signalWithNewValue->setChecked(settings->signalWithNewValue); m_checkBox_signalWithNewValue->setChecked(settings->signalWithNewValue);
m_useAutoCheckBox->setChecked(settings->useAuto); m_useAutoCheckBox->setChecked(settings->useAuto);
@@ -402,6 +406,7 @@ void CppQuickFixSettingsWidget::saveSettings(CppQuickFixSettings *settings)
settings->resetNameTemplate = m_lineEdit_resetName->text(); settings->resetNameTemplate = m_lineEdit_resetName->text();
settings->signalNameTemplate = m_lineEdit_signalName->text(); settings->signalNameTemplate = m_lineEdit_signalName->text();
settings->memberVariableNameTemplate = m_lineEdit_memberVariableName->text(); settings->memberVariableNameTemplate = m_lineEdit_memberVariableName->text();
settings->nameFromMemberVariableTemplate = m_lineEdit_nameFromMemberVariable->text();
if (m_radioButton_rewriteTypes->isChecked()) { if (m_radioButton_rewriteTypes->isChecked()) {
settings->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::RewriteType; settings->cppFileNamespaceHandling = CppQuickFixSettings::MissingNamespaceHandling::RewriteType;
} else if (m_radioButton_addUsingnamespace->isChecked()) { } else if (m_radioButton_addUsingnamespace->isChecked()) {

View File

@@ -66,6 +66,7 @@ private:
QLineEdit *m_lineEdit_setterName; QLineEdit *m_lineEdit_setterName;
QLineEdit *m_lineEdit_signalName; QLineEdit *m_lineEdit_signalName;
QLineEdit *m_lineEdit_memberVariableName; QLineEdit *m_lineEdit_memberVariableName;
QLineEdit *m_lineEdit_nameFromMemberVariable;
QRadioButton *m_radioButton_generateMissingNamespace; QRadioButton *m_radioButton_generateMissingNamespace;
QRadioButton *m_radioButton_addUsingnamespace; QRadioButton *m_radioButton_addUsingnamespace;
QRadioButton *m_radioButton_rewriteTypes; QRadioButton *m_radioButton_rewriteTypes;