diff options
Diffstat (limited to 'src/kconfig_compiler/KConfigCodeGeneratorBase.h')
-rw-r--r-- | src/kconfig_compiler/KConfigCodeGeneratorBase.h | 134 |
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 ¶meters, // 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 |