aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-05-31 14:39:17 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-06-02 20:03:54 +0200
commite750e8eb3b81dc76b5a82f3b0873a288a04e13dd (patch)
tree88d4602286fa3ca7e161ee37243c9f634162514a
parent83ed8512797fea4549842d551eecb32fa2e698da (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.py35
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):