forked from qt-creator/qt-creator
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:
@@ -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";
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
|
@@ -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()) {
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user