diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-06 12:49:17 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-07 20:32:11 +0200 |
commit | 89180881559f89dc1c932794348b3e9f36986638 (patch) | |
tree | cdee2ff737b0ec2ff9500866a2e4211c3f9f1317 | |
parent | 9f9026e16295b58d5b6d00cf8624c598e1090a0f (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.
Pick-to: 6.2
Change-Id: I600b02513b9b9e72d7cbd60e22cda7549133ab39
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_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 a20a8ff76..59f3000c0 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp @@ -206,7 +206,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 @@ -243,7 +243,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()) { @@ -807,7 +806,7 @@ bool AbstractMetaClass::deleteInMainThread() const bool AbstractMetaClassPrivate::hasConstructors() const { return AbstractMetaClass::queryFirstFunction(m_functions, - FunctionQueryOption::Constructors) != nullptr; + FunctionQueryOption::AnyConstructor) != nullptr; } bool AbstractMetaClass::hasConstructors() const @@ -1167,11 +1166,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; @@ -1402,8 +1407,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); } @@ -1833,7 +1837,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 dbe9972a8..d5abb029d 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 0a22f08af..4912f0505 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 b2f09db76..9b39e92be 100644 --- a/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp +++ b/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp @@ -474,7 +474,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 20a293c16..59b25a688 100644 --- a/sources/shiboken6/generator/generator.cpp +++ b/sources/shiboken6/generator/generator.cpp @@ -783,8 +783,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 859151eb8..fb72fbda4 100644 --- a/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp @@ -371,7 +371,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 166d8ed1a..fe9ab2892 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -4480,7 +4480,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); |