aboutsummaryrefslogtreecommitdiffstats
path: root/sources
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-10-14 10:41:33 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-10-15 16:23:31 +0200
commit31e1ec9b5d40e1431dbf0c756b166422c702cad6 (patch)
treea09ab3eefb7a40cb5fa5c22c75ebb0ad270441af /sources
parent5b29846a91564aef34edb618a7a014df7de96f3a (diff)
Enable typesystem typedefs across modules
Adding a specialization of template type ValueWithUnit from libsample to libother would fail since the SBK index array of libsample would be used with the index from libother for it. Build up the inheritance for typesystem typedefs early on and add a lookup which matches the template specializations found during traversing functions to the type def and the class that is generated for it so that it can be used. As a side effect, special case entries for template specializations can be deleted from the signature mappings since they change to the class name and thus are normal types. Task-number: PYSIDE-1202 Change-Id: I5cc9650f70e9dc975171c80919685ebf5e752749 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources')
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp41
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h8
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h2
-rw-r--r--sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py8
-rw-r--r--sources/shiboken2/tests/libother/CMakeLists.txt1
-rw-r--r--sources/shiboken2/tests/libother/othertypesystypedef.cpp44
-rw-r--r--sources/shiboken2/tests/libother/othertypesystypedef.h46
-rw-r--r--sources/shiboken2/tests/otherbinding/CMakeLists.txt3
-rw-r--r--sources/shiboken2/tests/otherbinding/global.h2
-rw-r--r--sources/shiboken2/tests/otherbinding/othertypesystypedef_test.py62
-rw-r--r--sources/shiboken2/tests/otherbinding/typesystem_other.xml4
11 files changed, 212 insertions, 9 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
index 942d99cd3..8ef2866c2 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
@@ -673,6 +673,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
}
m_itemToClass.clear();
+ m_typeSystemTypeDefs.clear();
ReportHandler::endProgress();
}
@@ -993,6 +994,23 @@ void AbstractMetaBuilderPrivate::traverseTypesystemTypedefs()
*metaClass += AbstractMetaAttributes::Public;
fillAddedFunctions(metaClass);
addAbstractMetaClass(metaClass, nullptr);
+ // Ensure base classes are set up when traversing functions for the
+ // type to be resolved.
+ if (setupInheritance(metaClass)) {
+ // Create an entry to look up up types obtained from parsing
+ // functions in reverse. As opposed to container specializations,
+ // which are generated into every instantiating module (indicated
+ // by ContainerTypeEntry::targetLangPackage() being empty), the
+ // correct index array of the module needs to be found by reverse
+ // mapping the instantiations to the typedef entry.
+ // Synthesize a AbstractMetaType which would be found by an
+ // instantiation.
+ auto sourceType = new AbstractMetaType;
+ sourceType->setTypeEntry(metaClass->templateBaseClass()->typeEntry());
+ sourceType->setInstantiations(metaClass->templateBaseClassInstantiations());
+ sourceType->decideUsagePattern();
+ m_typeSystemTypeDefs.append({AbstractMetaTypeCPtr(sourceType), metaClass});
+ }
}
}
@@ -2093,6 +2111,20 @@ TypeEntries AbstractMetaBuilderPrivate::findTypeEntries(const QString &qualified
return {};
}
+// Reverse lookup of AbstractMetaType representing a template specialization
+// found during traversing function arguments to its type system typedef'ed
+// class.
+const AbstractMetaClass *AbstractMetaBuilderPrivate::resolveTypeSystemTypeDef(const AbstractMetaType *t) const
+{
+ if (t->hasInstantiations()) {
+ auto pred = [t](const TypeClassEntry &e) { return e.type->compare(*t); };
+ auto it = std::find_if(m_typeSystemTypeDefs.cbegin(), m_typeSystemTypeDefs.cend(), pred);
+ if (it != m_typeSystemTypeDefs.cend())
+ return it->klass;
+ }
+ return nullptr;
+}
+
AbstractMetaType *AbstractMetaBuilderPrivate::translateType(const TypeInfo &_typei,
AbstractMetaClass *currentClass,
TranslateTypeFlags flags,
@@ -2328,6 +2360,15 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateTypeStatic(const TypeInfo
// AbstractMetaType::cppSignature().
metaType->decideUsagePattern();
+ if (d) {
+ // Reverse lookup of type system typedefs. Replace by class.
+ if (auto klass = d->resolveTypeSystemTypeDef(metaType.data())) {
+ metaType.reset(new AbstractMetaType);
+ metaType->setTypeEntry(klass->typeEntry());
+ metaType->decideUsagePattern();
+ }
+ }
+
return metaType.take();
}
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
index 103f16d15..846895089 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
@@ -44,6 +44,12 @@ class TypeDatabase;
class AbstractMetaBuilderPrivate
{
public:
+ struct TypeClassEntry
+ {
+ AbstractMetaTypeCPtr type;
+ const AbstractMetaClass *klass;
+ };
+
using TranslateTypeFlags = AbstractMetaBuilder::TranslateTypeFlags;
Q_DISABLE_COPY(AbstractMetaBuilderPrivate)
@@ -175,6 +181,7 @@ public:
void fixArgumentNames(AbstractMetaFunction *func, const FunctionModificationList &mods);
void fillAddedFunctions(AbstractMetaClass *metaClass);
+ const AbstractMetaClass *resolveTypeSystemTypeDef(const AbstractMetaType *t) const;
AbstractMetaBuilder *q;
AbstractMetaClassList m_metaClasses;
@@ -201,6 +208,7 @@ public:
QFileInfoList m_globalHeaders;
QStringList m_headerPaths;
mutable QHash<QString, Include> m_resolveIncludeHash;
+ QVector<TypeClassEntry> m_typeSystemTypeDefs; // look up metatype->class for type system typedefs
bool m_skipDeprecated = false;
};
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h b/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h
index 617ebcf4f..f8bca07c1 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h
@@ -29,6 +29,7 @@
#ifndef ABSTRACTMETALANG_TYPEDEFS_H
#define ABSTRACTMETALANG_TYPEDEFS_H
+#include <QtCore/QSharedPointer>
#include <QtCore/QVector>
class AbstractMetaClass;
@@ -45,6 +46,7 @@ using AbstractMetaEnumList = QVector<AbstractMetaEnum *>;
using AbstractMetaEnumValueList = QVector<AbstractMetaEnumValue *>;
using AbstractMetaFieldList = QVector<AbstractMetaField *>;
using AbstractMetaFunctionList = QVector<AbstractMetaFunction *>;
+using AbstractMetaTypeCPtr = QSharedPointer<const AbstractMetaType>;
using AbstractMetaTypeList = QVector<AbstractMetaType *>;
using AbstractMetaTypeCList = QVector<const AbstractMetaType *>;
diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
index f341458d7..05de5b6de 100644
--- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
+++ b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
@@ -454,14 +454,6 @@ def init_PySide2_QtCore():
"PyByteArray": bytearray,
"PyBytes": bytes,
"QDeadlineTimer(QDeadlineTimer.Forever)": Instance("PySide2.QtCore.QDeadlineTimer"),
- "PySide2.QtCore.QCborStreamReader.StringResult[PySide2.QtCore.QByteArray]":
- PySide2.QtCore.QCborStringResultByteArray,
- "PySide2.QtCore.QCborStreamReader.StringResult[QString]":
- PySide2.QtCore.QCborStringResultString,
- "PySide2.QtCore.QCborStreamReader.QCborStringResultByteArray":
- PySide2.QtCore.QCborStringResultByteArray, # 5.14, why?
- "PySide2.QtCore.QCborStreamReader.QCborStringResultString":
- PySide2.QtCore.QCborStringResultString, # 5.14, why?
"PySide2.QtCore.QUrl.ComponentFormattingOptions":
PySide2.QtCore.QUrl.ComponentFormattingOption, # mismatch option/enum, why???
"PyUnicode": typing.Text,
diff --git a/sources/shiboken2/tests/libother/CMakeLists.txt b/sources/shiboken2/tests/libother/CMakeLists.txt
index d1e4c4354..c078d3546 100644
--- a/sources/shiboken2/tests/libother/CMakeLists.txt
+++ b/sources/shiboken2/tests/libother/CMakeLists.txt
@@ -6,6 +6,7 @@ otherderived.cpp
otherobjecttype.cpp
othermultiplederived.cpp
smartptrtester.cpp
+othertypesystypedef.cpp
)
add_library(libother SHARED ${libother_SRC})
diff --git a/sources/shiboken2/tests/libother/othertypesystypedef.cpp b/sources/shiboken2/tests/libother/othertypesystypedef.cpp
new file mode 100644
index 000000000..7e6e1ff64
--- /dev/null
+++ b/sources/shiboken2/tests/libother/othertypesystypedef.cpp
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite 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$
+**
+****************************************************************************/
+
+#include "othertypesystypedef.h"
+
+OtherValueWithUnitUser::OtherValueWithUnitUser() = default;
+
+
+ValueWithUnit<double, LengthUnit::Inch>
+ OtherValueWithUnitUser::doubleMillimeterToInch(ValueWithUnit<double, LengthUnit::Millimeter> v)
+{
+ return ValueWithUnit<double, LengthUnit::Inch>(v.value() / 254);
+}
+
+ValueWithUnit<int, LengthUnit::Inch>
+ OtherValueWithUnitUser::intMillimeterToInch(ValueWithUnit<int, LengthUnit::Millimeter> v)
+{
+ return ValueWithUnit<int, LengthUnit::Inch>(v.value() / 254);
+}
diff --git a/sources/shiboken2/tests/libother/othertypesystypedef.h b/sources/shiboken2/tests/libother/othertypesystypedef.h
new file mode 100644
index 000000000..e3f434613
--- /dev/null
+++ b/sources/shiboken2/tests/libother/othertypesystypedef.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite 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 OTHERTYPESYSTYPEDEF_H
+#define OTHERTYPESYSTYPEDEF_H
+
+#include "libothermacros.h"
+
+#include <typesystypedef.h>
+
+class LIBOTHER_API OtherValueWithUnitUser
+{
+public:
+ OtherValueWithUnitUser();
+
+ static ValueWithUnit<double, LengthUnit::Inch> doubleMillimeterToInch(ValueWithUnit<double, LengthUnit::Millimeter>);
+
+ static ValueWithUnit<int, LengthUnit::Inch> intMillimeterToInch(ValueWithUnit<int, LengthUnit::Millimeter>);
+};
+
+#endif // OTHERTYPESYSTYPEDEF_H
diff --git a/sources/shiboken2/tests/otherbinding/CMakeLists.txt b/sources/shiboken2/tests/otherbinding/CMakeLists.txt
index 05a282838..518e27396 100644
--- a/sources/shiboken2/tests/otherbinding/CMakeLists.txt
+++ b/sources/shiboken2/tests/otherbinding/CMakeLists.txt
@@ -10,9 +10,12 @@ ${CMAKE_CURRENT_BINARY_DIR}/other/number_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/otherderived_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/othermultiplederived_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/otherobjecttype_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/other/othervaluewithunituser_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/sharedptr_str_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/smartptrtester_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/other/other_module_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/other/valuewithunitintinch_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/other/valuewithunitintmillimeter_wrapper.cpp
)
diff --git a/sources/shiboken2/tests/otherbinding/global.h b/sources/shiboken2/tests/otherbinding/global.h
index 763566ae0..702fb9287 100644
--- a/sources/shiboken2/tests/otherbinding/global.h
+++ b/sources/shiboken2/tests/otherbinding/global.h
@@ -32,5 +32,5 @@
#include "otherderived.h"
#include "otherobjecttype.h"
#include "othermultiplederived.h"
+#include "othertypesystypedef.h"
#include "smartptrtester.h"
-
diff --git a/sources/shiboken2/tests/otherbinding/othertypesystypedef_test.py b/sources/shiboken2/tests/otherbinding/othertypesystypedef_test.py
new file mode 100644
index 000000000..aafeb4973
--- /dev/null
+++ b/sources/shiboken2/tests/otherbinding/othertypesystypedef_test.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+#############################################################################
+##
+## Copyright (C) 2020 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite 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$
+##
+#############################################################################
+
+'''Test case for a class that holds a void pointer.'''
+
+import os
+import sys
+import unittest
+
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+from shiboken_paths import init_paths
+init_paths()
+
+from other import (OtherValueWithUnitUser, ValueWithUnitIntInch,
+ ValueWithUnitIntMillimeter)
+from sample import (ValueWithUnitDoubleMillimeter)
+
+
+class OtherTypeSysTypeDefTest(unittest.TestCase):
+ '''Test case type system typedefs across modules.'''
+
+ def test(self):
+ # Exercise existing typedefs from "sample"
+ mm_value = ValueWithUnitDoubleMillimeter(2540)
+ inch_value = OtherValueWithUnitUser.doubleMillimeterToInch(mm_value)
+ self.assertEqual(int(inch_value.value()), 10)
+ # Exercise typedefs in "other"
+ mm_value = ValueWithUnitIntMillimeter(2540)
+ inch_value = OtherValueWithUnitUser.intMillimeterToInch(mm_value)
+ self.assertEqual(inch_value.value(), 10)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/shiboken2/tests/otherbinding/typesystem_other.xml b/sources/shiboken2/tests/otherbinding/typesystem_other.xml
index 78c4dd016..4081548fc 100644
--- a/sources/shiboken2/tests/otherbinding/typesystem_other.xml
+++ b/sources/shiboken2/tests/otherbinding/typesystem_other.xml
@@ -14,6 +14,10 @@
instantiations="Str"/>
<value-type name="SmartPtrTester"/>
+ <typedef-type name="ValueWithUnitIntInch" source="ValueWithUnit&lt;int,LengthUnit::Inch&gt;"/>
+ <typedef-type name="ValueWithUnitIntMillimeter" source="ValueWithUnit&lt;int,LengthUnit::Millimeter&gt;"/>
+ <value-type name="OtherValueWithUnitUser"/>
+
<suppress-warning text="signature 'operator!=(ByteArray,const char*)' for function modification in 'ByteArray' not found." />
<suppress-warning text="signature 'operator+(ByteArray,const char*)' for function modification in 'ByteArray' not found." />
<suppress-warning text="signature 'operator==(ByteArray,const char*)' for function modification in 'ByteArray' not found." />