aboutsummaryrefslogtreecommitdiff
path: root/src/kconfig_compiler/KConfigCodeGeneratorBase.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kconfig_compiler/KConfigCodeGeneratorBase.h')
-rw-r--r--src/kconfig_compiler/KConfigCodeGeneratorBase.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/kconfig_compiler/KConfigCodeGeneratorBase.h b/src/kconfig_compiler/KConfigCodeGeneratorBase.h
new file mode 100644
index 00000000..5bbc6b71
--- /dev/null
+++ b/src/kconfig_compiler/KConfigCodeGeneratorBase.h
@@ -0,0 +1,134 @@
+/*
+ This file is part of KDE.
+
+ Copyright (C) 2020 Tomaz Cananbrava (tcanabrava@kde.org)
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (c) 2003 Zack Rusin <zack@kde.org>
+ Copyright (c) 2006 Michaƫl Larouche <michael.larouche@kdemail.net>
+ Copyright (c) 2008 Allen Winter <winter@kde.org>
+ Copyright (C) 2020 Tomaz Cananbrava (tcanabrava@kde.org)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCONFIGCODEGENERATORBASE_H
+#define KCONFIGCODEGENERATORBASE_H
+
+#include <QString>
+#include <QTextStream>
+#include <QFile>
+#include <QVector>
+
+#include "KConfigParameters.h"
+#include "KConfigCommonStructs.h"
+
+class CfgEntry;
+struct ParseResult;
+
+/* This class manages the base of writing a C - Based code */
+class KConfigCodeGeneratorBase {
+public:
+ enum ScopeFinalizer {None, Semicolon};
+
+ KConfigCodeGeneratorBase(
+ const QString &inputFileName, // The kcfg file
+ const QString &baseDir, // where we should store the generated file
+ const QString &fileName, // the name of the generated file
+ const KConfigParameters &parameters, // parameters passed to the generator
+ ParseResult &parseResult // The pre processed configuration entries
+ );
+ virtual ~KConfigCodeGeneratorBase();
+
+ // iterates over the header list adding an #include directive.
+ void addHeaders(const QStringList &header);
+
+ // Create all the namespace indentation levels based on the parsed result and parameters */
+ void beginNamespaces();
+
+ // Closes all the namespaces adding lines with single '}'
+ void endNamespaces();
+
+ // Add the correct amount of whitespace in the code.
+ QString whitespace() const;
+
+ // start a block scope `{` and increase indentation level.
+ void endScope(ScopeFinalizer finalizer = None);
+
+ // end a block scope `}` and decrease indentation level.
+ void startScope();
+
+ // start writing to the output file
+ virtual void start();
+
+ // save the result on the disk
+ void save();
+
+ // Code Implementations
+ // Implements the `Get` methods for the CfgEntry
+ // TODO: write to the stream directly without returning a QString.
+ QString memberAccessorBody(const CfgEntry *e, bool globalEnums) const;
+
+ // Implements the `Set` methods for the CfgEntry
+ void memberMutatorBody(const CfgEntry *e);
+
+ // This is the code that creates the logic for the Setter / Mutator.
+ // It *just* creates the if test, no body. The reason is that just
+ // the if test was more than 20 lines of code and hard to understand
+ // what was happening in a bigger function.
+ void createIfSetLogic(const CfgEntry *e, const QString &varExpression);
+
+protected:
+ /* advance the number of spaces for the indentation level */
+ void indent();
+
+ /* reduce the number of spaces for the indentation level */
+ void unindent();
+
+ QString inputFile() const { return m_inputFile; }
+ QString fileName() const { return m_fileName; }
+ QString baseDir() const { return m_baseDir; }
+ QString This() const { return m_this; }
+ QString Const() const { return m_const; }
+ KConfigParameters cfg() const { return m_cfg; }
+
+ // Can't be const.
+ QTextStream& stream() { return m_stream; }
+
+ // HACK: This needs to be accesible because the HeaderGenerator actually modifies
+ // it while running. Considering that this is a the result of the xml Parse, and not
+ // the result of generating code, I consider this to be quite wrong - but moving the
+ // changes away from the header generator only created more problems and I have to
+ // investigate more.
+ ParseResult &parseResult; // the result of the parsed kcfg file
+
+private:
+ QString m_inputFile; // the base file name, input file is based on this.
+
+ QString m_baseDir; // Where we are going to save the file
+ QString m_fileName; // The file name
+
+ KConfigParameters m_cfg; // The parameters passed via the kcfgc file
+ QTextStream m_stream; // the stream that operates in the file to write data.
+ QFile m_file; // The file handler.
+
+ // Special access to `this->` and `const` thru the code.
+ QString m_this;
+ QString m_const;
+ int m_indentLevel = 0;
+};
+
+#endif