@@ -14,6 +14,8 @@ use stdx::{format_to, never};
14
14
15
15
use crate :: { ast, utils:: is_raw_identifier, AstNode , SourceFile , SyntaxKind , SyntaxToken } ;
16
16
17
+ use super :: WhereClause ;
18
+
17
19
/// While the parent module defines basic atomic "constructors", the `ext`
18
20
/// module defines shortcuts for common things.
19
21
///
@@ -158,6 +160,52 @@ fn ty_from_text(text: &str) -> ast::Type {
158
160
ast_from_text ( & format ! ( "type _T = {text};" ) )
159
161
}
160
162
163
+ /** Related goto [link](https://doc.rust-lang.org/reference/items/type-aliases.html)
164
+ Type Alias syntax is
165
+
166
+ ```
167
+ TypeAlias :
168
+ type IDENTIFIER GenericParams? ( : TypeParamBounds )? WhereClause? ( = Type WhereClause?)? ;
169
+ ```
170
+
171
+ FIXME : ident should be of type ast::Ident
172
+ */
173
+ pub fn ty_alias (
174
+ ident : String ,
175
+ generic_param_list : Option < ast:: GenericParamList > ,
176
+ type_param_bounds : Option < ast:: TypeParam > ,
177
+ where_clause : Option < WhereClause > ,
178
+ assignment : Option < ( ast:: Type , Option < ast:: WhereClause > ) > ,
179
+ ) -> ast:: TypeAlias {
180
+ let mut s = String :: new ( ) ;
181
+ s. push_str ( format ! ( "type {}" , ident. as_str( ) ) . as_str ( ) ) ;
182
+
183
+ if let Some ( list) = generic_param_list {
184
+ s. push_str ( list. to_string ( ) . as_str ( ) ) ;
185
+ }
186
+
187
+ if let Some ( list) = type_param_bounds {
188
+ s. push_str ( format ! ( " : {}" , list. to_string( ) . as_str( ) ) . as_str ( ) ) ;
189
+ }
190
+
191
+ if let Some ( cl) = where_clause {
192
+ s. push_str ( format ! ( " {}" , cl. to_string( ) . as_str( ) ) . as_str ( ) ) ;
193
+ }
194
+
195
+ if let Some ( exp) = assignment {
196
+ if let Some ( cl) = exp. 1 {
197
+ s. push_str (
198
+ format ! ( "= {} {}" , exp. 0 . to_string( ) . as_str( ) , cl. to_string( ) . as_str( ) ) . as_str ( ) ,
199
+ ) ;
200
+ } else {
201
+ s. push_str ( format ! ( "= {}" , exp. 0 . to_string( ) . as_str( ) ) . as_str ( ) ) ;
202
+ }
203
+ }
204
+
205
+ s. push_str ( ";" ) ;
206
+ ast_from_text ( s. as_str ( ) )
207
+ }
208
+
161
209
pub fn assoc_item_list ( ) -> ast:: AssocItemList {
162
210
ast_from_text ( "impl C for D {}" )
163
211
}
0 commit comments