diff options
Diffstat (limited to 'src/kconfig_compiler')
| -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('"'))) { | 
