diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/kconfig_compiler/KConfigCodeGeneratorBase.cpp | 54 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigCodeGeneratorBase.h | 3 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigCommonStructs.h | 1 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigHeaderGenerator.cpp | 44 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigHeaderGenerator.h | 2 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigSourceGenerator.cpp | 15 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigSourceGenerator.h | 1 | ||||
-rw-r--r-- | src/kconfig_compiler/kconfig_compiler.cpp | 12 |
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('"'))) { |