mago_type_syntax/parser/
mod.rs1use mago_allocator::Arena;
2
3use mago_database::file::HasFileId;
4use mago_span::Position;
5
6use crate::cst::Type;
7use crate::error::ParseError;
8use crate::lexer::TypeLexer;
9use crate::parser::internal::stream::TypeTokenStream;
10
11mod internal;
12
13pub fn construct<'arena, A>(arena: &'arena A, lexer: TypeLexer<'arena>) -> Result<Type<'arena>, ParseError>
19where
20 A: Arena,
21{
22 let mut stream = TypeTokenStream::new(arena, lexer);
23
24 let ty = internal::parse_type(&mut stream)?;
25
26 if let Some(next) = stream.lookahead(0)? {
27 return Err(ParseError::UnexpectedToken(vec![], next.kind, next.span_for(stream.file_id())));
28 }
29
30 Ok(ty)
31}
32
33pub fn construct_prefix<'arena, A>(
42 arena: &'arena A,
43 lexer: TypeLexer<'arena>,
44) -> Result<(Type<'arena>, Position), ParseError>
45where
46 A: Arena,
47{
48 let mut stream = TypeTokenStream::new(arena, lexer);
49 let ty = internal::parse_type(&mut stream)?;
50 Ok((ty, stream.current_position()))
51}