Skip to main content

mago_type_syntax/parser/
mod.rs

1use mago_database::file::HasFileId;
2
3use crate::ast::Type;
4use crate::error::ParseError;
5use crate::lexer::TypeLexer;
6use crate::parser::internal::stream::TypeTokenStream;
7
8mod internal;
9
10/// Constructs a type AST from a lexer.
11///
12/// # Errors
13///
14/// Returns a [`ParseError`] if the type syntax is invalid.
15pub fn construct(lexer: TypeLexer<'_>) -> Result<Type<'_>, ParseError> {
16    let mut stream = TypeTokenStream::new(lexer);
17
18    let ty = internal::parse_type(&mut stream)?;
19
20    if let Some(next) = stream.lookahead(0)? {
21        return Err(ParseError::UnexpectedToken(vec![], next.kind, next.span_for(stream.file_id())));
22    }
23
24    Ok(ty)
25}