aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kconfig_compiler/KConfigCodeGeneratorBase.cpp54
-rw-r--r--src/kconfig_compiler/KConfigCodeGeneratorBase.h3
-rw-r--r--src/kconfig_compiler/KConfigCommonStructs.h1
-rw-r--r--src/kconfig_compiler/KConfigHeaderGenerator.cpp44
-rw-r--r--src/kconfig_compiler/KConfigHeaderGenerator.h2
-rw-r--r--src/kconfig_compiler/KConfigSourceGenerator.cpp15
-rw-r--r--src/kconfig_compiler/KConfigSourceGenerator.h1
-rw-r--r--src/kconfig_compiler/kconfig_compiler.cpp12
8 files changed, 110 insertions, 22 deletions
diff --git a/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp b/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp
index 5a110b2e..239c906c 100644
--- a/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp
+++ b/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp
@@ -184,39 +184,51 @@ QString KConfigCodeGeneratorBase::memberAccessorBody(const CfgEntry *e, bool glo
return result;
}
-void KConfigCodeGeneratorBase::createIfSetLogic(const CfgEntry *e, const QString &varExpression)
+void KConfigCodeGeneratorBase::memberImmutableBody(const CfgEntry *e, bool globalEnums)
{
- const QString n = e->name;
- const QString t = e->type;
- const bool hasBody = !e->signalList.empty() || m_cfg.generateProperties;
+ QString n = e->name;
+ QString t = e->type;
- m_stream << whitespace() << "if (";
- if (hasBody) {
- m_stream << "v != " << varExpression << " && ";
- }
- m_stream << "!" << m_this << "isImmutable( QStringLiteral( \"";
+ stream() << whitespace() << "return " << m_this << "isImmutable( QStringLiteral( \"";
if (!e->param.isEmpty()) {
- QString paramName = e->paramName;
-
- m_stream << paramName.replace(QStringLiteral("$(") + e->param + QStringLiteral(")"), QLatin1String("%1")) << "\" ).arg( ";
+ stream() << QString(e->paramName).replace(QLatin1String("$(") + e->param + QLatin1Char(')'), QLatin1String("%1")) << "\" ).arg( ";
if (e->paramType == QLatin1String("Enum")) {
- m_stream << "QLatin1String( ";
+ stream() << "QLatin1String( ";
- if (m_cfg.globalEnums) {
- m_stream << enumName(e->param) << "ToString[i]";
+ if (globalEnums) {
+ stream() << enumName(e->param) << "ToString[i]";
} else {
- m_stream << enumName(e->param) << "::enumToString[i]";
+ stream() << enumName(e->param) << "::enumToString[i]";
}
- m_stream << " )";
+ stream() << " )";
} else {
- m_stream << "i";
+ stream() << "i";
}
- m_stream << " )";
+ stream() << " )";
} else {
- m_stream << n << "\" )";
+ stream() << n << "\" )";
+ }
+ stream() << " );" << endl;
+}
+
+void KConfigCodeGeneratorBase::createIfSetLogic(const CfgEntry *e, const QString &varExpression)
+{
+ const QString n = e->name;
+ const QString t = e->type;
+ const bool hasBody = !e->signalList.empty() || m_cfg.generateProperties;
+
+ m_stream << whitespace() << "if (";
+ if (hasBody) {
+ m_stream << "v != " << varExpression << " && ";
+ }
+
+ const auto immutablefunction = immutableFunction(n, m_cfg.dpointer ? m_cfg.className : QString());
+ m_stream << "!" << m_this << immutablefunction << "(";
+ if (!e->param.isEmpty()) {
+ m_stream << " i ";
}
- m_stream << " ))";
+ m_stream << "))";
}
void KConfigCodeGeneratorBase::memberMutatorBody(const CfgEntry *e)
diff --git a/src/kconfig_compiler/KConfigCodeGeneratorBase.h b/src/kconfig_compiler/KConfigCodeGeneratorBase.h
index 5bbc6b71..0c815c9b 100644
--- a/src/kconfig_compiler/KConfigCodeGeneratorBase.h
+++ b/src/kconfig_compiler/KConfigCodeGeneratorBase.h
@@ -82,6 +82,9 @@ public:
// TODO: write to the stream directly without returning a QString.
QString memberAccessorBody(const CfgEntry *e, bool globalEnums) const;
+ // Implements the is<Param>Immutable for the CfgEntry
+ void memberImmutableBody(const CfgEntry *e, bool globalEnums);
+
// Implements the `Set` methods for the CfgEntry
void memberMutatorBody(const CfgEntry *e);
diff --git a/src/kconfig_compiler/KConfigCommonStructs.h b/src/kconfig_compiler/KConfigCommonStructs.h
index 69b855ce..71bf666e 100644
--- a/src/kconfig_compiler/KConfigCommonStructs.h
+++ b/src/kconfig_compiler/KConfigCommonStructs.h
@@ -136,6 +136,7 @@ QString enumType(const CfgEntry *e, bool globalEnums);
QString getDefaultFunction(const QString &n, const QString &className = QString());
QString setFunction(const QString &n, const QString &className = QString());
QString getFunction(const QString &n, const QString &className = QString());
+QString immutableFunction(const QString &n, const QString &className = QString());
QString itemAccessorBody(const CfgEntry *e, const KConfigParameters &cfg);
QString signalEnumName(const QString &signalName);
diff --git a/src/kconfig_compiler/KConfigHeaderGenerator.cpp b/src/kconfig_compiler/KConfigHeaderGenerator.cpp
index 5b828ec8..f6c39b6a 100644
--- a/src/kconfig_compiler/KConfigHeaderGenerator.cpp
+++ b/src/kconfig_compiler/KConfigHeaderGenerator.cpp
@@ -79,7 +79,9 @@ void KConfigHeaderGenerator::doClassDefinition()
createSetters(entry);
createProperties(entry, returnType);
+ createImmutableProperty(entry);
createGetters(entry, returnType);
+ createImmutableGetters(entry);
createDefaultValueMember(entry);
createItemAcessors(entry, returnType);
}
@@ -172,7 +174,7 @@ void KConfigHeaderGenerator::implementChoiceEnums(const CfgEntry *entry, const C
}
QStringList values;
- for (const auto choice : qAsConst(chlist)) {
+ for (const auto &choice : qAsConst(chlist)) {
values.append(choices.prefix + choice.name);
}
@@ -415,6 +417,16 @@ void KConfigHeaderGenerator::createProperties(const CfgEntry *entry, const QStri
stream() << ")\n";
}
+void KConfigHeaderGenerator::createImmutableProperty(const CfgEntry *entry)
+{
+ if (!cfg().generateProperties) {
+ return;
+ }
+ stream() << whitespace();
+ stream() << "Q_PROPERTY(bool " << immutableFunction(entry->name);
+ stream() << " CONSTANT)\n";
+}
+
void KConfigHeaderGenerator::createSetters(const CfgEntry *entry)
{
// Manipulator
@@ -484,8 +496,38 @@ void KConfigHeaderGenerator::createGetters(const CfgEntry *entry, const QString
}
}
+void KConfigHeaderGenerator::createImmutableGetters(const CfgEntry *entry)
+{
+ stream() << whitespace() << "/**\n";
+ stream() << whitespace() << " Is " << entry->label << " Immutable\n";
+ stream() << whitespace() << "*/\n";
+ // Immutable
+ if (cfg().staticAccessors) {
+ stream() << whitespace() << "static\n";
+ }
+ stream() << whitespace() << "";
+ stream() << "bool " << immutableFunction(entry->name) << "(";
+ if (!entry->param.isEmpty()) {
+ stream() << " " << cppType(entry->paramType)<< " i ";
+ }
+ stream() << ")" << Const();
+ // function body inline only if not using dpointer
+ // for BC mode
+ if (!cfg().dpointer) {
+ stream() << '\n';
+ startScope();
+ memberImmutableBody(entry, cfg().globalEnums);
+ endScope();
+ stream() << '\n';
+ } else {
+ stream() << ";\n\n";
+ }
+}
+
void KConfigHeaderGenerator::createItemAcessors(const CfgEntry *entry, const QString &returnType)
{
+ Q_UNUSED(returnType)
+
// Item accessor
if (!cfg().itemAccessors) {
return;
diff --git a/src/kconfig_compiler/KConfigHeaderGenerator.h b/src/kconfig_compiler/KConfigHeaderGenerator.h
index 0b85594a..d780b850 100644
--- a/src/kconfig_compiler/KConfigHeaderGenerator.h
+++ b/src/kconfig_compiler/KConfigHeaderGenerator.h
@@ -71,7 +71,9 @@ private:
void createSetters(const CfgEntry *entry);
void createItemAcessors(const CfgEntry *entry, const QString &returnType);
void createGetters(const CfgEntry *entry, const QString &returnType);
+ void createImmutableGetters(const CfgEntry *entry);
void createProperties(const CfgEntry *entry, const QString &returnType);
+ void createImmutableProperty(const CfgEntry *entry);
void createDefaultValueMember(const CfgEntry *entry);
};
diff --git a/src/kconfig_compiler/KConfigSourceGenerator.cpp b/src/kconfig_compiler/KConfigSourceGenerator.cpp
index 87d00960..63f5b6b4 100644
--- a/src/kconfig_compiler/KConfigSourceGenerator.cpp
+++ b/src/kconfig_compiler/KConfigSourceGenerator.cpp
@@ -478,6 +478,20 @@ void KConfigSourceGenerator::createGetterDPointerMode(const CfgEntry *entry)
stream() << '\n';
}
+void KConfigSourceGenerator::createImmutableGetterDPointerMode(const CfgEntry *entry)
+{
+ stream() << whitespace() << "";
+ stream() << "bool " << " " << immutableFunction(entry->name, cfg().className) << "(";
+ if (!entry->param.isEmpty()) {
+ stream() << " " << cppType(entry->paramType) << " i ";
+ }
+ stream() << ")" << Const() << '\n';
+ startScope();
+ memberImmutableBody(entry, cfg().globalEnums);
+ endScope();
+ stream() << '\n';
+}
+
void KConfigSourceGenerator::createSetterDPointerMode(const CfgEntry *entry)
{
// Manipulator
@@ -533,6 +547,7 @@ void KConfigSourceGenerator::doGetterSetterDPointerMode()
for (auto *entry : parseResult.entries) {
createSetterDPointerMode(entry);
createGetterDPointerMode(entry);
+ createImmutableGetterDPointerMode(entry);
createItemGetterDPointerMode(entry);
stream() << '\n';
}
diff --git a/src/kconfig_compiler/KConfigSourceGenerator.h b/src/kconfig_compiler/KConfigSourceGenerator.h
index 510d4048..1e1ffc97 100644
--- a/src/kconfig_compiler/KConfigSourceGenerator.h
+++ b/src/kconfig_compiler/KConfigSourceGenerator.h
@@ -76,6 +76,7 @@ private:
void doGetterSetterDPointerMode();
void createGetterDPointerMode(const CfgEntry *entry);
+ void createImmutableGetterDPointerMode(const CfgEntry *entry);
void createSetterDPointerMode(const CfgEntry *entry);
void createItemGetterDPointerMode(const CfgEntry *entry);
diff --git a/src/kconfig_compiler/kconfig_compiler.cpp b/src/kconfig_compiler/kconfig_compiler.cpp
index 11becf5c..989e2609 100644
--- a/src/kconfig_compiler/kconfig_compiler.cpp
+++ b/src/kconfig_compiler/kconfig_compiler.cpp
@@ -154,6 +154,18 @@ QString getFunction(const QString &n, const QString &className)
return result;
}
+QString immutableFunction(const QString &n, const QString &className)
+{
+ QString result = QLatin1String("is") + n;
+ result[2] = result[2].toUpper();
+ result += "Immutable";
+
+ if (!className.isEmpty()) {
+ result = className + QLatin1String("::") + result;
+ }
+ return result;
+}
+
void addQuotes(QString &s)
{
if (!s.startsWith(QLatin1Char('"'))) {