KConfig

KConfigCodeGeneratorBase.h
1 /*
2  This file is part of KDE.
3 
4  SPDX-FileCopyrightText: 2003 Cornelius Schumacher <schumacher@kde.org>
5  SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org>
6  SPDX-FileCopyrightText: 2003 Zack Rusin <zack@kde.org>
7  SPDX-FileCopyrightText: 2006 MichaĆ«l Larouche <michael.larouche@kdemail.net>
8  SPDX-FileCopyrightText: 2008 Allen Winter <winter@kde.org>
9  SPDX-FileCopyrightText: 2020 Tomaz Cananbrava <tcanabrava@kde.org>
10 
11  SPDX-License-Identifier: LGPL-2.0-or-later
12 */
13 
14 #ifndef KCONFIGCODEGENERATORBASE_H
15 #define KCONFIGCODEGENERATORBASE_H
16 
17 #include <QFile>
18 #include <QList>
19 #include <QString>
20 #include <QTextStream>
21 
22 #include "KConfigCommonStructs.h"
23 #include "KConfigParameters.h"
24 
25 class CfgEntry;
26 struct ParseResult;
27 
28 /* This class manages the base of writing a C - Based code */
29 class KConfigCodeGeneratorBase
30 {
31 public:
32  enum ScopeFinalizer {
33  None,
34  Semicolon,
35  };
36 
37  KConfigCodeGeneratorBase(const QString &inputFileName, // The kcfg file
38  const QString &baseDir, // where we should store the generated file
39  const QString &fileName, // the name of the generated file
40  const KConfigParameters &parameters, // parameters passed to the generator
41  ParseResult &parseResult // The pre processed configuration entries
42  );
43  virtual ~KConfigCodeGeneratorBase();
44 
45  // iterates over the header list adding an #include directive.
46  void addHeaders(const QStringList &header);
47 
48  // Create all the namespace indentation levels based on the parsed result and parameters */
49  void beginNamespaces();
50 
51  // Closes all the namespaces adding lines with single '}'
52  void endNamespaces();
53 
54  // Add the correct amount of whitespace in the code.
55  QString whitespace() const;
56 
57  // start a block scope `{` and increase indentation level.
58  void endScope(ScopeFinalizer finalizer = None);
59 
60  // end a block scope `}` and decrease indentation level.
61  void startScope();
62 
63  // start writing to the output file
64  virtual void start();
65 
66  // save the result on the disk
67  void save();
68 
69  // Code Implementations
70  // Implements the `Get` methods for the CfgEntry
71  // TODO: write to the stream directly without returning a QString.
72  QString memberAccessorBody(const CfgEntry *e, bool globalEnums) const;
73 
74  // Implements the is<Param>Immutable for the CfgEntry
75  void memberImmutableBody(const CfgEntry *e, bool globalEnums);
76 
77  // Implements the `Set` methods for the CfgEntry
78  void memberMutatorBody(const CfgEntry *e);
79 
80  // This is the code that creates the logic for the Setter / Mutator.
81  // It *just* creates the if test, no body. The reason is that just
82  // the if test was more than 20 lines of code and hard to understand
83  // what was happening in a bigger function.
84  void createIfSetLogic(const CfgEntry *e, const QString &varExpression);
85 
86 protected:
87  /* advance the number of spaces for the indentation level */
88  void indent();
89 
90  /* reduce the number of spaces for the indentation level */
91  void unindent();
92 
93  QString inputFile() const
94  {
95  return m_inputFile;
96  }
97  QString fileName() const
98  {
99  return m_fileName;
100  }
101  QString baseDir() const
102  {
103  return m_baseDir;
104  }
105  QString This() const
106  {
107  return m_this;
108  }
109  QString Const() const
110  {
111  return m_const;
112  }
113  KConfigParameters cfg() const
114  {
115  return m_cfg;
116  }
117 
118  // Can't be const.
119  QTextStream &stream()
120  {
121  return m_stream;
122  }
123 
124  // HACK: This needs to be accessible because the HeaderGenerator actually modifies
125  // it while running. Considering that this is a the result of the xml Parse, and not
126  // the result of generating code, I consider this to be quite wrong - but moving the
127  // changes away from the header generator only created more problems and I have to
128  // investigate more.
129  ParseResult &parseResult; // the result of the parsed kcfg file
130 
131 private:
132  QString m_inputFile; // the base file name, input file is based on this.
133 
134  QString m_baseDir; // Where we are going to save the file
135  QString m_fileName; // The file name
136 
137  KConfigParameters m_cfg; // The parameters passed via the kcfgc file
138  QTextStream m_stream; // the stream that operates in the file to write data.
139  QFile m_file; // The file handler.
140 
141  // Special access to `this->` and `const` thru the code.
142  QString m_this;
143  QString m_const;
144  int m_indentLevel = 0;
145 };
146 
147 #endif
Configuration Compiler Configuration.
Q_SCRIPTABLE Q_NOREPLY void start()
QAction * save(const QObject *recvr, const char *slot, QObject *parent)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Thu Feb 15 2024 04:07:59 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.