Skip to content

Commit 19926ab

Browse files
shiboken6: Refactor class generation to allow for flexible handling of inner classes
Extract a separate overload Generator::generateSmartPointerClass() for smart pointers. Generator::generateClass() gets a new context list parameter by pointer. It allows the generators to handle inner lasses directly and remove them from the list. This is useful for the doc generator. Pick-to: 6.8 Task-number: PYSIDE-1106 Change-Id: I06bf1d23c69b81ea3ad8535eacc0d402045e607e Reviewed-by: Cristian Maureira-Fredes <[email protected]>
1 parent e8f8c74 commit 19926ab

9 files changed

+78
-50
lines changed

sources/shiboken6/generator/generator.cpp

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -234,26 +234,16 @@ void Generator::setOutputDirectory(const QString &outDir)
234234
m_d->outDir = outDir;
235235
}
236236

237-
bool Generator::generateFileForContext(const GeneratorContext &context)
237+
QString Generator::directoryForContext(const GeneratorContext &context) const
238238
{
239-
const auto cls = context.metaClass();
240-
auto typeEntry = cls->typeEntry();
241-
242-
if (!shouldGenerate(typeEntry))
243-
return true;
244-
245-
const QString fileName = fileNameForContext(context);
246-
if (fileName.isEmpty())
247-
return true;
248-
249-
const QString targetDirectory = outputDirectory() + u'/'
250-
+ subDirectoryForPackage(typeEntry->targetLangPackage());
251-
FileOut fileOut(targetDirectory + u'/' + fileName);
252-
253-
generateClass(fileOut.stream, targetDirectory, context);
239+
return m_d->outDir + u'/'
240+
+ subDirectoryForPackage(context.metaClass()->typeEntry()->targetLangPackage());
241+
}
254242

255-
fileOut.done();
256-
return true;
243+
void Generator::generateSmartPointerClass(TextStream &,
244+
const QString &,
245+
const GeneratorContext &)
246+
{
257247
}
258248

259249
QString Generator::getFileNameBaseForSmartPointer(const AbstractMetaType &smartPointerType)
@@ -290,22 +280,38 @@ GeneratorContext
290280

