diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-05-31 14:39:17 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-06-01 16:17:41 +0200 |
commit | 808cf3a40c03e95a4ec84477656e739ab48dfc85 (patch) | |
tree | aa0aa717d136d869b3c3da889c08b51957a63061 /tools | |
parent | ef5c2bff2a9e396664b45c69ba1156ce38c6d21d (diff) |
qtpy2cpp: Handle chained function calls a()->b()->c()
Pick-to: 6.3
Task-number: PYSIDE-1945
Change-Id: I41d32000d4221f604fe87dd36ece3f287e9b1a30
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/qtpy2cpp_lib/visitor.py | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/tools/qtpy2cpp_lib/visitor.py b/tools/qtpy2cpp_lib/visitor.py index c3f931c5c..286fa9b4d 100644 --- a/tools/qtpy2cpp_lib/visitor.py +++ b/tools/qtpy2cpp_lib/visitor.py @@ -153,11 +153,42 @@ class ConvertVisitor(ast.NodeVisitor, CppFormatter): self.generic_visit(node) self._output_file.write(" | ") - def visit_Call(self, node): - self._output_file.write(format_start_function_call(node)) + def _format_call(self, node): + + f = node.func + if isinstance(f, ast.Name): + self._output_file.write(f.id) + else: + # Attributes denoting chained calls "a->b()->c()". Walk along in + # reverse order, recursing for other calls. + names = [] + n = f + while isinstance(n, ast.Attribute): + names.insert(0, n.attr) + n = n.value + + if isinstance(n, ast.Name): # Member or variable reference + if n.id != "self": + sep = "->" + if n.id in self._stack_variables: + sep = "." + elif n.id[0:1].isupper(): # Heuristics for static + sep = "::" + self._output_file.write(n.id) + self._output_file.write(sep) + elif isinstance(n, ast.Call): # A preceding call + self._format_call(n) + self._output_file.write("->") + + self._output_file.write("->".join(names)) + + self._output_file.write('(') self._write_function_args(node.args) self._output_file.write(')') + def visit_Call(self, node): + self._format_call(node) + def _write_function_args(self, args_node): # Manually do visit(), skip the children of func for i, arg in enumerate(args_node): |