From 676c6641d1bda430876e49c92d7814b60b35f885 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 17 Jan 2022 13:27:40 +0100 Subject: 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 --- .../shiboken6/ApiExtractor/abstractmetabuilder.cpp | 6 ++- .../shiboken6/ApiExtractor/abstractmetabuilder.h | 2 + .../shiboken6/ApiExtractor/abstractmetabuilder_p.h | 2 +- sources/shiboken6/ApiExtractor/apiextractor.cpp | 11 +++--- sources/shiboken6/ApiExtractor/apiextractor.h | 5 ++- sources/shiboken6/ApiExtractor/apiextractorflags.h | 43 ++++++++++++++++++++++ sources/shiboken6/generator/generator.cpp | 11 ++++++ sources/shiboken6/generator/generator.h | 3 ++ sources/shiboken6/generator/main.cpp | 9 +++-- .../generator/shiboken/shibokengenerator.cpp | 10 ----- .../generator/shiboken/shibokengenerator.h | 3 -- 11 files changed, 79 insertions(+), 26 deletions(-) create mode 100644 sources/shiboken6/ApiExtractor/apiextractorflags.h 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 &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 ApiExtractor::run(bool usePySideExtensions) +std::optional 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 run(bool usePySideExtensions); + std::optional 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 + +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 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 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 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 #include -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; -- cgit v1.2.3