use mago_allocator::Arena;
use mago_database::file::HasFileId;
use mago_span::Position;
use crate::cst::Type;
use crate::error::ParseError;
use crate::lexer::TypeLexer;
use crate::parser::internal::stream::TypeTokenStream;
mod internal;
pub fn construct<'arena, A>(arena: &'arena A, lexer: TypeLexer<'arena>) -> Result<Type<'arena>, ParseError>
where
A: Arena,
{
let mut stream = TypeTokenStream::new(arena, lexer);
let ty = internal::parse_type(&mut stream)?;
if let Some(next) = stream.lookahead(0)? {
return Err(ParseError::UnexpectedToken(vec![], next.kind, next.span_for(stream.file_id())));
}
Ok(ty)
}
pub fn construct_prefix<'arena, A>(
arena: &'arena A,
lexer: TypeLexer<'arena>,
) -> Result<(Type<'arena>, Position), ParseError>
where
A: Arena,
{
let mut stream = TypeTokenStream::new(arena, lexer);
let ty = internal::parse_type(&mut stream)?;
Ok((ty, stream.current_position()))
}