use crate::{PunctuationKind, TokenKind};
use super::{
rustc::{rustc_is_id_continue, rustc_is_id_start},
LexerCursor,
};
pub(super) fn is_id_continue(c: char) -> bool {
rustc_is_id_continue(c) || unicode_properties::UnicodeEmoji::is_emoji_char(c)
}
pub(super) fn is_id_start(c: char) -> bool {
rustc_is_id_start(c)
|| (unicode_properties::UnicodeEmoji::is_emoji_char(c) && !c.is_ascii_digit())
}
impl<I> LexerCursor<I>
where
I: Iterator<Item = char>,
{
pub(super) fn require_seperator_after_and_then_consume(
&mut self,
res: Option<(TokenKind, usize)>,
) -> Option<TokenKind> {
match res {
Some((kind, matched_len)) if self.is_followed_by_seperator(matched_len, &kind) => {
for _ in 0..matched_len {
debug_assert!(self.iter.next().is_some())
}
Some(kind)
}
_ => None,
}
}
fn is_followed_by_seperator(&mut self, n: usize, kind: &TokenKind) -> bool {
match kind {
TokenKind::Punctuation(PunctuationKind::Dot) => true,
_ => self.is_followed_by_primitive_seperator(n),
}
}
fn is_followed_by_primitive_seperator(&mut self, n: usize) -> bool {
match self.iter.peek_nth(n) {
Some(ch) if ch.is_whitespace() || ch.is_ascii_punctuation() => true,
None => true,
_ => false,
}
}
}