diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-06 12:49:17 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-04-08 06:12:34 +0000 |
commit | b17a61cd5ea2bc7960d6ee9c5f6b944c90844f4e (patch) | |
tree | f8e5a27e941eb055402d7de2a1faf368de0aa0c7 | |
parent | a2672370256226a40df11025635b0e201303c823 (diff) |
shiboken6: Refactor the class function queries
Change the meaning of FunctionQueryOption::Constructors to
"constructor except move/copy" since that is what is desired in most
cases. Add FunctionQueryOption::AnyConstructor for the old purpose.
Change-Id: I600b02513b9b9e72d7cbd60e22cda7549133ab39
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
(cherry picked from commit 89180881559f89dc1c932794348b3e9f36986638)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
7 files changed, 25 insertions, 20 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp index 1f957ea30..837a0f84c 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp @@ -202,7 +202,7 @@ AbstractMetaFunctionCList AbstractMetaClass::functionsInTargetLang() const public_flags |= FunctionQueryOption::WasPublic; // Constructors - AbstractMetaFunctionCList returned = queryFunctions(FunctionQueryOption::Constructors + AbstractMetaFunctionCList returned = queryFunctions(FunctionQueryOption::AnyConstructor | default_flags | public_flags); // Final functions @@ -239,7 +239,6 @@ AbstractMetaFunctionCList AbstractMetaClass::implicitConversions() const for (const auto &f : list) { if ((f->actualMinimumArgumentCount() == 1 || f->arguments().size() == 1 || f->isConversionOperator()) && !f->isExplicit() - && f->functionType() != AbstractMetaFunction::CopyConstructorFunction && !f->usesRValueReferences() && !f->isModifiedRemoved() && f->wasPublic()) { @@ -791,7 +790,7 @@ bool AbstractMetaClass::deleteInMainThread() const bool AbstractMetaClassPrivate::hasConstructors() const { return AbstractMetaClass::queryFirstFunction(m_functions, - FunctionQueryOption::Constructors) != nullptr; + FunctionQueryOption::AnyConstructor) != nullptr; } bool AbstractMetaClass::hasConstructors() const @@ -1142,11 +1141,17 @@ bool AbstractMetaClass::queryFunction(const AbstractMetaFunction *f, FunctionQue if (query.testFlag(FunctionQueryOption::Signals) && (!f->isSignal())) return false; - if (query.testFlag(FunctionQueryOption::Constructors) + if (query.testFlag(FunctionQueryOption::AnyConstructor) && (!f->isConstructor() || f->ownerClass() != f->implementingClass())) { return false; } + if (query.testFlag(FunctionQueryOption::Constructors) + && (f->functionType() != AbstractMetaFunction::ConstructorFunction + || f->ownerClass() != f->implementingClass())) { + return false; + } + if (query.testFlag(FunctionQueryOption::CopyConstructor) && (!f->isCopyConstructor() || f->ownerClass() != f->implementingClass())) { return false; @@ -1377,8 +1382,7 @@ void AbstractMetaClassPrivate::addUsingConstructors(AbstractMetaClass *q) // Add to derived class with parameter lists. const auto ctors = superClass->queryFunctions(FunctionQueryOption::Constructors); for (const auto &ctor : ctors) { - if (ctor->functionType() == AbstractMetaFunction::ConstructorFunction - && !ctor->isPrivate()) { + if (!ctor->isPrivate()) { addConstructor(AbstractMetaFunction::ConstructorFunction, ctor->access(), ctor->arguments(), q); } @@ -1805,7 +1809,7 @@ bool AbstractMetaClass::determineValueTypeWithCopyConstructorOnly(const Abstract return false; if (c->attributes().testFlag(AbstractMetaClass::HasRejectedDefaultConstructor)) return false; - const auto ctors = c->queryFunctions(FunctionQueryOption::Constructors); + const auto ctors = c->queryFunctions(FunctionQueryOption::AnyConstructor); bool copyConstructorFound = false; for (const auto &ctor : ctors) { switch (ctor->functionType()) { diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang_enums.h b/sources/shiboken6/ApiExtractor/abstractmetalang_enums.h index c78e84320..955776793 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang_enums.h +++ b/sources/shiboken6/ApiExtractor/abstractmetalang_enums.h @@ -32,8 +32,9 @@ #include <QtCore/QFlags> enum class FunctionQueryOption { - Constructors = 0x0000001, // Only constructors - CopyConstructor = 0x0000002, // Only copy constructors + AnyConstructor = 0x0000001, // Any constructor (copy/move) + Constructors = 0x0000002, // Constructors except copy/move + CopyConstructor = 0x0000004, // Only copy constructors //Destructors = 0x0000002, // Only destructors. Not included in class. FinalInTargetLangFunctions = 0x0000008, // Only functions that are non-virtual in TargetLang ClassImplements = 0x0000020, // Only functions implemented by the current class diff --git a/sources/shiboken6/ApiExtractor/tests/testabstractmetaclass.cpp b/sources/shiboken6/ApiExtractor/tests/testabstractmetaclass.cpp index cfc9a2418..755947ec4 100644 --- a/sources/shiboken6/ApiExtractor/tests/testabstractmetaclass.cpp +++ b/sources/shiboken6/ApiExtractor/tests/testabstractmetaclass.cpp @@ -71,7 +71,7 @@ void TestAbstractMetaClass::testClassNameUnderNamespace() QVERIFY(classes[0]->hasConstructors()); QCOMPARE(classes[0]->functions().size(), 2); // default ctor + copy ctor - auto ctors = classes[0]->queryFunctions(FunctionQueryOption::Constructors); + auto ctors = classes[0]->queryFunctions(FunctionQueryOption::AnyConstructor); QCOMPARE(ctors.size(), 2); if (ctors.constFirst()->minimalSignature() != QLatin1String("ClassName()")) qSwap(ctors[0], ctors[1]); @@ -359,7 +359,7 @@ void TestAbstractMetaClass::testSpecialFunctions() const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A")); QVERIFY(classA); - auto ctors = classA->queryFunctions(FunctionQueryOption::Constructors); + auto ctors = classA->queryFunctions(FunctionQueryOption::AnyConstructor); QCOMPARE(ctors.size(), 2); QCOMPARE(ctors.constFirst()->functionType(), AbstractMetaFunction::ConstructorFunction); QCOMPARE(ctors.at(1)->functionType(), AbstractMetaFunction::CopyConstructorFunction); @@ -370,7 +370,7 @@ void TestAbstractMetaClass::testSpecialFunctions() const AbstractMetaClass *classB = AbstractMetaClass::findClass(classes, QLatin1String("B")); QVERIFY(classB); - ctors = classB->queryFunctions(FunctionQueryOption::Constructors); + ctors = classB->queryFunctions(FunctionQueryOption::AnyConstructor); QCOMPARE(ctors.size(), 2); QCOMPARE(ctors.constFirst()->functionType(), AbstractMetaFunction::ConstructorFunction); QCOMPARE(ctors.at(1)->functionType(), AbstractMetaFunction::CopyConstructorFunction); @@ -427,7 +427,7 @@ void TestAbstractMetaClass::testClassDefaultConstructors() QVERIFY(classA); QCOMPARE(classA->functions().size(), 2); - auto ctors = classA->queryFunctions(FunctionQueryOption::Constructors); + auto ctors = classA->queryFunctions(FunctionQueryOption::AnyConstructor); QCOMPARE(ctors.size(), 2); if (ctors.constFirst()->minimalSignature() != QLatin1String("A()")) qSwap(ctors[0], ctors[1]); @@ -461,7 +461,7 @@ void TestAbstractMetaClass::testClassDefaultConstructors() AbstractMetaClass* classF = AbstractMetaClass::findClass(classes, QLatin1String("F")); QVERIFY(classF); - ctors = classF->queryFunctions(FunctionQueryOption::Constructors); + ctors = classF->queryFunctions(FunctionQueryOption::AnyConstructor); QCOMPARE(ctors.size(), 2); if (ctors.constFirst()->minimalSignature() != QLatin1String("F(int,int)")) qSwap(ctors[0], ctors[1]); @@ -494,7 +494,7 @@ void TestAbstractMetaClass::testClassInheritedDefaultConstructors() AbstractMetaClass* classA = AbstractMetaClass::findClass(classes, QLatin1String("A")); QVERIFY(classA); - auto ctors = classA->queryFunctions(FunctionQueryOption::Constructors); + auto ctors = classA->queryFunctions(FunctionQueryOption::AnyConstructor); QCOMPARE(ctors.size(), 2); if (ctors.constFirst()->minimalSignature() != QLatin1String("A()")) qSwap(ctors[0], ctors[1]); diff --git a/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp b/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp index 698baf881..56706e596 100644 --- a/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp +++ b/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp @@ -472,7 +472,7 @@ void TestAddFunction::testAddFunctionOnTypedef() AbstractMetaClass* foo = AbstractMetaClass::findClass(classes, QLatin1String("FooInt")); QVERIFY(foo); QVERIFY(foo->hasNonPrivateConstructor()); - const auto &lst = foo->queryFunctions(FunctionQueryOption::Constructors); + const auto &lst = foo->queryFunctions(FunctionQueryOption::AnyConstructor); for (const auto &f : lst) QVERIFY(f->signature().startsWith(f->name())); QCOMPARE(lst.size(), 2); diff --git a/sources/shiboken6/generator/generator.cpp b/sources/shiboken6/generator/generator.cpp index d800fe413..a23e0a92f 100644 --- a/sources/shiboken6/generator/generator.cpp +++ b/sources/shiboken6/generator/generator.cpp @@ -747,8 +747,7 @@ std::optional<DefaultValue> const auto &constructors = metaClass->queryFunctions(FunctionQueryOption::Constructors); for (const auto &ctor : constructors) { if (!ctor->isUserAdded() && !ctor->isPrivate() - && (ctor->isPublic() || !api.flags().testFlag(ApiExtractorFlag::AvoidProtectedHack)) - && ctor->functionType() == AbstractMetaFunction::ConstructorFunction) { + && (ctor->isPublic() || !api.flags().testFlag(ApiExtractorFlag::AvoidProtectedHack))) { // No arguments: Default constructible const auto &arguments = ctor->arguments(); if (arguments.isEmpty()) { diff --git a/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp index 4e10ce927..e5c05bfba 100644 --- a/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp @@ -416,7 +416,8 @@ void QtDocGenerator::writeConstructors(TextStream& s, const AbstractMetaClass* c { static const QString sectionTitle = QLatin1String(".. class:: "); - auto lst = cppClass->queryFunctions(FunctionQueryOption::Constructors | FunctionQueryOption::Visible); + auto lst = cppClass->queryFunctions(FunctionQueryOption::AnyConstructor + | FunctionQueryOption::Visible); for (int i = lst.size() - 1; i >= 0; --i) { if (lst.at(i)->isModifiedRemoved() || lst.at(i)->functionType() == AbstractMetaFunction::MoveConstructorFunction) lst.removeAt(i); diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index ada79ce3a..6c44d5901 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -4390,7 +4390,7 @@ void CppGenerator::writeClassDefinition(TextStream &s, const QString className = chopType(cpythonTypeName(metaClass)); QString baseClassName; AbstractMetaFunctionCList ctors; - const auto &allCtors = metaClass->queryFunctions(FunctionQueryOption::Constructors); + const auto &allCtors = metaClass->queryFunctions(FunctionQueryOption::AnyConstructor); for (const auto &f : allCtors) { if (!f->isPrivate() && !f->isModifiedRemoved() && !classContext.forSmartPointer()) ctors.append(f); |