qtpy2cpp.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # Copyright (C) 2022 The Qt Company Ltd.
  2. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
  3. from __future__ import annotations
  4. import logging
  5. import os
  6. import sys
  7. from argparse import ArgumentParser, RawTextHelpFormatter
  8. from pathlib import Path
  9. from qtpy2cpp_lib.visitor import ConvertVisitor
  10. DESCRIPTION = "Tool to convert Python to C++"
  11. def create_arg_parser(desc):
  12. parser = ArgumentParser(description=desc,
  13. formatter_class=RawTextHelpFormatter)
  14. parser.add_argument("--debug", "-d", action="store_true",
  15. help="Debug")
  16. parser.add_argument("--stdout", "-s", action="store_true",
  17. help="Write to stdout")
  18. parser.add_argument("--force", "-f", action="store_true",
  19. help="Force overwrite of existing files")
  20. parser.add_argument("files", type=str, nargs="+", help="Python source file(s)")
  21. return parser
  22. if __name__ == "__main__":
  23. logging.basicConfig(level=logging.INFO)
  24. logger = logging.getLogger(__name__)
  25. arg_parser = create_arg_parser(DESCRIPTION)
  26. args = arg_parser.parse_args()
  27. ConvertVisitor.debug = args.debug
  28. for input_file_str in args.files:
  29. input_file = Path(input_file_str)
  30. if not input_file.is_file():
  31. logger.error(f"{input_file_str} does not exist or is not a file.")
  32. sys.exit(-1)
  33. file_root, ext = os.path.splitext(input_file)
  34. if input_file.suffix != ".py":
  35. logger.error(f"{input_file_str} does not appear to be a Python file.")
  36. sys.exit(-1)
  37. ast_tree = ConvertVisitor.create_ast(input_file_str)
  38. if args.stdout:
  39. sys.stdout.write(f"// Converted from {input_file.name}\n")
  40. ConvertVisitor(input_file, sys.stdout).visit(ast_tree)
  41. else:
  42. target_file = input_file.parent / (input_file.stem + ".cpp")
  43. if target_file.exists():
  44. if not target_file.is_file():
  45. logger.error(f"{target_file} exists and is not a file.")
  46. sys.exit(-1)
  47. if not args.force:
  48. logger.error(f"{target_file} exists. Use -f to overwrite.")
  49. sys.exit(-1)
  50. with target_file.open("w") as file:
  51. file.write(f"// Converted from {input_file.name}\n")
  52. ConvertVisitor(input_file, file).visit(ast_tree)
  53. logger.info(f"Wrote {target_file}.")