diff options
| -rw-r--r-- | sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py | 44 | ||||
| -rw-r--r-- | sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py | 33 |
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"] |
