use super::{Cursor, Error, Tokenizer};
use crate::{
profiler::BoaProfiler,
syntax::{
ast::{Position, Punctuator, Span},
lexer::Token,
},
};
use std::io::Read;
#[derive(Debug, Clone, Copy)]
pub(super) struct SpreadLiteral;
impl SpreadLiteral {
pub(super) fn new() -> Self {
Self {}
}
}
impl<R> Tokenizer<R> for SpreadLiteral {
fn lex(&mut self, cursor: &mut Cursor<R>, start_pos: Position) -> Result<Token, Error>
where
R: Read,
{
let _timer = BoaProfiler::global().start_event("SpreadLiteral", "Lexing");
if cursor.next_is(b'.')? {
if cursor.next_is(b'.')? {
Ok(Token::new(
Punctuator::Spread.into(),
Span::new(start_pos, cursor.pos()),
))
} else {
Err(Error::syntax(
"Expecting Token '.' as part of spread",
cursor.pos(),
))
}
} else {
Ok(Token::new(
Punctuator::Dot.into(),
Span::new(start_pos, cursor.pos()),
))
}
}
}