use super::Printer;
use crate::ast::{Fragment, FragmentNode, is_collapsible_ws, text_edge_ws};
impl<'a> Printer<'a> {
pub(super) fn is_inline_fragment(&self, fragment: &Fragment<'_>) -> bool {
!self.fragment_boundary_newline(fragment, true)
&& !self.fragment_boundary_newline(fragment, false)
}
pub(super) fn fragment_boundary_newline(
&self,
fragment: &Fragment<'_>,
is_leading: bool,
) -> bool {
self.nodes_boundary_newline(fragment.nodes, is_leading)
}
#[inline]
pub(super) fn nodes_boundary_newline(
&self,
nodes: &[FragmentNode<'_>],
is_leading: bool,
) -> bool {
let node = if is_leading {
nodes.first()
} else {
nodes.last()
};
let Some(FragmentNode::Text(text)) = node else {
return false;
};
let holds = if text.newline_count == 0 || text.is_collapsible_ws_only {
text.newline_count != 0
} else {
edge_run_holds_newline(&self.source.as_bytes()[text.raw_span.range()], is_leading)
};
debug_assert_eq!(
holds,
text_edge_ws(text.raw(self.source), is_leading).contains('\n')
);
holds
}
}
#[inline(never)]
fn edge_run_holds_newline(raw: &[u8], leading: bool) -> bool {
let first_stop = |b: &u8| *b == b'\n' || !is_collapsible_ws(*b);
let stop = if leading {
raw.iter().find(|b| first_stop(b))
} else {
raw.iter().rev().find(|b| first_stop(b))
};
stop == Some(&b'\n')
}