use std::collections::HashSet;
use crate::node::NodeKind;
use crate::node::NormalizedNode;
use crate::node::PlaceholderKind;
pub struct PlaceholderOrderCollector {
order: Vec<(PlaceholderKind, usize)>,
seen: HashSet<(PlaceholderKind, usize)>,
}
impl PlaceholderOrderCollector {
#[must_use]
pub fn new() -> Self {
Self {
order: Vec::new(),
seen: HashSet::new(),
}
}
pub fn collect(&mut self, node: &NormalizedNode) {
if let NodeKind::Placeholder(kind, idx)
| NodeKind::PatPlaceholder(kind, idx)
| NodeKind::TypePlaceholder(kind, idx) = &node.kind
&& self.seen.insert((*kind, *idx))
{
self.order.push((*kind, *idx));
}
for child in &node.children {
self.collect(child);
}
}
#[must_use]
pub fn into_order(self) -> Vec<(PlaceholderKind, usize)> {
self.order
}
}
impl Default for PlaceholderOrderCollector {
fn default() -> Self {
Self::new()
}
}