diff options
Diffstat (limited to 'sources/pyside-tools/qtpy2cpp.py')
-rw-r--r-- | sources/pyside-tools/qtpy2cpp.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/sources/pyside-tools/qtpy2cpp.py b/sources/pyside-tools/qtpy2cpp.py new file mode 100644 index 000000000..857b12b67 --- /dev/null +++ b/sources/pyside-tools/qtpy2cpp.py @@ -0,0 +1,62 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import logging +import os +import sys +from argparse import ArgumentParser, RawTextHelpFormatter +from pathlib import Path + +from qtpy2cpp_lib.visitor import ConvertVisitor + +DESCRIPTION = "Tool to convert Python to C++" + + +def create_arg_parser(desc): + parser = ArgumentParser(description=desc, + formatter_class=RawTextHelpFormatter) + parser.add_argument("--debug", "-d", action="store_true", + help="Debug") + parser.add_argument("--stdout", "-s", action="store_true", + help="Write to stdout") + parser.add_argument("--force", "-f", action="store_true", + help="Force overwrite of existing files") + parser.add_argument("files", type=str, nargs="+", help="Python source file(s)") + return parser + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO) + logger = logging.getLogger(__name__) + arg_parser = create_arg_parser(DESCRIPTION) + args = arg_parser.parse_args() + ConvertVisitor.debug = args.debug + + for input_file_str in args.files: + input_file = Path(input_file_str) + if not input_file.is_file(): + logger.error(f"{input_file_str} does not exist or is not a file.") + sys.exit(-1) + file_root, ext = os.path.splitext(input_file) + if input_file.suffix != ".py": + logger.error(f"{input_file_str} does not appear to be a Python file.") + sys.exit(-1) + + ast_tree = ConvertVisitor.create_ast(input_file_str) + if args.stdout: + sys.stdout.write(f"// Converted from {input_file.name}\n") + ConvertVisitor(input_file, sys.stdout).visit(ast_tree) + else: + target_file = input_file.parent / (input_file.stem + ".cpp") + if target_file.exists(): + if not target_file.is_file(): + logger.error(f"{target_file} exists and is not a file.") + sys.exit(-1) + if not args.force: + logger.error(f"{target_file} exists. Use -f to overwrite.") + sys.exit(-1) + + with target_file.open("w") as file: + file.write(f"// Converted from {input_file.name}\n") + ConvertVisitor(input_file, file).visit(ast_tree) + logger.info(f"Wrote {target_file}.") |