2024-10-13 16:47:53 +02:00
|
|
|
use enumset::{EnumSet, EnumSetType};
|
|
|
|
|
2024-10-17 09:54:09 +02:00
|
|
|
use super::SyntaxElement;
|
|
|
|
|
2024-10-21 15:11:08 +02:00
|
|
|
pub struct Input<'src, SyntaxKind: SyntaxElement> {
|
|
|
|
raw: Vec<(SyntaxKind, &'src str)>,
|
2024-10-13 16:47:53 +02:00
|
|
|
// enumset of meaningless tokens
|
|
|
|
semantically_meaningless: EnumSet<SyntaxKind>,
|
|
|
|
// indices of non-meaningless tokens
|
|
|
|
meaningful_toks: Vec<usize>,
|
|
|
|
}
|
|
|
|
|
2024-10-21 15:11:08 +02:00
|
|
|
impl<'src, SyntaxKind: SyntaxElement> Input<'src, SyntaxKind> {
|
2024-10-13 16:47:53 +02:00
|
|
|
pub fn new(
|
2024-10-21 15:11:08 +02:00
|
|
|
raw_toks: Vec<(SyntaxKind, &'src str)>,
|
2024-10-13 16:47:53 +02:00
|
|
|
meaningless: Option<EnumSet<SyntaxKind>>,
|
|
|
|
) -> Self {
|
|
|
|
let mut meaningful_toks = Vec::new();
|
|
|
|
|
|
|
|
if let Some(meaningless) = meaningless {
|
|
|
|
let meaningful_toks = raw_toks
|
|
|
|
.iter()
|
|
|
|
.enumerate()
|
|
|
|
.filter_map(|(i, tok)| (!meaningless.contains(tok.0)).then_some(i))
|
|
|
|
.collect_into(&mut meaningful_toks);
|
|
|
|
}
|
|
|
|
|
|
|
|
Self {
|
|
|
|
raw: raw_toks,
|
|
|
|
semantically_meaningless: meaningless.unwrap_or_default(),
|
|
|
|
meaningful_toks,
|
|
|
|
}
|
|
|
|
}
|
2024-10-17 09:54:09 +02:00
|
|
|
|
|
|
|
pub fn kind(&self, idx: usize) -> SyntaxKind {
|
|
|
|
let Some(meaningful_idx) = self.meaningful_toks.get(idx) else {
|
|
|
|
return SyntaxKind::EOF;
|
|
|
|
};
|
|
|
|
|
|
|
|
self.raw.get(*meaningful_idx).unwrap().0
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn preceding_meaningless(&self, idx: usize) -> usize {
|
|
|
|
assert!(self.meaningful_toks.len() > idx);
|
|
|
|
|
|
|
|
if idx == 0 {
|
|
|
|
// maybe should be `self.meaningful_toks[idx]` instead??
|
|
|
|
1
|
|
|
|
} else {
|
|
|
|
self.meaningful_toks[idx] - self.meaningful_toks[idx - 1]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// get the count of meaningless tokens at the end of the file.
|
|
|
|
pub fn meaningless_tail_len(&self) -> usize {
|
|
|
|
self.raw.len() - (self.meaningful_toks.last().unwrap() + 1)
|
|
|
|
}
|
2024-10-13 16:47:53 +02:00
|
|
|
}
|