treenode.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import sys
  2. from uncompyle6.scanners.tok import NoneToken
  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):
  14. return self.__repr1__("", None)
  15. def __repr1__(self, indent, sibNum=None):
  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. if self.transformed_by is True:
  25. rv += " (transformed)"
  26. else:
  27. rv += " (transformed by %s)" % self.transformed_by
  28. rv = indent + rv
  29. indent += " "
  30. i = 0
  31. for node in self:
  32. if hasattr(node, "__repr1__"):
  33. if enumerate_children:
  34. child = node.__repr1__(indent, i)
  35. else:
  36. child = node.__repr1__(indent, None)
  37. else:
  38. inst = node.format(line_prefix="")
  39. if inst.startswith("\n"):
  40. # Nuke leading \n
  41. inst = inst[1:]
  42. if enumerate_children:
  43. child = indent + "%2d. %s" % (i, inst)
  44. else:
  45. child = indent + inst
  46. pass
  47. rv += "\n" + child
  48. i += 1
  49. return rv
  50. def first_child(self):
  51. if len(self) > 0:
  52. child = self[0]
  53. if not isinstance(child, SyntaxTree):
  54. return child
  55. return child.first_child()
  56. return self
  57. def last_child(self):
  58. if len(self) > 0:
  59. child = self[-1]
  60. if not isinstance(child, SyntaxTree):
  61. return child
  62. return child.last_child()
  63. return self