aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-04-06 12:49:17 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-04-08 06:12:34 +0000
commitb17a61cd5ea2bc7960d6ee9c5f6b944c90844f4e (patch)
treef8e5a27e941eb055402d7de2a1faf368de0aa0c7
parenta2672370256226a40df11025635b0e201303c823 (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>
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.cpp18
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang_enums.h5
-rw-r--r--sources/shiboken6/ApiExtractor/tests/testabstractmetaclass.cpp12
-rw-r--r--sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp2
-rw-r--r--sources/shiboken6/generator/generator.cpp3
-rw-r--r--sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp3
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp2
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);