use crate::{Ancestors, Node};
pub(crate) const ANGLE_PAIR: &str = "<>";
pub(crate) struct GenericAngleKinds {
pub(crate) lists: &'static [u16],
pub(crate) openers: &'static [u16],
pub(crate) closers: &'static [u16],
pub(crate) is_misparse: for<'a, 'b> fn(&Node<'a>, Ancestors<'a, 'b>) -> bool,
}
pub(crate) fn never_misparsed(_: &Node, _: Ancestors) -> bool {
false
}
impl GenericAngleKinds {
fn parent_is_list<'a>(&self, node: &Node<'a>, ancestors: Ancestors<'a, '_>) -> bool {
ancestors.iter(node).next().is_some_and(|(list, above)| {
self.lists.contains(&list.kind_id()) && !(self.is_misparse)(&list, above)
})
}
pub(crate) fn is_closer<'a>(&self, node: &Node<'a>, ancestors: Ancestors<'a, '_>) -> bool {
self.closers.contains(&node.kind_id()) && self.parent_is_list(node, ancestors)
}
pub(crate) fn opener_spelling<'a>(
&self,
node: &Node<'a>,
ancestors: Ancestors<'a, '_>,
) -> Option<&'static str> {
(self.openers.contains(&node.kind_id()) && self.parent_is_list(node, ancestors))
.then_some(ANGLE_PAIR)
}
}