treenode.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import sys
  2. from decompyle3.scanners.tok import NoneToken, Token
  3. from spark_parser.ast import AST as spark_AST
  4. intern = sys.intern
  5. class SyntaxTree(spark_AST):
  6. def __init__(self, *args, transformed_by=None, **kwargs):
  7. self.transformed_by = transformed_by
  8. super(SyntaxTree, self).__init__(*args, **kwargs)
  9. def isNone(self):
  10. """An SyntaxTree None token. We can't use regular list comparisons
  11. because SyntaxTree token offsets might be different"""
  12. return len(self.data) == 1 and NoneToken == self.data[0]
  13. def __repr__(self) -> str:
  14. return self.__repr1__("", None)
  15. def __repr1__(self, indent, sibNum=None) -> str:
  16. rv = str(self.kind)
  17. if sibNum is not None:
  18. rv = "%2d. %s" % (sibNum, rv)
  19. enumerate_children = False
  20. if len(self) > 1:
  21. rv += " (%d)" % (len(self))
  22. enumerate_children = True
  23. if self.transformed_by is not None:
  24. rv += f" (transformed by {self.transformed_by})"
  25. pass
  26. rv = indent + rv
  27. indent += " "
  28. i = 0
  29. for node in self:
  30. if hasattr(node, "__repr1__"):
  31. if enumerate_children:
  32. child = node.__repr1__(indent, i)
  33. else:
  34. child = node.__repr1__(indent, None)
  35. else:
  36. inst = node.format(line_prefix="")
  37. if inst.startswith("\n"):
  38. # Nuke leading \n
  39. inst = inst[1:]
  40. if enumerate_children:
  41. child = indent + "%2d. %s" % (i, inst)
  42. else:
  43. child = indent + inst
  44. pass
  45. rv += "\n" + child
  46. i += 1
  47. return rv
  48. def first_child(self):
  49. for child in self:
  50. if isinstance(child, Token):
  51. return child
  52. if child is not None:
  53. child = child.first_child()
  54. if isinstance(child, Token):
  55. return child
  56. pass
  57. return None
  58. def last_child(self):
  59. if len(self) > 0:
  60. child_index = -1
  61. child = self[-1]
  62. while isinstance(child, SyntaxTree) and len(child) == 0:
  63. # Skip over empty nonterminal reductions
  64. child_index -= 1
  65. child = self[child_index]
  66. if not isinstance(child, SyntaxTree):
  67. return child
  68. return child.last_child()
  69. return self