aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-05-28 20:54:03 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-06-01 16:17:41 +0200
commitef5c2bff2a9e396664b45c69ba1156ce38c6d21d (patch)
treeb2850e1b502d0763163e65d931db1d8d9500eb7a /tools
parent869ae24b2da002a3a02e7d2bbecef42d08772be8 (diff)
qtpy2cpp: Handle main()
Check for the if __name__ == '__main__' statement and convert that into a C main function. Pick-to: 6.3 Task-number: PYSIDE-1945 Change-Id: I75e38aca9ebc9dc0f79dc97a18e61c28b6b17505 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'tools')
-rw-r--r--tools/qtpy2cpp_lib/visitor.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/tools/qtpy2cpp_lib/visitor.py b/tools/qtpy2cpp_lib/visitor.py
index c120a4fb9..c3f931c5c 100644
--- a/tools/qtpy2cpp_lib/visitor.py
+++ b/tools/qtpy2cpp_lib/visitor.py
@@ -34,6 +34,19 @@ def _is_qt_constructor(assign_node):
return None
+def _is_if_main(if_node):
+ """Return whether an if statement is: if __name__ == '__main__' """
+ test = if_node.test
+ return (isinstance(test, ast.Compare)
+ and len(test.ops) == 1
+ and isinstance(test.ops[0], ast.Eq)
+ and isinstance(test.left, ast.Name)
+ and test.left.id == "__name__"
+ and len(test.comparators) == 1
+ and isinstance(test.comparators[0], ast.Constant)
+ and test.comparators[0].value == "__main__")
+
+
class ConvertVisitor(ast.NodeVisitor, CppFormatter):
"""AST visitor printing out C++
Note on implementation:
@@ -203,6 +216,18 @@ class ConvertVisitor(ast.NodeVisitor, CppFormatter):
def visit_If(self, node):
# Manually do visit() to get the indentation right. Note:
# elsif() is modelled as nested if.
+
+ # Check for the main function
+ if _is_if_main(node):
+ self._output_file.write("\nint main(int argc, char *argv[])\n{\n")
+ self.indent()
+ for b in node.body:
+ self.visit(b)
+ self.indent_string("return 0;\n")
+ self.dedent()
+ self._output_file.write("}\n")
+ return
+
self.indent_string('if (')
self.visit(node.test)
self._output_file.write(') {\n')