From ef5c2bff2a9e396664b45c69ba1156ce38c6d21d Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Sat, 28 May 2022 20:54:03 +0200 Subject: 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 --- tools/qtpy2cpp_lib/visitor.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'tools') 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') -- cgit v1.2.3