aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2024-09-11 18:45:28 +0200
committerChristian Tismer <tismer@stackless.com>2024-09-12 05:29:12 +0200
commitdb7671bf763a57968e707b9892feaa5806873a05 (patch)
tree1c8b75953f6d64535657776a07c325cae3f08a80
parent407cc58614a822c46b4ac5c18d15a28cd17b633f (diff)
type hints: Remove duplicate multi-signature entries
Multi-arity signatures are codes as lists of signatures. For quite a while, it was hard to check these lists efficiently for duplications. This is now easily possible after the defaults were made hash-able. It turned out that some defaults were dicts. A number of more rigorous fixes to signatures will follow. Errors before: 333 Errors after: 294 Task-number: PYSIDE-2846 Change-Id: Ic51341663f4e44d7df76c3e27992ab10d940af5d Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py9
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py9
2 files changed, 15 insertions, 3 deletions
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
index 6fc8ff1b3..d07c8d8c6 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
@@ -182,9 +182,12 @@ def create_signature(props, key):
# empty signatures string
return
if isinstance(props["multi"], list):
- # multi sig: call recursively
- return list(create_signature(elem, key)
- for elem in props["multi"])
+ # multi sig: call recursively.
+ # PYSIDE-2846: Fold duplicate signatures away
+ res = list(set(list(create_signature(elem, key)
+ for elem in props["multi"])))
+ return res if len(res) > 1 else res[0]
+
if type(key) is tuple:
_, modifier = key
else:
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
index f3cf6ed51..896afe0f9 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
@@ -410,6 +410,11 @@ def handle_retvar(obj):
return _handle_generic(obj, typing.List)
+class Hashabledict(dict):
+ def __hash__(self):
+ return hash(frozenset(self))
+
+
def calculate_props(line):
parsed = SimpleNamespace(**_parse_line(line.strip()))
arglist = parsed.arglist
@@ -426,6 +431,10 @@ def calculate_props(line):
annotations[name] = _resolve_type(ann, line, 0, handle_argvar, parsed.funcname)
if len(tup) == 3:
default = _resolve_value(tup[2], ann, line)
+ # PYSIDE-2846: When creating signatures, the defaults should be hashable.
+ # For that to work, we use `Hashabledict`.
+ if type(default) is dict:
+ default = Hashabledict(default)
_defaults.append(default)
defaults = tuple(_defaults)
returntype = parsed.returntype