use brink_syntax::ast::{self, AstNode};
use crate::hir::types::TypeExpr;
pub(crate) fn lower_type_annotation(annotation: &ast::TypeAnnotation) -> Option<TypeExpr> {
annotation.type_expr().and_then(|te| lower_type_expr(&te))
}
pub(crate) fn lower_type_expr(te: &ast::TypeExpr) -> Option<TypeExpr> {
let range = te.syntax().text_range();
match te.kind()? {
ast::TypeExprKind::Name(n) => Some(TypeExpr::Named {
name: n.name()?,
range,
}),
ast::TypeExprKind::Generic(g) => {
let name = g.name()?;
let args = g.args().filter_map(|a| lower_type_expr(&a)).collect();
Some(TypeExpr::Generic { name, args, range })
}
ast::TypeExprKind::Fn(f) => {
let params = f.params().iter().filter_map(lower_type_expr).collect();
let ret = f.return_type().and_then(|r| lower_type_expr(&r))?;
Some(TypeExpr::Fn {
params,
ret: Box::new(ret),
range,
})
}
}
}