aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-05-28 20:54:03 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-06-02 04:59:52 +0000
commit83ed8512797fea4549842d551eecb32fa2e698da (patch)
treeadc19a8ab2dd8093f1d184f62d6d8f1cdc7ce71a
parentf46855dc42cbfd39ef4db00dcd2d09f4453a3fdc (diff)
qtpy2cpp: Handle main()
Check for the if __name__ == '__main__' statement and convert that into a C main function. Task-number: PYSIDE-1945 Change-Id: I75e38aca9ebc9dc0f79dc97a18e61c28b6b17505 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> (cherry picked from commit ef5c2bff2a9e396664b45c69ba1156ce38c6d21d) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-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 5614dc622..f5d4e0709 100644
--- a/tools/qtpy2cpp_lib/visitor.py
+++ b/tools/qtpy2cpp_lib/visitor.py
@@ -70,6 +70,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:
@@ -239,6 +252,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')