aboutsummaryrefslogtreecommitdiff
path: root/src/kconfig_compiler
diff options
context:
space:
mode:
authorMéven Car <meven29@gmail.com>2020-03-05 10:02:46 +0100
committerMéven Car <meven.car@enioka.com>2020-03-08 19:02:19 +0100
commitec207330d5bd61799a47092bf555a523ab000f93 (patch)
tree1d81fd6d70ff14dcad535cc79c8d40c641a1c676 /src/kconfig_compiler
parenta38f3d91d9dc6717010f01893ae26c8015b6bb05 (diff)
downloadkconfig-ec207330d5bd61799a47092bf555a523ab000f93.tar.gz
kconfig-ec207330d5bd61799a47092bf555a523ab000f93.tar.bz2
KconfigXT: Add a value attribute to Enum field choices
Summary: Allow to write choices such as : ``` <choices> <choice name="enum_name" value="I can't containt (anything)"></choice> <choice name="normal_choice"></choice> </choices> ``` Test Plan: ctest Reviewers: ervin, bport, crossi, #frameworks Reviewed By: ervin Subscribers: ngraham, davidre, kde-frameworks-devel Tags: #frameworks Differential Revision: https://phabricator.kde.org/D27463
Diffstat (limited to 'src/kconfig_compiler')
-rw-r--r--src/kconfig_compiler/KConfigCommonStructs.h6
-rw-r--r--src/kconfig_compiler/KConfigSourceGenerator.cpp19
-rw-r--r--src/kconfig_compiler/KConfigXmlParser.cpp7
-rw-r--r--src/kconfig_compiler/README.dox7
-rw-r--r--src/kconfig_compiler/kcfg.xsd1
5 files changed, 34 insertions, 6 deletions
diff --git a/src/kconfig_compiler/KConfigCommonStructs.h b/src/kconfig_compiler/KConfigCommonStructs.h
index 06c8b80f..fef45a9f 100644
--- a/src/kconfig_compiler/KConfigCommonStructs.h
+++ b/src/kconfig_compiler/KConfigCommonStructs.h
@@ -55,6 +55,12 @@ public:
QString label;
QString toolTip;
QString whatsThis;
+ QString val;
+
+ QString value() const
+ {
+ return !val.isEmpty() ? val : name;
+ }
};
class Choices
{
diff --git a/src/kconfig_compiler/KConfigSourceGenerator.cpp b/src/kconfig_compiler/KConfigSourceGenerator.cpp
index 33e0ed69..3e8a8156 100644
--- a/src/kconfig_compiler/KConfigSourceGenerator.cpp
+++ b/src/kconfig_compiler/KConfigSourceGenerator.cpp
@@ -313,13 +313,14 @@ void KConfigSourceGenerator::createEnums(const CfgEntry *entry)
void KConfigSourceGenerator::createNormalEntry(const CfgEntry *entry, const QString &key)
{
+ const QString itemVarStr = itemPath(entry, cfg());
const QString innerItemVarStr = innerItemVar(entry, cfg());
if (!entry->signalList.isEmpty()) {
stream() << " " << innerItemVarStr << " = "
<< newInnerItem(entry, key, entry->defaultValue, cfg()) << '\n';
}
- stream() << " " << itemPath(entry, cfg()) << " = "
+ stream() << " " << itemVarStr << " = "
<< newItem(entry, key, entry->defaultValue, cfg()) << '\n';
if (!entry->min.isEmpty()) {
@@ -335,10 +336,16 @@ void KConfigSourceGenerator::createNormalEntry(const CfgEntry *entry, const QStr
}
if (cfg().allNotifiers || cfg().notifiers.contains(entry->name)) {
- stream() << " " << itemPath(entry, cfg()) << "->setWriteFlags(KConfigBase::Notify);\n";
+ stream() << " " << itemVarStr << "->setWriteFlags(KConfigBase::Notify);\n";
}
- stream() << " addItem( " << itemPath(entry, cfg());
+ for (const CfgEntry::Choice &choice : qAsConst(entry->choices.choices)) {
+ if (!choice.val.isEmpty()) {
+ stream() << " " << itemVarStr << "->setValueForChoice(QStringLiteral( \"" << choice.name << "\" ), QStringLiteral( \"" << choice.val << "\" ));\n";
+ }
+ }
+
+ stream() << " addItem( " << itemVarStr;
QString quotedName = entry->name;
addQuotes(quotedName);
if (quotedName != key) {
@@ -374,6 +381,12 @@ void KConfigSourceGenerator::createIndexedEntry(const CfgEntry *entry, const QSt
stream() << " " << innerItemVarStr << "->setMaxValue(" << entry->max << ");\n";
}
+ for (const CfgEntry::Choice &choice : qAsConst(entry->choices.choices)) {
+ if (!choice.val.isEmpty()) {
+ stream() << " " << itemVarStr << "->setValueForChoice(QStringLiteral( \"" << choice.name << "\" ), QStringLiteral( \"" << choice.val << "\" ));\n";
+ }
+ }
+
if (cfg().setUserTexts) {
stream() << userTextsFunctions(entry, cfg(), itemVarStr, entry->paramName);
}
diff --git a/src/kconfig_compiler/KConfigXmlParser.cpp b/src/kconfig_compiler/KConfigXmlParser.cpp
index 2f31beb9..045018de 100644
--- a/src/kconfig_compiler/KConfigXmlParser.cpp
+++ b/src/kconfig_compiler/KConfigXmlParser.cpp
@@ -176,6 +176,7 @@ void KConfigXmlParser::readParameterFromEntry(CfgEntry &readEntry, const QDomEle
bool KConfigXmlParser::hasDefaultCode(CfgEntry &readEntry, const QDomElement &element)
{
+ Q_UNUSED(readEntry)
for (QDomElement e = element.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {
if (e.attribute(QStringLiteral("param")).isEmpty()) {
if (e.attribute(QStringLiteral("code")) == QLatin1String("true")) {
@@ -186,10 +187,11 @@ bool KConfigXmlParser::hasDefaultCode(CfgEntry &readEntry, const QDomElement &el
return false;
}
-
void KConfigXmlParser::readChoicesFromEntry(CfgEntry &readEntry, const QDomElement &e)
{
QList<CfgEntry::Choice> chlist;
+ const auto choiceNameRegex = QRegularExpression(QStringLiteral("\\w+"));
+
for (QDomElement e2 = e.firstChildElement(); !e2.isNull(); e2 = e2.nextSiblingElement()) {
if (e2.tagName() != QLatin1String("choice")) {
continue;
@@ -198,7 +200,10 @@ void KConfigXmlParser::readChoicesFromEntry(CfgEntry &readEntry, const QDomEleme
choice.name = e2.attribute(QStringLiteral("name"));
if (choice.name.isEmpty()) {
std::cerr << "Tag <choice> requires attribute 'name'." << std::endl;
+ } else if (!choiceNameRegex.match(choice.name).hasMatch()) {
+ std::cerr << "Tag <choice> attribute 'name' must be compatible with Enum naming. name was '" << qPrintable(choice.name) << "'. You can use attribute 'value' to pass any string as the choice value." << std::endl;
}
+ choice.val = e2.attribute(QStringLiteral("value"));
for (QDomElement e3 = e2.firstChildElement(); !e3.isNull(); e3 = e3.nextSiblingElement()) {
if (e3.tagName() == QLatin1String("label")) {
choice.label = e3.text();
diff --git a/src/kconfig_compiler/README.dox b/src/kconfig_compiler/README.dox
index c17bd395..55e59736 100644
--- a/src/kconfig_compiler/README.dox
+++ b/src/kconfig_compiler/README.dox
@@ -354,7 +354,7 @@ this allows the same Enum value names to be used in different enums. For example
<entry name="KeepData" type="Enum">
<choices>
<choice name="Do">
- <choice name="Dont">
+ <choice name="Dont" value="Don't">
</choices>
</entry>
\endverbatim
@@ -369,6 +369,9 @@ will generate this public class containing the enum definition, inside the gener
};
\endverbatim
+Since 5.68, if present the <b>value</b> attribute will be used as the choice value written to the backend
+instead of the <b>name</b>, allowing to write text incompatible with enum naming.
+
Alternatively, if <b>GlobalEnums</b> is set to true, all Enum items are defined as
unnamed enums in the global scope of the generated class. In this case, all Enum values
must have different names to avoid clashes. However, you can use a 'prefix' argument
@@ -380,7 +383,7 @@ is set to true, the .kcfg entry
<entry name="KeepData" type="Enum">
<choices prefix="Keep_">
<choice name="Do">
- <choice name="Dont">
+ <choice name="Dont" value="Don't">
</choices>
</entry>
\endverbatim
diff --git a/src/kconfig_compiler/kcfg.xsd b/src/kconfig_compiler/kcfg.xsd
index 77a335cd..11196d45 100644
--- a/src/kconfig_compiler/kcfg.xsd
+++ b/src/kconfig_compiler/kcfg.xsd
@@ -93,6 +93,7 @@
<xsd:element minOccurs="0" name="tooltip" type="kcfg:translatableString"/>
</xsd:all>
<xsd:attribute name="name" use="required" type="xsd:string"/>
+ <xsd:attribute name="value" use="optional" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>