diff options
Diffstat (limited to 'src/kconfig_compiler/KConfigCodeGeneratorBase.h')
-rw-r--r-- | src/kconfig_compiler/KConfigCodeGeneratorBase.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/kconfig_compiler/KConfigCodeGeneratorBase.h b/src/kconfig_compiler/KConfigCodeGeneratorBase.h new file mode 100644 index 00000000..fdf3b7e3 --- /dev/null +++ b/src/kconfig_compiler/KConfigCodeGeneratorBase.h @@ -0,0 +1,118 @@ +/* + 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 "KConfigXTParameters.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 KConfigXTParameters ¶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(); + + // 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; // the base file name, input file is based on this. + + QString baseDir; // Where we are going to save the file + QString fileName; // The file name + + const KConfigXTParameters &cfg; // The parameters passed via the kcfgc file + ParseResult &parseResult; // the result of the parsed kcfg file + QTextStream stream; // the stream that operates in the file to write data. + QFile file; // The file handler. + + // Special access to `this->` and `const` thru the code. + QString This; + QString Const; + +private: + int indentLevel = 0; +}; + +#endif |