291281
bool Generator::generate()
292282
{
283+
QList<GeneratorContext> contexts;
284+
contexts.reserve(m_d->api.classes().size());
285+
293286
for (const auto &cls : m_d->api.classes()) {
294-
if (!generateFileForContext(contextForClass(cls)))
295-
return false;
296287
auto te = cls->typeEntry();
297-
if (shouldGenerate(te) && te->isPrivate())
298-
m_d->m_hasPrivateClasses = true;
288+
if (shouldGenerate(te)) {
289+
contexts.append(contextForClass(cls));
290+
if (te->isPrivate())
291+
m_d->m_hasPrivateClasses = true;
292+
}
293+
}
294+
295+
while (!contexts.isEmpty()) {
296+
const auto context = contexts.takeFirst();
297+
const QString targetDirectory = directoryForContext(context);
298+
FileOut fileOut(targetDirectory + u'/' + fileNameForContext(context));
299+
generateClass(fileOut.stream, targetDirectory, context, &contexts);
300+
fileOut.done();
299301
}
300302

303+
// Generate smart pointers.
301304
for (const auto &smp: m_d->api.instantiatedSmartPointers()) {
302-
AbstractMetaClassCPtr pointeeClass;
303-
const auto instantiatedType = smp.type.instantiations().constFirst().typeEntry();
304-
if (instantiatedType->isComplex()) // not a C++ primitive
305-
pointeeClass = AbstractMetaClass::findClass(m_d->api.classes(), instantiatedType);
306-
if (!generateFileForContext(contextForSmartPointer(smp.specialized, smp.type,
307-
pointeeClass))) {
308-
return false;
305+
if (shouldGenerate(smp.specialized->typeEntry())) {
306+
AbstractMetaClassCPtr pointeeClass;
307+
const auto instantiatedType = smp.type.instantiations().constFirst().typeEntry();
308+
if (instantiatedType->isComplex()) // not a C++ primitive
309+
pointeeClass = AbstractMetaClass::findClass(m_d->api.classes(), instantiatedType);
310+
const auto context = contextForSmartPointer(smp.specialized, smp.type, pointeeClass);
311+
const QString targetDirectory = directoryForContext(context);
312+
FileOut fileOut(targetDirectory + u'/' + fileNameForContext(context));
313+
generateSmartPointerClass(fileOut.stream, targetDirectory, context);
314+
fileOut.done();
309315
}
310316
}
311317
return finishGeneration();

sources/shiboken6/generator/generator.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,6 @@ class Generator
141141
contextForSmartPointer(const AbstractMetaClassCPtr &c, const AbstractMetaType &t,
142142
const AbstractMetaClassCPtr &pointeeClass = {});
143143

144-
/// Generates a file for given AbstractMetaClass or AbstractMetaType (smart pointer case).
145-
bool generateFileForContext(const GeneratorContext &context);
146-
147144
/// Returns the file base name for a smart pointer.
148145
static QString getFileNameBaseForSmartPointer(const AbstractMetaType &smartPointerType);
149146

@@ -206,14 +203,18 @@ class Generator
206203
virtual bool doSetup() = 0;
207204

208205
/**
209-
* Write the bindding code for an AbstractMetaClass.
206+
* Write the binding code for an AbstractMetaClass.
210207
* This is called by generate method.
211208
* \param s text stream to write the generated output
212209
* \param metaClass the class that should be generated
213210
*/
214211
virtual void generateClass(TextStream &s,
215212
const QString &targetDir,
216-
const GeneratorContext &classContext) = 0;
213+
const GeneratorContext &classContext,
214+
QList<GeneratorContext> *contexts) = 0;
215+
virtual void generateSmartPointerClass(TextStream &s,
216+
const QString &targetDir,
217+
const GeneratorContext &classContext);
217218
virtual bool finishGeneration() = 0;
218219

219220
/**
@@ -233,6 +234,8 @@ class Generator
233234
static QString m_gsp;
234235

235236
private:
237+
QString directoryForContext(const GeneratorContext &context) const;
238+
236239
struct GeneratorPrivate;
237240
GeneratorPrivate *m_d;
238241
};

sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,9 +427,11 @@ static void writeInheritedFromList(TextStream &s, const AbstractMetaClassCPtr &m
427427
}
428428

429429
void QtDocGenerator::generateClass(TextStream &s, const QString &targetDir,
430-
const GeneratorContext &classContext)
430+
const GeneratorContext &classContext,
431+
QList<GeneratorContext> *contexts)
431432
{
432433
Q_UNUSED(targetDir)
434+
Q_UNUSED(contexts)
433435
AbstractMetaClassCPtr metaClass = classContext.metaClass();
434436
qCDebug(lcShibokenDoc).noquote().nospace() << "Generating Documentation for " << metaClass->fullName();
435437

sources/shiboken6/generator/qtdoc/qtdocgenerator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class QtDocGenerator : public Generator, public QtXmlToSphinxDocGeneratorInterfa
5959
static QString fileNameSuffix();
6060
QString fileNameForContext(const GeneratorContext &context) const override;
6161
void generateClass(TextStream &ts, const QString &targetDir,
62-
const GeneratorContext &classContext) override;
62+
const GeneratorContext &classContext,
63+
QList<GeneratorContext> *contexts) override;
6364
bool finishGeneration() override;
6465

6566
private:

sources/shiboken6/generator/shiboken/cppgenerator.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -622,13 +622,9 @@ static void writeAddedTypeSignatures(TextStream &s, const ComplexTypeEntryCPtr &
622622
/// \param classContext the pointer to metaclass information
623623
void CppGenerator::generateClass(TextStream &s,
624624
const QString & /* targetDir */,
625-
const GeneratorContext &classContext)
625+
const GeneratorContext &classContext,
626+
QList<GeneratorContext> *)
626627
{
627-
if (classContext.forSmartPointer()) {
628-
generateSmartPointerClass(s, classContext);
629-
return;
630-
}
631-
632628
s.setLanguage(TextStream::Language::Cpp);
633629
AbstractMetaClassCPtr metaClass = classContext.metaClass();
634630
const auto typeEntry = metaClass->typeEntry();

sources/shiboken6/generator/shiboken/cppgenerator.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ class CppGenerator : public ShibokenGenerator
4747
protected:
4848
QString fileNameForContext(const GeneratorContext &context) const override;
4949
void generateClass(TextStream &s, const QString &targetDir,
50-
const GeneratorContext &classContext) override;
50+
const GeneratorContext &classContext,
51+
QList<GeneratorContext> *contexts) override;
52+
void generateSmartPointerClass(TextStream &s, const QString &targetDir,
53+
const GeneratorContext &classContext) override;
5154
bool finishGeneration() override;
5255

