diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs index c56ddb51609..cc0d7f4b48e 100644 --- a/crates/syntax/src/ast/make.rs +++ b/crates/syntax/src/ast/make.rs @@ -158,6 +158,47 @@ fn ty_from_text(text: &str) -> ast::Type { ast_from_text(&format!("type _T = {text};")) } +/// Related goto [link](https://doc.rust-lang.org/reference/items/type-aliases.html) +/// Type Alias syntax is +/// ``` +/// TypeAlias : +/// type IDENTIFIER GenericParams? ( : TypeParamBounds )? WhereClause? ( = Type WhereClause?)? ; +/// ``` +/// FIXME : ident should be of type ast::Ident +pub fn ty_alias( + ident: &str, + generic_param_list: Option, + type_param_bounds: Option, + where_clause: Option, + assignment: Option<(ast::Type, Option)>, +) -> ast::TypeAlias { + let mut s = String::new(); + s.push_str(&format!("type {}", ident)); + + if let Some(list) = generic_param_list { + s.push_str(&list.to_string()); + } + + if let Some(list) = type_param_bounds { + s.push_str(&format!(" : {}", &list)); + } + + if let Some(cl) = where_clause { + s.push_str(&format!(" {}", &cl.to_string())); + } + + if let Some(exp) = assignment { + if let Some(cl) = exp.1 { + s.push_str(&format!("= {} {}", &exp.0.to_string(), &cl.to_string())); + } else { + s.push_str(&format!("= {}", &exp.0.to_string())); + } + } + + s.push_str(";"); + ast_from_text(&s) +} + pub fn assoc_item_list() -> ast::AssocItemList { ast_from_text("impl C for D {}") }