1
1
//! Transforms syntax into `Path` objects, ideally with accounting for hygiene
2
2
3
+ use std:: iter;
4
+
3
5
use crate :: type_ref:: ConstScalarOrPath ;
4
6
5
7
use either:: Either ;
@@ -86,15 +88,26 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx<'_>) -> Option<Path
86
88
generic_args. resize ( segments. len ( ) , None ) ;
87
89
}
88
90
91
+ let self_type = GenericArg :: Type ( self_type) ;
92
+
89
93
// Insert the type reference (T in the above example) as Self parameter for the trait
90
94
let last_segment = generic_args. get_mut ( segments. len ( ) - num_segments) ?;
91
- let mut args_inner = match last_segment {
92
- Some ( it) => it. as_ref ( ) . clone ( ) ,
93
- None => GenericArgs :: empty ( ) ,
94
- } ;
95
- args_inner. has_self_type = true ;
96
- args_inner. args . insert ( 0 , GenericArg :: Type ( self_type) ) ;
97
- * last_segment = Some ( Interned :: new ( args_inner) ) ;
95
+ * last_segment = Some ( Interned :: new ( match last_segment. take ( ) {
96
+ Some ( it) => GenericArgs {
97
+ args : iter:: once ( self_type)
98
+ . chain ( it. args . iter ( ) . cloned ( ) )
99
+ . collect ( ) ,
100
+
101
+ has_self_type : true ,
102
+ bindings : it. bindings . clone ( ) ,
103
+ desugared_from_fn : it. desugared_from_fn ,
104
+ } ,
105
+ None => GenericArgs {
106
+ args : Box :: new ( [ self_type] ) ,
107
+ has_self_type : true ,
108
+ ..GenericArgs :: empty ( )
109
+ } ,
110
+ } ) ) ;
98
111
}
99
112
}
100
113
}
@@ -209,7 +222,7 @@ pub(super) fn lower_generic_args(
209
222
return None ;
210
223
}
211
224
Some ( GenericArgs {
212
- args,
225
+ args : args . into_boxed_slice ( ) ,
213
226
has_self_type : false ,
214
227
bindings : bindings. into_boxed_slice ( ) ,
215
228
desugared_from_fn : false ,
@@ -223,15 +236,13 @@ fn lower_generic_args_from_fn_path(
223
236
params : Option < ast:: ParamList > ,
224
237
ret_type : Option < ast:: RetType > ,
225
238
) -> Option < GenericArgs > {
226
- let mut args = Vec :: new ( ) ;
227
239
let params = params?;
228
240
let mut param_types = Vec :: new ( ) ;
229
241
for param in params. params ( ) {
230
242
let type_ref = TypeRef :: from_ast_opt ( ctx, param. ty ( ) ) ;
231
243
param_types. push ( type_ref) ;
232
244
}
233
- let arg = GenericArg :: Type ( TypeRef :: Tuple ( param_types) ) ;
234
- args. push ( arg) ;
245
+ let args = Box :: new ( [ GenericArg :: Type ( TypeRef :: Tuple ( param_types) ) ] ) ;
235
246
let bindings = if let Some ( ret_type) = ret_type {
236
247
let type_ref = TypeRef :: from_ast_opt ( ctx, ret_type. ty ( ) ) ;
237
248
Box :: new ( [ AssociatedTypeBinding {
0 commit comments