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-02 20:03:54 +0200 |
commit | e750e8eb3b81dc76b5a82f3b0873a288a04e13dd (patch) | |
tree | 88d4602286fa3ca7e161ee37243c9f634162514a | |
parent | 83ed8512797fea4549842d551eecb32fa2e698da (diff) |
qtpy2cpp: Handle chained function calls a()->b()->c()
Task-number: PYSIDE-1945
Change-Id: I41d32000d4221f604fe87dd36ece3f287e9b1a30
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
(cherry picked from commit 808cf3a40c03e95a4ec84477656e739ab48dfc85)
Reviewed-by: Christian Tismer <tismer@stackless.com>
-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 f5d4e0709..3e8267945 100644 --- a/tools/qtpy2cpp_lib/visitor.py +++ b/tools/qtpy2cpp_lib/visitor.py @@ -189,11 +189,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): |