5356
private:
@@ -57,8 +60,6 @@ class CppGenerator : public ShibokenGenerator
5760
bool needsReference = false;
5861
};
5962

60-
61-
void generateSmartPointerClass(TextStream &s, const GeneratorContext &classContext);
6263
void generateIncludes(TextStream &s, const GeneratorContext &classContext,
6364
const IncludeGroupList &includes = {},
6465
const AbstractMetaClassCList &innerClasses = {}) const;

sources/shiboken6/generator/shiboken/cppgenerator_smartpointer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ static bool hasParameterPredicate(const AbstractMetaFunctionCPtr &f)
9191
return !f->arguments().isEmpty();
9292
}
9393

94-
void CppGenerator::generateSmartPointerClass(TextStream &s, const GeneratorContext &classContext)
94+
void CppGenerator::generateSmartPointerClass(TextStream &s,
95+
const QString & /* targetDir */,
96+
const GeneratorContext &classContext)
9597
{
9698
s.setLanguage(TextStream::Language::Cpp);
9799
AbstractMetaClassCPtr metaClass = classContext.metaClass();

sources/shiboken6/generator/shiboken/headergenerator.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,21 @@ static void writeProtectedEnums(TextStream &s, const AbstractMetaClassCPtr &meta
109109
}
110110
}
111111

112-
void HeaderGenerator::generateClass(TextStream &s,
113-
const QString & /* targetDir */,
114-
const GeneratorContext &classContext)
112+
void HeaderGenerator::generateClass(TextStream &s, const QString &,
113+
const GeneratorContext &classContext,
114+
QList<GeneratorContext> *)
115+
{
116+
doGenerateClass(s, classContext);
117+
}
118+
119+
void HeaderGenerator::generateSmartPointerClass(TextStream &s,
120+
const QString &,
121+
const GeneratorContext &classContext)
122+
{
123+
doGenerateClass(s, classContext);
124+
}
125+
126+
void HeaderGenerator::doGenerateClass(TextStream &s, const GeneratorContext &classContext) const
115127
{
116128
const AbstractMetaClassCPtr metaClass = classContext.metaClass();
117129

sources/shiboken6/generator/shiboken/headergenerator.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,18 @@ class HeaderGenerator : public ShibokenGenerator
2828
protected:
2929
QString fileNameForContext(const GeneratorContext &context) const override;
3030
void generateClass(TextStream &s, const QString &targetDir,
31-
const GeneratorContext &classContext) override;
31+
const GeneratorContext &classContext,
32+
QList<GeneratorContext> *contexts) override;
33+
void generateSmartPointerClass(TextStream &s,
34+
const QString &targetDir,
35+
const GeneratorContext &classContext) override;
3236
bool finishGeneration() override;
3337

3438
private:
3539
using InheritedOverloadSet = QSet<AbstractMetaFunctionCPtr>;
3640
using IndexValues = QList<IndexValue>;
3741

42+
void doGenerateClass(TextStream &s, const GeneratorContext &classContext) const;
3843
IndexValues collectTypeIndexes(const AbstractMetaClassCList &classList);
3944
IndexValues collectConverterIndexes() const;
4045

0 commit comments

Comments
 (0)