use crate::SyntaxKind::{
DIVERT, DIVERT_STMT, DIVERT_TARGET, KW_DONE, KW_END, NEWLINE, RETURN_REDIRECT, RETURN_STMT,
TUNNEL_CALL,
};
use super::Parser;
pub(crate) fn divert_or_tunnel(p: &mut Parser<'_, '_>) {
divert_or_tunnel_core(p);
if p.at(NEWLINE) {
p.skip_ws();
p.bump();
}
}
pub(crate) fn divert_in_content(p: &mut Parser<'_, '_>) {
divert_or_tunnel_core(p);
}
fn divert_or_tunnel_core(p: &mut Parser<'_, '_>) {
let checkpoint = p.checkpoint();
p.bump(); divert_target(p);
p.skip_ws();
if p.at(DIVERT) {
p.start_node_at(checkpoint, TUNNEL_CALL);
p.bump(); p.finish_node();
} else {
p.start_node_at(checkpoint, DIVERT_STMT);
p.finish_node();
}
}
fn divert_target(p: &mut Parser<'_, '_>) {
p.start_node(DIVERT_TARGET);
if !p.eat(KW_END) && !p.eat(KW_DONE) {
super::expr::path(p);
}
p.finish_node();
}
pub(crate) fn return_stmt(p: &mut Parser<'_, '_>) {
let checkpoint = p.checkpoint();
p.bump(); p.skip_ws();
if p.at(DIVERT) {
p.start_node_at(checkpoint, RETURN_REDIRECT);
p.bump(); divert_target(p);
p.finish_node();
} else {
p.start_node_at(checkpoint, RETURN_STMT);
p.finish_node();
}
if p.at(NEWLINE) {
p.skip_ws();
p.bump();
}
}