diff options
5 files changed, 38 insertions, 26 deletions
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml index 427d78998..2374055e2 100644 --- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml +++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml @@ -1514,7 +1514,7 @@ <modify-function signature="^to.*\(.*QStringView.*$" remove="all"/> </value-type> <value-type name="QBitArray"> - <add-function signature="__len__"> + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qbitarray-len"/> </add-function> <add-function signature="__getitem__"> @@ -1634,7 +1634,7 @@ <value-type name="QModelRoleDataSpan"> <modify-function signature="dataForRole(int)const" remove="all"/> - <add-function signature="__len__"> + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qmodelroledataspan-len"/> </add-function> @@ -2014,7 +2014,7 @@ <modify-function signature="operator+(QByteArray,const char*)" remove="all"/> <modify-function signature="operator+(const char*,QByteArray)" remove="all"/> <modify-function signature="operator+(QByteArray,const char*)" remove="all"/> - <add-function signature="operator+(PyBytes,QByteArray)"> + <add-function signature="operator+(PyBytes,QByteArray)" return-type="QByteArray"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatorplus-1"/> </add-function> <add-function signature="operator+(PyByteArray, QByteArray)" return-type="QByteArray"> @@ -2026,22 +2026,22 @@ <add-function signature="operator+=(PyByteArray)" return-type="QByteArray"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatorplusequal"/> </add-function> - <add-function signature="operator==(PyUnicode)"> + <add-function signature="operator==(PyUnicode)" return-type="bool"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatorequalequal"/> </add-function> - <add-function signature="operator!=(PyUnicode)"> + <add-function signature="operator!=(PyUnicode)" return-type="bool"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatornotequal"/> </add-function> - <add-function signature="operator>(PyUnicode)"> + <add-function signature="operator>(PyUnicode)" return-type="bool"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatorgreater"/> </add-function> - <add-function signature="operator>=(PyUnicode)"> + <add-function signature="operator>=(PyUnicode)" return-type="bool"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatorgreaterequal"/> </add-function> - <add-function signature="operator<(PyUnicode)"> + <add-function signature="operator<(PyUnicode)" return-type="bool"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatorlower"/> </add-function> - <add-function signature="operator<=(PyUnicode)"> + <add-function signature="operator<=(PyUnicode)" return-type="bool"> <inject-code file="../glue/qtcore.cpp" snippet="qbytearray-operatorlowerequal"/> </add-function> <!-- ### --> @@ -2206,7 +2206,7 @@ <add-function signature="__str__" return-type="str"> <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qbytearray-str"/> </add-function> - <add-function signature="__len__"> + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qbytearray-len"/> </add-function> <add-function signature="__getitem__"> diff --git a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml index 63ec8877a..39ecaf291 100644 --- a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml +++ b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml @@ -384,7 +384,7 @@ </value-type> <value-type name="QRegion" > <enum-type name="RegionType"/> - <add-function signature="__len__"> + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="beginning" file="../glue/qtgui.cpp" snippet="qregion-len"/> </add-function> <add-function signature="__getitem__"> diff --git a/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml b/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml index c1cb999c2..7d8cda24f 100644 --- a/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml +++ b/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml @@ -297,7 +297,7 @@ </value-type> <value-type name="QIPv6Address"> - <add-function signature="__len__"> + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="beginning" file="../glue/qtnetwork.cpp" snippet="qipv6address-len"/> </add-function> <add-function signature="__getitem__"> diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py index 49bc952c8..65f52bde6 100644 --- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py +++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py @@ -258,9 +258,25 @@ def sort_by_inheritance(signatures): return signatures -def _remove_ambiguous_signatures_body(signatures): +def best_to_remove(signatures, idx1, idx2, name=None): + # Both have identical annotation. + sig1 = signatures[idx1] + sig2 = signatures[idx2] + ra1 = sig1.return_annotation + ra2 = sig2.return_annotation + # Both have equal return annotation. + if ra1 == ra2: + for p1, p2 in zip(sig1.parameters.values(), sig2.parameters.values()): + # Use the first with a default. + if p1.default is not _empty or p2.default is not _empty: + return idx1 if p1.default is not _empty else idx2 + # Use the one with a return annotation. + return idx1 if ra1 is not None else idx2 + + +def _remove_ambiguous_signatures_body(signatures, name=None): # By the sorting of signatures, duplicates will always be adjacent. - last_ann = last_sig = None + last_ann = None last_idx = -1 to_delete = [] found = False @@ -270,14 +286,8 @@ def _remove_ambiguous_signatures_body(signatures): annos.append(param.annotation) if annos == last_ann: found = True - if sig.return_annotation is last_sig.return_annotation: - # we can use any duplicate - to_delete.append(idx) - else: - # delete the one which has non-empty result - to_delete.append(idx if not sig.return_annotation else last_idx) + to_delete.append(best_to_remove(signatures, idx, last_idx, name)) last_ann = annos - last_sig = sig last_idx = idx if not found: @@ -296,7 +306,7 @@ def is_inconsistent_overload(signatures): return count != 0 and count != len(signatures) -def remove_ambiguous_signatures(signatures): +def remove_ambiguous_signatures(signatures, name=None): # This may run more than once because of indexing. found, new_sigs = _remove_ambiguous_signatures_body(signatures) while found: @@ -313,10 +323,12 @@ def create_signature(props, key): return if isinstance(props["multi"], list): # multi sig: call recursively. + # For debugging: Print the name! + # name = props["multi"][0]["fullname"] res = list(create_signature(elem, key) for elem in props["multi"]) # PYSIDE-2846: Sort multi-signatures by inheritance in order to avoid shadowing. res = sort_by_inheritance(res) - res = remove_ambiguous_signatures(res) + res = remove_ambiguous_signatures(res, name=None) return res if len(res) > 1 else res[0] if type(key) is tuple: diff --git a/sources/shiboken6/tests/samplebinding/typesystem_sample.xml b/sources/shiboken6/tests/samplebinding/typesystem_sample.xml index 4ef2a5218..9a164e00d 100644 --- a/sources/shiboken6/tests/samplebinding/typesystem_sample.xml +++ b/sources/shiboken6/tests/samplebinding/typesystem_sample.xml @@ -2034,7 +2034,7 @@ %PYARG_0 = Shiboken::String::fromCString(%CPPSELF.cstring()); </inject-code> </add-function> - <add-function signature="__len__" > + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="end"> return %CPPSELF.size(); </inject-code> @@ -2194,7 +2194,7 @@ </inject-code> </add-function> - <add-function signature="__len__"> + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="beginning"> return %CPPSELF.size(); </inject-code> @@ -2216,7 +2216,7 @@ <value-type name="StrList"> <enum-type name="CtorEnum"/> - <add-function signature="__len__" > + <add-function signature="__len__" return-type="int"> <inject-code class="target" position="end"> return %CPPSELF.size(); </inject-code> |