aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py44
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py33
2 files changed, 42 insertions, 35 deletions
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
index 037ab54e6..9318b78ae 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
@@ -253,17 +253,55 @@ def sort_by_inheritance(signatures):
return signatures
+def _remove_ambiguous_signatures_body(signatures):
+ # By the sorting of signatures, duplicates will always be adjacent.
+ last_ann = last_sig = None
+ last_idx = -1
+ to_delete = []
+ found = False
+ for idx, sig in enumerate(signatures):
+ annos = []
+ for param in list(sig.parameters.values()):
+ 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)
+ last_ann = annos
+ last_sig = sig
+ last_idx = idx
+
+ if not found:
+ return False, signatures
+ new_sigs = []
+ for idx, sig in enumerate(signatures):
+ if idx not in to_delete:
+ new_sigs.append(sig)
+ return True, new_sigs
+
+
+def remove_ambiguous_signatures(signatures):
+ # This may run more than once because of indexing.
+ found, new_sigs = _remove_ambiguous_signatures_body(signatures)
+ if found:
+ _, new_sigs = _remove_ambiguous_signatures_body(new_sigs)
+ return new_sigs
+
+
def create_signature(props, key):
if not props:
# empty signatures string
return
if isinstance(props["multi"], list):
# multi sig: call recursively.
- # PYSIDE-2846: Fold duplicate signatures away
- res = list(set(list(create_signature(elem, key)
- for elem in props["multi"])))
+ 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)
return res if len(res) > 1 else res[0]
if type(key) is tuple:
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
index 750810dcf..1b2562c42 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
@@ -513,44 +513,13 @@ def fix_variables(props, line):
props.defaults = tuple(defaults)
-def fixup_multilines(lines):
- """
- Multilines can collapse when certain distinctions between C++ types
- vanish after mapping to Python.
- This function fixes this by re-computing multiline-ness.
- """
- res = []
- multi_lines = []
- for line in lines:
- multi = re.match(r"([0-9]+):", line)
- if multi:
- idx, rest = int(multi.group(1)), line[multi.end():]
- multi_lines.append(rest)
- if idx > 0:
- continue
- # remove duplicates
- multi_lines = sorted(set(multi_lines))
- # renumber or return a single line
- nmulti = len(multi_lines)
- if nmulti > 1:
- for idx, line in enumerate(multi_lines):
- res.append(f"{nmulti-idx-1}:{line}")
- else:
- res.append(multi_lines[0])
- multi_lines = []
- else:
- res.append(line)
- return res
-
-
def pyside_type_init(type_key, sig_strings):
dprint()
dprint(f"Initialization of type key '{type_key}'")
update_mapping()
- lines = fixup_multilines(sig_strings)
ret = {}
multi_props = []
- for line in lines:
+ for line in sig_strings:
props = calculate_props(line)
shortname = props["name"]
multi = props["multi"]