aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-01-17 13:27:40 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-01-17 19:05:12 +0100
commit676c6641d1bda430876e49c92d7814b60b35f885 (patch)
tree27ae1286ed23bf4db9eb0bc95197f95d4fbc3500
parent897e04fa431d8dc0385007862b4a619d5d0aac0c (diff)
shiboken6: Pass more generator options to the api extractor
Introduce flags representing generator options and pass AvoidProtectedHack besides UsePySideExtensions. Move AvoidProtectedHack to the Generator base class for this purpose. Pick-to: 6.2 Change-Id: I170b5ace30057c4074d73afce3f88d086eb54775 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp6
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.h2
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder_p.h2
-rw-r--r--sources/shiboken6/ApiExtractor/apiextractor.cpp11
-rw-r--r--sources/shiboken6/ApiExtractor/apiextractor.h5
-rw-r--r--sources/shiboken6/ApiExtractor/apiextractorflags.h43
-rw-r--r--sources/shiboken6/generator/generator.cpp11
-rw-r--r--sources/shiboken6/generator/generator.h3
-rw-r--r--sources/shiboken6/generator/main.cpp9
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.cpp10
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.h3
11 files changed, 79 insertions, 26 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
index e2d16865c..0ad32fec1 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
@@ -443,7 +443,8 @@ static QStringList functionCandidates(const AbstractMetaFunctionCList &list,
return result;
}
-void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
+void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom,
+ ApiExtractorFlags flags)
{
const TypeDatabase *types = TypeDatabase::instance();
@@ -667,6 +668,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
}
bool AbstractMetaBuilder::build(const QByteArrayList &arguments,
+ ApiExtractorFlags apiExtractorFlags,
bool addCompilerSupportArguments,
LanguageLevel level,
unsigned clangFlags)
@@ -677,7 +679,7 @@ bool AbstractMetaBuilder::build(const QByteArrayList &arguments,
return false;
if (ReportHandler::isDebug(ReportHandler::MediumDebug))
qCDebug(lcShiboken) << dom.data();
- d->traverseDom(dom);
+ d->traverseDom(dom, apiExtractorFlags);
return true;
}
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.h b/sources/shiboken6/ApiExtractor/abstractmetabuilder.h
index c3e427965..c52280958 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.h
+++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.h
@@ -30,6 +30,7 @@
#define ABSTRACTMETABUILDER_H
#include "abstractmetalang_typedefs.h"
+#include "apiextractorflags.h"
#include "header_paths.h"
#include "typesystem_enums.h"
@@ -73,6 +74,7 @@ public:
const QHash<const TypeEntry *, AbstractMetaEnum> &typeEntryToEnumsHash() const;
bool build(const QByteArrayList &arguments,
+ ApiExtractorFlags apiExtractorFlags = {},
bool addCompilerSupportArguments = true,
LanguageLevel level = LanguageLevel::Default,
unsigned clangFlags = 0);
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken6/ApiExtractor/abstractmetabuilder_p.h
index 7a6d4a7a1..f192749d8 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetabuilder_p.h
+++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder_p.h
@@ -66,7 +66,7 @@ public:
bool addCompilerSupportArguments,
LanguageLevel level,
unsigned clangFlags);
- void traverseDom(const FileModelItem &dom);
+ void traverseDom(const FileModelItem &dom, ApiExtractorFlags flags);
void dumpLog() const;
static AbstractMetaClassList classesTopologicalSorted(const AbstractMetaClassList &classList,
diff --git a/sources/shiboken6/ApiExtractor/apiextractor.cpp b/sources/shiboken6/ApiExtractor/apiextractor.cpp
index cee8bbdcd..2535b0746 100644
--- a/sources/shiboken6/ApiExtractor/apiextractor.cpp
+++ b/sources/shiboken6/ApiExtractor/apiextractor.cpp
@@ -171,7 +171,7 @@ static void addPySideExtensions(QByteArrayList *a)
a->append(QByteArrayLiteral("-DQSIMD_H"));
}
-bool ApiExtractor::runHelper(bool usePySideExtensions)
+bool ApiExtractor::runHelper(ApiExtractorFlags flags)
{
if (m_builder)
return false;
@@ -229,10 +229,11 @@ bool ApiExtractor::runHelper(bool usePySideExtensions)
<< "\nclang arguments: " << arguments;
}
- if (usePySideExtensions)
+ if (flags.testFlag(ApiExtractorFlag::UsePySideExtensions))
addPySideExtensions(&arguments);
- const bool result = m_builder->build(arguments, addCompilerSupportArguments, m_languageLevel);
+ const bool result = m_builder->build(arguments, flags, addCompilerSupportArguments,
+ m_languageLevel);
if (!result)
autoRemove = false;
if (!autoRemove) {
@@ -248,9 +249,9 @@ static inline void classListToCList(const AbstractMetaClassList &list, AbstractM
std::copy(list.cbegin(), list.cend(), std::back_inserter(*target));
}
-std::optional<ApiExtractorResult> ApiExtractor::run(bool usePySideExtensions)
+std::optional<ApiExtractorResult> ApiExtractor::run(ApiExtractorFlags flags)
{
- if (!runHelper(usePySideExtensions))
+ if (!runHelper(flags))
return {};
ApiExtractorResult result;
classListToCList(m_builder->classes(), &result.m_metaClasses);
diff --git a/sources/shiboken6/ApiExtractor/apiextractor.h b/sources/shiboken6/ApiExtractor/apiextractor.h
index f7e3685f5..193893e31 100644
--- a/sources/shiboken6/ApiExtractor/apiextractor.h
+++ b/sources/shiboken6/ApiExtractor/apiextractor.h
@@ -30,6 +30,7 @@
#define APIEXTRACTOR_H
#include "abstractmetalang_typedefs.h"
+#include "apiextractorflags.h"
#include "header_paths.h"
#include "typedatabase_typedefs.h"
#include "typesystem_typedefs.h"
@@ -91,10 +92,10 @@ public:
const AbstractMetaClassList &classes() const;
const AbstractMetaClassList &smartPointers() const;
- std::optional<ApiExtractorResult> run(bool usePySideExtensions);
+ std::optional<ApiExtractorResult> run(ApiExtractorFlags flags);
private:
- bool runHelper(bool usePySideExtensions);
+ bool runHelper(ApiExtractorFlags flags);
QString m_typeSystemFileName;
QFileInfoList m_cppFileNames;
diff --git a/sources/shiboken6/ApiExtractor/apiextractorflags.h b/sources/shiboken6/ApiExtractor/apiextractorflags.h
new file mode 100644
index 000000000..8803a003b
--- /dev/null
+++ b/sources/shiboken6/ApiExtractor/apiextractorflags.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2022 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt for Python.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef APIEXTRACTORFLAGS_H
+#define APIEXTRACTORFLAGS_H
+
+#include <QtCore/QFlags>
+
+enum class ApiExtractorFlag
+{
+ UsePySideExtensions = 0x1,
+ AvoidProtectedHack = 0x2
+};
+
+Q_DECLARE_FLAGS(ApiExtractorFlags, ApiExtractorFlag)
+Q_DECLARE_OPERATORS_FOR_FLAGS(ApiExtractorFlags)
+
+#endif // APIEXTRACTORFLAGS_H
diff --git a/sources/shiboken6/generator/generator.cpp b/sources/shiboken6/generator/generator.cpp
index 49652a94d..2b25e300a 100644
--- a/sources/shiboken6/generator/generator.cpp
+++ b/sources/shiboken6/generator/generator.cpp
@@ -48,6 +48,7 @@
#include <typedatabase.h>
static const char ENABLE_PYSIDE_EXTENSIONS[] = "enable-pyside-extensions";
+static const char AVOID_PROTECTED_HACK[] = "avoid-protected-hack";
/**
* DefaultValue is used for storing default values of types for which code is
@@ -181,6 +182,7 @@ struct Generator::GeneratorPrivate
AbstractMetaClassCList m_invisibleTopNamespaces;
bool m_hasPrivateClasses = false;
bool m_usePySideExtensions = false;
+ bool m_avoidProtectedHack = false;
};
Generator::Generator() : m_d(new GeneratorPrivate)
@@ -358,6 +360,8 @@ AbstractMetaTypeList Generator::instantiatedSmartPointers() const
Generator::OptionDescriptions Generator::options() const
{
return {
+ {QLatin1String(AVOID_PROTECTED_HACK),
+ u"Avoid the use of the '#define protected public' hack."_qs},
{QLatin1String(ENABLE_PYSIDE_EXTENSIONS),
u"Enable PySide extensions, such as support for signal/slots,\n"
"use this if you are creating a binding for a Qt-based library."_qs}
@@ -368,6 +372,8 @@ bool Generator::handleOption(const QString & key, const QString & /* value */)
{
if (key == QLatin1String(ENABLE_PYSIDE_EXTENSIONS))
return ( m_d->m_usePySideExtensions = true);
+ if (key == QLatin1String(AVOID_PROTECTED_HACK))
+ return (m_d->m_avoidProtectedHack = true);
return false;
}
@@ -532,6 +538,11 @@ bool Generator::usePySideExtensions() const
return m_d->m_usePySideExtensions;
}
+bool Generator::avoidProtectedHack() const
+{
+ return m_d->m_avoidProtectedHack;
+}
+
QString Generator::getFullTypeName(const TypeEntry *type)
{
QString result = type->qualifiedCppName();
diff --git a/sources/shiboken6/generator/generator.h b/sources/shiboken6/generator/generator.h
index 62c5e5aeb..6d10dcb1f 100644
--- a/sources/shiboken6/generator/generator.h
+++ b/sources/shiboken6/generator/generator.h
@@ -241,6 +241,9 @@ public:
/// Returns true if the user enabled PySide extensions (command line option)
bool usePySideExtensions() const;
+ /// Returns true if the generated code should not use the
+ /// "#define protected public" hack.
+ bool avoidProtectedHack() const;
/**
* Retrieves the name of the currently processed module.
diff --git a/sources/shiboken6/generator/main.cpp b/sources/shiboken6/generator/main.cpp
index 934e31307..a5a785770 100644
--- a/sources/shiboken6/generator/main.cpp
+++ b/sources/shiboken6/generator/main.cpp
@@ -689,9 +689,12 @@ int shibokenMain(int argc, char *argv[])
extractor.setCppFileNames(cppFileNames);
extractor.setTypeSystem(typeSystemFileName);
- const bool usePySideExtensions = generators.constFirst().data()->usePySideExtensions();
-
- const std::optional<ApiExtractorResult> apiOpt = extractor.run(usePySideExtensions);
+ ApiExtractorFlags apiExtractorFlags;
+ if (generators.constFirst()->usePySideExtensions())
+ apiExtractorFlags.setFlag(ApiExtractorFlag::UsePySideExtensions);
+ if (generators.constFirst()->avoidProtectedHack())
+ apiExtractorFlags.setFlag(ApiExtractorFlag::AvoidProtectedHack);
+ const std::optional<ApiExtractorResult> apiOpt = extractor.run(apiExtractorFlags);
if (!apiOpt.has_value()) {
errorPrint(QLatin1String("Error running ApiExtractor."));
diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
index 32a9f1f29..72aae16a8 100644
--- a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
@@ -54,7 +54,6 @@
#include <limits>
#include <memory>
-static const char AVOID_PROTECTED_HACK[] = "avoid-protected-hack";
static const char PARENT_CTOR_HEURISTIC[] = "enable-parent-ctor-heuristic";
static const char RETURN_VALUE_HEURISTIC[] = "enable-return-value-heuristic";
static const char DISABLE_VERBOSE_ERROR_MESSAGES[] = "disable-verbose-error-messages";
@@ -2082,8 +2081,6 @@ Generator::OptionDescriptions ShibokenGenerator::options() const
{
auto result = Generator::options();
result.append({
- {QLatin1String(AVOID_PROTECTED_HACK),
- QLatin1String("Avoid the use of the '#define protected public' hack.")},
{QLatin1String(DISABLE_VERBOSE_ERROR_MESSAGES),
QLatin1String("Disable verbose error messages. Turn the python code hard to debug\n"
"but safe few kB on the generated bindings.")},
@@ -2120,8 +2117,6 @@ bool ShibokenGenerator::handleOption(const QString &key, const QString &value)
return (m_useIsNullAsNbNonZero = true);
if (key == QLatin1String(USE_OPERATOR_BOOL_AS_NB_NONZERO))
return (m_useOperatorBoolAsNbNonZero = true);
- if (key == QLatin1String(AVOID_PROTECTED_HACK))
- return (m_avoidProtectedHack = true);
if (key == QLatin1String(NO_IMPLICIT_CONVERSIONS)) {
return m_generateImplicitConversions = false;
return true;
@@ -2231,11 +2226,6 @@ bool ShibokenGenerator::useOperatorBoolAsNbNonZero() const
return m_useOperatorBoolAsNbNonZero;
}
-bool ShibokenGenerator::avoidProtectedHack() const
-{
- return m_avoidProtectedHack;
-}
-
bool ShibokenGenerator::generateImplicitConversions() const
{
return m_generateImplicitConversions;
diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.h b/sources/shiboken6/generator/shiboken/shibokengenerator.h
index 36548e538..6e9e5e9ca 100644
--- a/sources/shiboken6/generator/shiboken/shibokengenerator.h
+++ b/sources/shiboken6/generator/shiboken/shibokengenerator.h
@@ -289,8 +289,6 @@ protected:
bool useIsNullAsNbNonZero() const;
/// Returns true if the generator should use operator bool to compute boolean casts.
bool useOperatorBoolAsNbNonZero() const;
- /// Returns true if the generated code should use the "#define protected public" hack.
- bool avoidProtectedHack() const;
/// Generate implicit conversions of function arguments
bool generateImplicitConversions() const;
static QString cppApiVariableName(const QString &moduleName = QString());
@@ -453,7 +451,6 @@ private:
bool m_verboseErrorMessagesDisabled = false;
bool m_useIsNullAsNbNonZero = false;
bool m_useOperatorBoolAsNbNonZero = false;
- bool m_avoidProtectedHack = false;
// FIXME PYSIDE 7 Flip generateImplicitConversions default or remove?
bool m_generateImplicitConversions = true;
bool m_wrapperDiagnostics = false;