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";
}
}