diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-05-28 20:54:03 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-06-01 16:17:41 +0200 |
commit | ef5c2bff2a9e396664b45c69ba1156ce38c6d21d (patch) | |
tree | b2850e1b502d0763163e65d931db1d8d9500eb7a /tools | |
parent | 869ae24b2da002a3a02e7d2bbecef42d08772be8 (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.py | 25 |
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') |