diff options
| author | Henri Chain <henri.chain@enioka.com> | 2020-02-18 23:21:30 +0100 | 
|---|---|---|
| committer | Henri Chain <henri.chain@enioka.com> | 2020-02-25 15:46:53 +0100 | 
| commit | d218b93a535085c85889164d45a83c3a519f9f4b (patch) | |
| tree | b9c051db2691321c6ef604cd138342b0f3e39fea /src/kconfig_compiler | |
| parent | c8bf5e96cf2f25bb85330cf2587e2e365e6f0f71 (diff) | |
| download | kconfig-d218b93a535085c85889164d45a83c3a519f9f4b.tar.gz kconfig-d218b93a535085c85889164d45a83c3a519f9f4b.tar.bz2 | |
Fix code generation for entries with min/max
Summary:
- When GenerateProperties and Mutators are activated, the generated code
  did not handle min/max properly
- In the case of a parameterized entry, generated code also did not
  handle min/max
BUG: 418146
Test Plan: - auto tests included
Reviewers: meven, crossi, ervin, bport, tcanabrava
Reviewed By: meven, ervin
Subscribers: kde-frameworks-devel
Tags: #frameworks
Differential Revision: https://phabricator.kde.org/D27497
Diffstat (limited to 'src/kconfig_compiler')
| -rw-r--r-- | src/kconfig_compiler/KConfigCommonStructs.h | 16 | ||||
| -rw-r--r-- | src/kconfig_compiler/KConfigSourceGenerator.cpp | 46 | ||||
| -rw-r--r-- | src/kconfig_compiler/KConfigXmlParser.cpp | 2 | ||||
| -rw-r--r-- | src/kconfig_compiler/kconfig_compiler.cpp | 62 | 
4 files changed, 89 insertions, 37 deletions
| diff --git a/src/kconfig_compiler/KConfigCommonStructs.h b/src/kconfig_compiler/KConfigCommonStructs.h index 71bf666e..06c8b80f 100644 --- a/src/kconfig_compiler/KConfigCommonStructs.h +++ b/src/kconfig_compiler/KConfigCommonStructs.h @@ -155,6 +155,11 @@ QString varPath(const QString &n, const KConfigParameters &cfg);  // like using d-> in case of dpointer  QString itemVar(const CfgEntry *e, const KConfigParameters &cfg); +// returns the name of the local inner item if there is one +// (before wrapping with KConfigCompilerSignallingItem) +// Otherwise return itemVar() +QString innerItemVar(const CfgEntry *e, const KConfigParameters &cfg); +  QString itemPath(const CfgEntry *e, const KConfigParameters &cfg);  QString filenameOnly(const QString &path); @@ -170,9 +175,16 @@ QString translatedString(  // TODO: Sanitize those functions.  QString newItem( -    const CfgEntry* entry,  +    const CfgEntry *entry, +    const QString &key, +    const QString &defaultValue, +    const KConfigParameters &cfg, +    const QString ¶m = QString()); + +QString newInnerItem( +    const CfgEntry *entry,      const QString &key, -    const QString& defaultValue, +    const QString &defaultValue,      const KConfigParameters &cfg,      const QString ¶m = QString()); diff --git a/src/kconfig_compiler/KConfigSourceGenerator.cpp b/src/kconfig_compiler/KConfigSourceGenerator.cpp index 63f5b6b4..33e0ed69 100644 --- a/src/kconfig_compiler/KConfigSourceGenerator.cpp +++ b/src/kconfig_compiler/KConfigSourceGenerator.cpp @@ -313,14 +313,21 @@ void KConfigSourceGenerator::createEnums(const CfgEntry *entry)  void KConfigSourceGenerator::createNormalEntry(const CfgEntry *entry, const QString &key)  { -   stream() << "  " << 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()) << " = "          << newItem(entry, key, entry->defaultValue, cfg()) << '\n';      if (!entry->min.isEmpty()) { -        stream() << "  " << itemPath(entry, cfg()) << "->setMinValue(" << entry->min << ");\n"; +        stream() << "  " << innerItemVarStr << "->setMinValue(" << entry->min << ");\n";      } +      if (!entry->max.isEmpty()) { -        stream() << "  " << itemPath(entry, cfg()) << "->setMaxValue(" << entry->max << ");\n"; +        stream() << "  " << innerItemVarStr << "->setMaxValue(" << entry->max << ");\n";      }      if (cfg().setUserTexts) { @@ -343,14 +350,29 @@ void KConfigSourceGenerator::createNormalEntry(const CfgEntry *entry, const QStr  void KConfigSourceGenerator::createIndexedEntry(const CfgEntry *entry, const QString &key)  {      for (int i = 0; i <= entry->paramMax; i++) { -        QString itemVarStr(itemPath(entry, cfg()) + QStringLiteral("[%1]").arg(i)); +        const QString argBracket = QStringLiteral("[%1]").arg(i); +        const QString innerItemVarStr = innerItemVar(entry, cfg()) + argBracket; + +        const QString defaultStr = !entry->paramDefaultValues[i].isEmpty() +            ? entry->paramDefaultValues[i] +            : !entry->defaultValue.isEmpty() ? paramString(entry->defaultValue, entry, i) : defaultValue(entry->type); + +        if (!entry->signalList.isEmpty()) { +            stream() << "  " << innerItemVarStr << " = " +                     << newInnerItem(entry, paramString(key, entry, i), defaultStr, cfg(), argBracket) << '\n'; +        } + +        const QString itemVarStr = itemPath(entry, cfg()) + argBracket; -        QString defaultStr = !entry->paramDefaultValues[i].isEmpty() ? entry->paramDefaultValues[i] -                           : !entry->defaultValue.isEmpty() ? paramString(entry->defaultValue, entry, i) -                           : defaultValue(entry->type); -                  stream() << "  " << itemVarStr << " = " -            << newItem(entry, paramString(key, entry, i), defaultStr, cfg(), QStringLiteral("[%1]").arg(i)) << '\n'; +                 << newItem(entry, paramString(key, entry, i), defaultStr, cfg(), argBracket) << '\n'; + +        if (!entry->min.isEmpty()) { +            stream() << "  " << innerItemVarStr << "->setMinValue(" << entry->min << ");\n"; +        } +        if (!entry->max.isEmpty()) { +            stream() << "  " << innerItemVarStr << "->setMaxValue(" << entry->max << ");\n"; +        }          if (cfg().setUserTexts) {              stream() << userTextsFunctions(entry, cfg(), itemVarStr, entry->paramName); @@ -366,7 +388,7 @@ void KConfigSourceGenerator::createIndexedEntry(const CfgEntry *entry, const QSt          QString paramName = entry->paramName;          stream() << "  addItem( " << itemVarStr << ", QStringLiteral( \""; -        stream() << paramName.replace(QStringLiteral("$(") + entry->param + QLatin1Char(')'), QLatin1String("%1")).arg( arg ); +        stream() << paramName.replace(QStringLiteral("$(") + entry->param + QLatin1Char(')'), QLatin1String("%1")).arg(arg);          stream() << "\" ) );\n";      }  } @@ -440,9 +462,7 @@ void KConfigSourceGenerator::doConstructor()          }          createEnums(entry); -        if (!cfg().dpointer) { -            stream() << itemDeclaration(entry, cfg()); -        } +        stream() << itemDeclaration(entry, cfg());          if (entry->param.isEmpty()) {              createNormalEntry(entry, key); diff --git a/src/kconfig_compiler/KConfigXmlParser.cpp b/src/kconfig_compiler/KConfigXmlParser.cpp index b403dbd5..2f31beb9 100644 --- a/src/kconfig_compiler/KConfigXmlParser.cpp +++ b/src/kconfig_compiler/KConfigXmlParser.cpp @@ -362,7 +362,6 @@ CfgEntry *KConfigXmlParser::parseEntry(const QString &group, const QDomElement &      readGroupElements(readEntry, element); -    createChangedSignal(readEntry);      validateNameAndKey(readEntry, element);      if (readEntry.label.isEmpty()) { @@ -431,6 +430,7 @@ CfgEntry *KConfigXmlParser::parseEntry(const QString &group, const QDomElement &      }      result->min = readEntry.min;      result->max = readEntry.max; +    createChangedSignal(*result);      return result;  } diff --git a/src/kconfig_compiler/kconfig_compiler.cpp b/src/kconfig_compiler/kconfig_compiler.cpp index 989e2609..4e76f375 100644 --- a/src/kconfig_compiler/kconfig_compiler.cpp +++ b/src/kconfig_compiler/kconfig_compiler.cpp @@ -394,21 +394,23 @@ QString itemType(const QString &type)  QString itemDeclaration(const CfgEntry *e, const KConfigParameters &cfg)  { -    if (cfg.itemAccessors) { -        return QString(); +    const QString type = cfg.inherits + "::Item" + itemType(e->type); + +    QString fCap = e->name; +    fCap[0] = fCap[0].toUpper(); +    const QString argSuffix = (!e->param.isEmpty()) ? (QStringLiteral("[%1]").arg(e->paramMax + 1)) : QString(); +    QString result; + +    if (!cfg.itemAccessors && !cfg.dpointer) { +        result += "  " + (!e->signalList.isEmpty() ? QStringLiteral("KConfigCompilerSignallingItem") : type) + +            "  *item" + fCap + argSuffix + ";\n";      } -    QString type;      if (!e->signalList.isEmpty()) { -        type = QStringLiteral("KConfigCompilerSignallingItem"); -    } else { -        type = cfg.inherits + "::Item" + itemType(e->type); +        result += "  " + type + "  *" + innerItemVar(e, cfg) + argSuffix + ";\n";      } -    QString fCap = e->name; -    fCap[0] = fCap[0].toUpper(); -    return "  " + type + "  *item" + fCap + -            ( (!e->param.isEmpty())?(QStringLiteral("[%1]").arg(e->paramMax+1)) : QString()) + ";\n"; +    return result;  }  // returns the name of an item variable @@ -432,6 +434,20 @@ QString itemVar(const CfgEntry *e, const KConfigParameters &cfg)      return result;  } +// returns the name of the local inner item if there is one +// (before wrapping with KConfigCompilerSignallingItem) +// Otherwise return itemVar() +QString innerItemVar(const CfgEntry *e, const KConfigParameters &cfg) +{ +    if (e->signalList.isEmpty()) { +        return itemVar(e, cfg); +    } else { +        QString result = "innerItem" + e->name; +        result[9] = result[9].toUpper(); +        return result; +    } +} +  QString itemPath(const CfgEntry *e, const KConfigParameters &cfg)  {      QString result; @@ -443,15 +459,9 @@ QString itemPath(const CfgEntry *e, const KConfigParameters &cfg)      return result;  } -QString newItem(const CfgEntry* entry, const QString &key, const QString& defaultValue, +QString newInnerItem(const CfgEntry *entry, const QString &key, const QString &defaultValue,                  const KConfigParameters &cfg, const QString ¶m) { - -    QList<Signal> sigs = entry->signalList; -    QString t; -    if (!sigs.isEmpty()) { -        t += QLatin1String("new KConfigCompilerSignallingItem("); -    } -    t += "new "+ cfg.inherits + "::Item" + itemType(entry->type) + "( currentGroup(), " +    QString t = "new "+ cfg.inherits + "::Item" + itemType(entry->type) + "( currentGroup(), "              + key + ", " + varPath( entry->name, cfg ) + param;      if (entry->type == QLatin1String("Enum")) { @@ -460,9 +470,18 @@ QString newItem(const CfgEntry* entry, const QString &key, const QString& defaul      if (!defaultValue.isEmpty()) {          t += QLatin1String(", ") + defaultValue;      } -    t += QLatin1String(" )"); +    t += QLatin1String(" );"); + +    return t; +} + +QString newItem(const CfgEntry *entry, const QString &key, const QString &defaultValue, +                const KConfigParameters &cfg, const QString ¶m) { +    QList<Signal> sigs = entry->signalList; +    QString t;      if (!sigs.isEmpty()) { +        t += QLatin1String("new KConfigCompilerSignallingItem(") + innerItemVar(entry, cfg) + param;          t += QLatin1String(", this, notifyFunction, ");          //append the signal flags          for (int i = 0; i < sigs.size(); ++i) { @@ -470,9 +489,10 @@ QString newItem(const CfgEntry* entry, const QString &key, const QString& defaul                  t += QLatin1String(" | ");              t += signalEnumName(sigs[i].name);          } -        t += QLatin1String(")"); +        t += QLatin1String(");"); +    } else { +        t += newInnerItem(entry, key, defaultValue, cfg, param);      } -    t += QLatin1String(";");      return t;  } | 
