diff --git a/src/kconfig_compiler/KConfigCodeGeneratorBase.h b/src/kconfig_compiler/KConfigCodeGeneratorBase.h --- a/src/kconfig_compiler/KConfigCodeGeneratorBase.h +++ b/src/kconfig_compiler/KConfigCodeGeneratorBase.h @@ -62,8 +62,8 @@ // Closes all the namespaces adding lines with single '}' void endNamespaces(); - // Add the correct amount of whitespace in the code. - QString whitespace() const; + // Add the correct amount of whitespace in the code. and return the stream + QTextStream &whitespace(); // start a block scope `{` and increase indentation level. void endScope(ScopeFinalizer finalizer = None); diff --git a/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp b/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp --- a/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp +++ b/src/kconfig_compiler/KConfigCodeGeneratorBase.cpp @@ -88,26 +88,27 @@ } } -QString KConfigCodeGeneratorBase::whitespace() const +QTextStream &KConfigCodeGeneratorBase::whitespace() { QString spaces; for (int i = 0; i < m_indentLevel; i++) { spaces.append(QLatin1Char(' ')); } - return spaces; + m_stream << spaces; + return m_stream; } void KConfigCodeGeneratorBase::startScope() { - m_stream << whitespace() << QLatin1Char('{'); + whitespace() << QLatin1Char('{'); m_stream << '\n'; indent(); } void KConfigCodeGeneratorBase::endScope(ScopeFinalizer finalizer) { unindent(); - m_stream << whitespace() << QLatin1Char('}'); + whitespace() << QLatin1Char('}'); if (finalizer == ScopeFinalizer::Semicolon) { m_stream << ';'; } @@ -190,7 +191,7 @@ const QString t = e->type; const bool hasBody = !e->signalList.empty() || m_cfg.generateProperties; - m_stream << whitespace() << "if ("; + whitespace() << "if ("; if (hasBody) { m_stream << "v != " << varExpression << " && "; } @@ -227,23 +228,23 @@ // HACK: Don't open '{' manually, use startScope / endScope to automatically handle whitespace indentation. if (!e->min.isEmpty()) { if (e->min != QLatin1String("0") || !isUnsigned(t)) { // skip writing "if uint<0" (#187579) - m_stream << whitespace() << "if (v < " << e->min << ")\n"; - m_stream << whitespace() << "{\n"; - m_stream << whitespace(); addDebugMethod(m_stream, m_cfg, n); + whitespace() << "if (v < " << e->min << ")\n"; + whitespace() << "{\n"; + whitespace(); addDebugMethod(m_stream, m_cfg, n); m_stream << ": value \" << v << \" is less than the minimum value of " << e->min << "\";\n"; - m_stream << whitespace() << " v = " << e->min << ";\n"; - m_stream << whitespace() << "}\n"; + whitespace() << " v = " << e->min << ";\n"; + whitespace() << "}\n"; } } if (!e->max.isEmpty()) { m_stream << '\n'; - m_stream << whitespace() << "if (v > " << e->max << ")\n"; - m_stream << whitespace() << "{\n"; - m_stream << whitespace(); addDebugMethod(m_stream, m_cfg, n); + whitespace() << "if (v > " << e->max << ")\n"; + whitespace() << "{\n"; + whitespace(); addDebugMethod(m_stream, m_cfg, n); m_stream << ": value \" << v << \" is greater than the maximum value of " << e->max << "\";\n"; - m_stream << whitespace() << " v = " << e->max << ";\n"; - m_stream << whitespace() << "}\n\n"; + whitespace() << " v = " << e->max << ";\n"; + whitespace() << "}\n\n"; } const QString varExpression = m_this + varPath(n, m_cfg) + (e->param.isEmpty() ? QString() : QStringLiteral("[i]")); @@ -254,18 +255,18 @@ // m_this call creates an `if (someTest ...) that's just to long to throw over the code. createIfSetLogic(e, varExpression); m_stream << (hasBody ? " {" : "") << '\n'; - m_stream << whitespace() << " " << varExpression << " = v;\n"; + whitespace() << " " << varExpression << " = v;\n"; const auto listSignal = e->signalList; for (const Signal &signal : qAsConst(listSignal)) { if (signal.modify) { - m_stream << whitespace() << " Q_EMIT " << m_this << signal.name << "();\n"; + whitespace() << " Q_EMIT " << m_this << signal.name << "();\n"; } else { - m_stream << whitespace() << " " << m_this << varPath(QStringLiteral("settingsChanged"), m_cfg) + whitespace() << " " << m_this << varPath(QStringLiteral("settingsChanged"), m_cfg) << " |= " << signalEnumName(signal.name) << ";\n"; } } if (hasBody) { - m_stream << whitespace() << "}\n"; + whitespace() << "}\n"; } } diff --git a/src/kconfig_compiler/KConfigHeaderGenerator.cpp b/src/kconfig_compiler/KConfigHeaderGenerator.cpp --- a/src/kconfig_compiler/KConfigHeaderGenerator.cpp +++ b/src/kconfig_compiler/KConfigHeaderGenerator.cpp @@ -90,7 +90,7 @@ // TODO: Move those to functions too. if (parseResult.hasNonModifySignals) { - stream() << whitespace() << "bool usrSave() override;\n"; + whitespace() << "bool usrSave() override;\n"; } // Member variables @@ -102,15 +102,15 @@ // Class Parameters for (const auto ¶meter : parseResult.parameters) { - stream() << whitespace() << "" << cppType(parameter.type) << " mParam" << parameter.name << ";\n"; + whitespace() << "" << cppType(parameter.type) << " mParam" << parameter.name << ";\n"; } createNonDPointerHelpers(); createDPointer(); if (cfg().customAddons) { - stream() << whitespace() << "// Include custom additions\n"; - stream() << whitespace() << "#include \"" << cfg().baseName << "_addons." << cfg().headerExtension << "\"\n"; + whitespace() << "// Include custom additions\n"; + whitespace() << "#include \"" << cfg().baseName << "_addons." << cfg().headerExtension << "\"\n"; } endScope(ScopeFinalizer::Semicolon); @@ -178,18 +178,18 @@ if (choices.name().isEmpty()) { if (cfg().globalEnums) { - stream() << whitespace() << "enum " << enumName(entry->name, entry->choices) << " { " << values.join(QStringLiteral(", ")) << " };\n"; + whitespace() << "enum " << enumName(entry->name, entry->choices) << " { " << values.join(QStringLiteral(", ")) << " };\n"; } else { // Create an automatically named enum - stream() << whitespace() << "class " << enumName(entry->name, entry->choices) << '\n'; - stream() << whitespace() << "{\n"; - stream() << whitespace() << " public:\n"; - stream() << whitespace() << " enum type { " << values.join(QStringLiteral(", ")) << ", COUNT };\n"; - stream() << whitespace() << "};\n"; + whitespace() << "class " << enumName(entry->name, entry->choices) << '\n'; + whitespace() << "{\n"; + whitespace() << " public:\n"; + whitespace() << " enum type { " << values.join(QStringLiteral(", ")) << ", COUNT };\n"; + whitespace() << "};\n"; } } else if (!choices.external()) { // Create a named enum - stream() << whitespace() << "enum " << enumName(entry->name, entry->choices) << " { " << values.join(QStringLiteral(", ")) << " };\n"; + whitespace() << "enum " << enumName(entry->name, entry->choices) << " { " << values.join(QStringLiteral(", ")) << " };\n"; } } @@ -203,15 +203,15 @@ // ### FIXME!! // make the following string table an index-based string search! // ### - stream() << whitespace() << "enum " << enumName(entry->param) << " { " << values.join(QStringLiteral(", ")) << " };\n"; - stream() << whitespace() << "static const char* const " << enumName(entry->param) << "ToString[];\n"; + whitespace() << "enum " << enumName(entry->param) << " { " << values.join(QStringLiteral(", ")) << " };\n"; + whitespace() << "static const char* const " << enumName(entry->param) << "ToString[];\n"; } else { - stream() << whitespace() << "class " << enumName(entry->param) << '\n'; - stream() << whitespace() << "{\n"; - stream() << whitespace() << " public:\n"; - stream() << whitespace() << " enum type { " << values.join(QStringLiteral(", ")) << ", COUNT };\n"; - stream() << whitespace() << " static const char* const enumToString[];\n"; - stream() << whitespace() << "};\n"; + whitespace() << "class " << enumName(entry->param) << '\n'; + whitespace() << "{\n"; + whitespace() << " public:\n"; + whitespace() << " enum type { " << values.join(QStringLiteral(", ")) << ", COUNT };\n"; + whitespace() << " static const char* const enumToString[];\n"; + whitespace() << "};\n"; } } @@ -255,25 +255,25 @@ // a last comma, as it's valid c++. for (int i = 0, end = parseResult.signalList.size(); i < end; i++) { auto signal = parseResult.signalList.at(i); - stream() << whitespace() << " " << signalEnumName(signal.name) << " = 0x" << hex << val; + whitespace() << " " << signalEnumName(signal.name) << " = 0x" << hex << val; if (i != end-1) { stream() << ",\n"; } val <<= 1; } stream() << '\n'; - stream() << whitespace() << "};" << dec << "\n\n"; + whitespace() << "};" << dec << "\n\n"; stream() << " Q_SIGNALS:"; for (const Signal &signal : parseResult.signalList) { stream() << '\n'; if (!signal.label.isEmpty()) { - stream() << whitespace() << "/**\n"; - stream() << whitespace() << " " << signal.label << '\n'; - stream() << whitespace() << "*/\n"; + whitespace() << "/**\n"; + whitespace() << " " << signal.label << '\n'; + whitespace() << "*/\n"; } - stream() << whitespace() << "void " << signal.name << "("; + whitespace() << "void " << signal.name << "("; QList::ConstIterator it, itEnd = signal.arguments.constEnd(); for (it = signal.arguments.constBegin(); it != itEnd;) { Param argument = *it; @@ -296,7 +296,7 @@ stream() << '\n'; stream() << " private:\n"; - stream() << whitespace() << "void itemChanged(quint64 flags);\n"; + whitespace() << "void itemChanged(quint64 flags);\n"; stream() << '\n'; } @@ -310,7 +310,7 @@ stream() << " private:\n"; for (const auto &entry : parseResult.entries) { if (cfg().allDefaultGetters || cfg().defaultGetters.contains(entry->name)) { - stream() << whitespace() << ""; + whitespace() << ""; if (cfg().staticAccessors) { stream() << "static "; } @@ -321,21 +321,21 @@ stream() << ")" << Const() << ";\n"; } } - stream() << whitespace() << "" << cfg().className << "Private *d;\n"; + whitespace() << "" << cfg().className << "Private *d;\n"; } void KConfigHeaderGenerator::createConstructor() { if (cfg().singleton) { - stream() << whitespace() << "static " << cfg().className << " *self();\n"; + whitespace() << "static " << cfg().className << " *self();\n"; if (parseResult.cfgFileNameArg) { - stream() << whitespace() << "static void instance(const QString& cfgfilename);\n"; - stream() << whitespace() << "static void instance(KSharedConfig::Ptr config);\n"; + whitespace() << "static void instance(const QString& cfgfilename);\n"; + whitespace() << "static void instance(KSharedConfig::Ptr config);\n"; } return; } - stream() << whitespace() << "" << cfg().className << "("; + whitespace() << "" << cfg().className << "("; if (parseResult.cfgFileNameArg) { if (cfg().forceStringFilename) stream() << " const QString &cfgfilename" << (parseResult.parameters.isEmpty() ? " = QString()" : ", "); @@ -365,7 +365,7 @@ void KConfigHeaderGenerator::createDestructor() { - stream() << whitespace() << "~" << cfg().className << "();\n\n"; + whitespace() << "~" << cfg().className << "();\n\n"; } void KConfigHeaderGenerator::createForwardDeclarations() @@ -381,7 +381,7 @@ if (!cfg().generateProperties) { return; } - stream() << whitespace() << "Q_PROPERTY(" << returnType << ' ' << getFunction(entry->name); + whitespace() << "Q_PROPERTY(" << returnType << ' ' << getFunction(entry->name); stream() << " READ " << getFunction(entry->name); if (cfg().allMutators || cfg().mutators.contains(entry->name)) { @@ -408,15 +408,15 @@ return; } - stream() << whitespace() << "/**\n"; - stream() << whitespace() << " Set " << entry->label << '\n'; - stream() << whitespace() << "*/\n"; + whitespace() << "/**\n"; + whitespace() << " Set " << entry->label << '\n'; + whitespace() << "*/\n"; if (cfg().staticAccessors) { - stream() << whitespace() << "static\n"; + whitespace() << "static\n"; } - stream() << whitespace() << "void " << setFunction(entry->name) << "( "; + whitespace() << "void " << setFunction(entry->name) << "( "; if (!entry->param.isEmpty()) { stream() <paramType) << " i, "; } @@ -443,13 +443,13 @@ void KConfigHeaderGenerator::createGetters(const CfgEntry *entry, const QString &returnType) { // Accessor - stream() << whitespace() << "/**\n"; - stream() << whitespace() << " Get " << entry->label << '\n'; - stream() << whitespace() << "*/\n"; + whitespace() << "/**\n"; + whitespace() << " Get " << entry->label << '\n'; + whitespace() << "*/\n"; if (cfg().staticAccessors) { - stream() << whitespace() << "static\n"; + whitespace() << "static\n"; } - stream() << whitespace() << ""; + whitespace() << ""; stream() << returnType; stream() << " " << getFunction(entry->name) << "("; if (!entry->param.isEmpty()) { @@ -462,7 +462,7 @@ if (!cfg().dpointer) { stream() << '\n'; startScope(); - stream() << whitespace() << memberAccessorBody(entry, cfg().globalEnums); + whitespace() << memberAccessorBody(entry, cfg().globalEnums); endScope(); stream() << '\n'; } else { @@ -476,20 +476,20 @@ if (!cfg().itemAccessors) { return; } - stream() << whitespace() << "/**\n"; - stream() << whitespace() << " Get Item object corresponding to " << entry->name << "()" + whitespace() << "/**\n"; + whitespace() << " Get Item object corresponding to " << entry->name << "()" << '\n'; - stream() << whitespace() << "*/\n"; - stream() << whitespace() << "Item" << itemType(entry->type) << " *" + whitespace() << "*/\n"; + whitespace() << "Item" << itemType(entry->type) << " *" << getFunction(entry->name) << "Item("; if (!entry->param.isEmpty()) { stream() << " " << cppType(entry->paramType) << " i "; } stream() << ")"; if (!cfg().dpointer) { stream() << '\n'; startScope(); - stream() << whitespace() << itemAccessorBody(entry, cfg()); + whitespace() << itemAccessorBody(entry, cfg()); endScope(); } else { stream() << ";\n"; @@ -504,13 +504,13 @@ if (! ((cfg().allDefaultGetters || cfg().defaultGetters.contains(entry->name)) && !entry->defaultValue.isEmpty())) { return; } - stream() << whitespace() << "/**\n"; - stream() << whitespace() << " Get " << entry->label << " default value\n"; - stream() << whitespace() << "*/\n"; + whitespace() << "/**\n"; + whitespace() << " Get " << entry->label << " default value\n"; + whitespace() << "*/\n"; if (cfg().staticAccessors) { - stream() << whitespace() << "static\n"; + whitespace() << "static\n"; } - stream() << whitespace() << ""; + whitespace() << ""; if (cfg().useEnumTypes && entry->type == QLatin1String("Enum")) { stream() << enumType(entry, cfg().globalEnums); } else { @@ -521,8 +521,8 @@ stream() << " " << cppType(entry->paramType) << " i "; } stream() << ")" << Const() << '\n'; - stream() << whitespace() << "{\n"; - stream() << whitespace() << " return "; + whitespace() << "{\n"; + whitespace() << " return "; if (cfg().useEnumTypes && entry->type == QLatin1String("Enum")) { stream() << "static_cast<" << enumType(entry, cfg().globalEnums) << ">("; } @@ -535,7 +535,7 @@ stream() << ")"; } stream() << ";\n"; - stream() << whitespace() << "}\n"; + whitespace() << "}\n"; stream() << '\n'; } @@ -546,7 +546,7 @@ return; } - stream() << whitespace() << "" << cfg().className << "("; + whitespace() << "" << cfg().className << "("; if (parseResult.cfgFileNameArg) { stream() << "KSharedConfig::Ptr config"; } @@ -557,7 +557,7 @@ stream() << "QObject *parent = nullptr"; } stream() << ");\n"; - stream() << whitespace() << "friend class " << cfg().className << "Helper;\n\n"; + whitespace() << "friend class " << cfg().className << "Helper;\n\n"; } void KConfigHeaderGenerator::createNonDPointerHelpers() @@ -571,16 +571,16 @@ if (entry->group != group) { group = entry->group; stream() << '\n'; - stream() << whitespace() << "// " << group << '\n'; + whitespace() << "// " << group << '\n'; } - stream() << whitespace() << "" << cppType(entry->type) << " " << varName(entry->name, cfg()); + whitespace() << "" << cppType(entry->type) << " " << varName(entry->name, cfg()); if (!entry->param.isEmpty()) { stream() << QStringLiteral("[%1]").arg(entry->paramMax + 1); } stream() << ";\n"; if (cfg().allDefaultGetters || cfg().defaultGetters.contains(entry->name)) { - stream() << whitespace() << ""; + whitespace() << ""; if (cfg().staticAccessors) { stream() << "static "; } @@ -595,15 +595,15 @@ stream() << "\n private:\n"; if (cfg().itemAccessors) { for (auto *entry : parseResult.entries) { - stream() << whitespace() << "Item" << itemType(entry->type) << " *" << itemVar(entry, cfg()); + whitespace() << "Item" << itemType(entry->type) << " *" << itemVar(entry, cfg()); if (!entry->param.isEmpty()) { stream() << QStringLiteral("[%1]").arg(entry->paramMax + 1); } stream() << ";\n"; } } if (parseResult.hasNonModifySignals) { - stream() << whitespace() << "uint " << varName(QStringLiteral("settingsChanged"), cfg()) << ";\n"; + whitespace() << "uint " << varName(QStringLiteral("settingsChanged"), cfg()) << ";\n"; } }