use rustc_lexer::TokenKind;
pub(crate) struct RsTokens<'a> {
code: &'a str,
pos: usize,
}
impl<'a> RsTokens<'a> {
pub fn new(code: &'a str) -> Self {
Self { code, pos: 0 }
}
}
impl<'a> Iterator for RsTokens<'a> {
type Item = RsToken<'a>;
fn next(&mut self) -> Option<Self::Item> {
let rest = &self.code[self.pos..];
if rest.is_empty() {
None
} else {
let token = &rustc_lexer::first_token(rest);
let code = &self.code[self.pos..(self.pos + token.len)];
let item = RsToken::new(code, token.kind);
self.pos += token.len;
Some(item)
}
}
}
#[derive(Clone, Eq, PartialEq)]
pub(crate) struct RsToken<'a> {
code: &'a str,
kind: TokenKind,
}
impl<'a> RsToken<'a> {
pub fn new(code: &'a str, kind: TokenKind) -> Self {
Self { code, kind }
}
pub fn code(&self) -> &'a str {
self.code
}
}