nodedump.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. """Helper to dump AST nodes for debugging"""
  5. import ast
  6. def to_string(node):
  7. """Helper to retrieve a string from the (Lists of )Name/Attribute
  8. aggregated into some nodes"""
  9. if isinstance(node, ast.Name):
  10. return node.id
  11. if isinstance(node, ast.Attribute):
  12. return node.attr
  13. return ''
  14. def debug_format_node(node):
  15. """Format AST node for debugging"""
  16. if isinstance(node, ast.alias):
  17. return f'alias("{node.name}")'
  18. if isinstance(node, ast.arg):
  19. return f'arg({node.arg})'
  20. if isinstance(node, ast.Attribute):
  21. if isinstance(node.value, ast.Name):
  22. nested_name = debug_format_node(node.value)
  23. return f'Attribute("{node.attr}", {nested_name})'
  24. return f'Attribute("{node.attr}")'
  25. if isinstance(node, ast.Call):
  26. return 'Call({}({}))'.format(to_string(node.func), len(node.args))
  27. if isinstance(node, ast.ClassDef):
  28. base_names = [to_string(base) for base in node.bases]
  29. bases = ': ' + ','.join(base_names) if base_names else ''
  30. return f'ClassDef({node.name}{bases})'
  31. if isinstance(node, ast.ImportFrom):
  32. return f'ImportFrom("{node.module}")'
  33. if isinstance(node, ast.FunctionDef):
  34. arg_names = [a.arg for a in node.args.args]
  35. return 'FunctionDef({}({}))'.format(node.name, ', '.join(arg_names))
  36. if isinstance(node, ast.Name):
  37. return 'Name("{}", Ctx={})'.format(node.id, type(node.ctx).__name__)
  38. if isinstance(node, ast.NameConstant):
  39. return f'NameConstant({node.value})'
  40. if isinstance(node, ast.Num):
  41. return f'Num({node.n})'
  42. if isinstance(node, ast.Str):
  43. return f'Str("{node.s}")'
  44. return type(node).__name__