///|
/// SyntaxElement - Either a node or a token in the syntax tree
pub(all) enum SyntaxElement {
  Node(SyntaxNode)
  Token(SyntaxToken)
} derive(Eq, Debug)

///|
pub fn SyntaxElement::kind(self : SyntaxElement) -> SyntaxKind {
  match self {
    Node(n) => n.kind()
    Token(t) => t.kind()
  }
}

///|
pub fn SyntaxElement::text_range(self : SyntaxElement) -> TextRange {
  match self {
    Node(n) => n.text_range()
    Token(t) => t.text_range()
  }
}

///|
pub fn SyntaxElement::text_len(self : SyntaxElement) -> TextSize {
  match self {
    Node(n) => n.text_len()
    Token(t) => t.text_len()
  }
}

///|
pub fn SyntaxElement::as_node(self : SyntaxElement) -> SyntaxNode? {
  match self {
    Node(n) => Some(n)
    Token(_) => None
  }
}

///|
pub fn SyntaxElement::as_token(self : SyntaxElement) -> SyntaxToken? {
  match self {
    Node(_) => None
    Token(t) => Some(t)
  }
}

///|
pub fn SyntaxElement::parent(self : SyntaxElement) -> SyntaxNode? {
  match self {
    Node(n) => n.parent()
    Token(t) => Some(t.parent())
  }
}