1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
use text_size::TextRange; use crate::lexer::Token; use crate::lexer::TokenKind; pub struct Source<'t, 'input> { tokens: &'t [Token<'input>], cursor: usize, } impl<'t, 'input> Source<'t, 'input> { pub fn new(tokens: &'t [Token<'input>]) -> Self { Self { tokens, cursor: 0 } } pub fn next_token(&mut self) -> Option<&'t Token<'input>> { self.eat_trivia(); let token = self.tokens.get(self.cursor)?; self.cursor += 1; Some(token) } pub fn peek_kind(&mut self) -> Option<TokenKind> { self.eat_trivia(); self.peek_kind_raw() } pub fn peek_token(&mut self) -> Option<&Token> { self.eat_trivia(); self.peek_token_raw() } fn eat_trivia(&mut self) { while self.at_trivia() { self.cursor += 1; } } fn at_trivia(&self) -> bool { self.peek_kind_raw().map_or(false, TokenKind::is_trivia) } pub fn last_token_range(&self) -> Option<TextRange> { self.tokens.last().map(|Token { range, .. }| *range) } fn peek_kind_raw(&self) -> Option<TokenKind> { self.peek_token_raw().map(|Token { kind, .. }| *kind) } fn peek_token_raw(&self) -> Option<&Token> { self.tokens.get(self.cursor) } }