@@ -29,7 +29,9 @@ use triomphe::Arc;
29
29
30
30
use crate :: {
31
31
attr:: Attrs ,
32
- body:: { Body , BodyDiagnostic , BodySourceMap , ExprPtr , HygieneId , LabelPtr , PatPtr } ,
32
+ body:: {
33
+ Body , BodyCollector , BodyDiagnostic , BodySourceMap , ExprPtr , HygieneId , LabelPtr , PatPtr ,
34
+ } ,
33
35
builtin_type:: BuiltinUint ,
34
36
data:: adt:: StructKind ,
35
37
db:: DefDatabase ,
@@ -82,7 +84,7 @@ pub(super) fn lower(
82
84
def_map : expander. module . def_map ( db) ,
83
85
source_map : BodySourceMap :: default ( ) ,
84
86
ast_id_map : db. ast_id_map ( expander. current_file_id ( ) ) ,
85
- body : Body :: default ( ) ,
87
+ body : BodyCollector :: default ( ) ,
86
88
expander,
87
89
current_try_block_label : None ,
88
90
is_lowering_coroutine : false ,
@@ -102,7 +104,7 @@ struct ExprCollector<'a> {
102
104
def_map : Arc < DefMap > ,
103
105
ast_id_map : Arc < AstIdMap > ,
104
106
krate : CrateId ,
105
- body : Body ,
107
+ body : BodyCollector ,
106
108
source_map : BodySourceMap ,
107
109
108
110
is_lowering_coroutine : bool ,
@@ -214,6 +216,9 @@ impl ExprCollector<'_> {
214
216
body : Option < ast:: Expr > ,
215
217
is_async_fn : bool ,
216
218
) -> ( Body , BodySourceMap ) {
219
+ let mut self_param = None ;
220
+ let mut params = vec ! [ ] ;
221
+
217
222
let skip_body = match self . owner {
218
223
DefWithBodyId :: FunctionId ( it) => self . db . attrs ( it. into ( ) ) ,
219
224
DefWithBodyId :: StaticId ( it) => self . db . attrs ( it. into ( ) ) ,
@@ -226,29 +231,32 @@ impl ExprCollector<'_> {
226
231
// If #[rust_analyzer::skip] annotated, only construct enough information for the signature
227
232
// and skip the body.
228
233
if skip_body {
229
- self . body . body_expr = self . missing_expr ( ) ;
230
234
if let Some ( ( param_list, mut attr_enabled) ) = param_list {
231
- if let Some ( self_param ) =
235
+ if let Some ( self_param_syn ) =
232
236
param_list. self_param ( ) . filter ( |_| attr_enabled. next ( ) . unwrap_or ( false ) )
233
237
{
234
- let is_mutable =
235
- self_param . mut_token ( ) . is_some ( ) && self_param . amp_token ( ) . is_none ( ) ;
238
+ let is_mutable = self_param_syn . mut_token ( ) . is_some ( )
239
+ && self_param_syn . amp_token ( ) . is_none ( ) ;
236
240
let binding_id: la_arena:: Idx < Binding > = self . alloc_binding (
237
241
Name :: new_symbol_root ( sym:: self_. clone ( ) ) ,
238
242
BindingAnnotation :: new ( is_mutable, false ) ,
239
243
) ;
240
- self . body . self_param = Some ( binding_id) ;
244
+ self_param = Some ( binding_id) ;
241
245
self . source_map . self_param =
242
- Some ( self . expander . in_file ( AstPtr :: new ( & self_param ) ) ) ;
246
+ Some ( self . expander . in_file ( AstPtr :: new ( & self_param_syn ) ) ) ;
243
247
}
244
- self . body . params = param_list
248
+ params = param_list
245
249
. params ( )
246
250
. zip ( attr_enabled)
247
251
. filter ( |( _, enabled) | * enabled)
248
252
. map ( |_| self . missing_pat ( ) )
249
253
. collect ( ) ;
250
254
} ;
251
- return ( self . body , self . source_map ) ;
255
+ let body_expr = self . missing_expr ( ) ;
256
+ return (
257
+ self . body . finish ( body_expr, self_param, params. into_boxed_slice ( ) ) ,
258
+ self . source_map ,
259
+ ) ;
252
260
}
253
261
254
262
self . awaitable_context . replace ( if is_async_fn {
@@ -264,35 +272,34 @@ impl ExprCollector<'_> {
264
272
}
265
273
} ) ;
266
274
if let Some ( ( param_list, mut attr_enabled) ) = param_list {
267
- let mut params = vec ! [ ] ;
268
- if let Some ( self_param) =
275
+ if let Some ( self_param_syn) =
269
276
param_list. self_param ( ) . filter ( |_| attr_enabled. next ( ) . unwrap_or ( false ) )
270
277
{
271
278
let is_mutable =
272
- self_param . mut_token ( ) . is_some ( ) && self_param . amp_token ( ) . is_none ( ) ;
279
+ self_param_syn . mut_token ( ) . is_some ( ) && self_param_syn . amp_token ( ) . is_none ( ) ;
273
280
let binding_id: la_arena:: Idx < Binding > = self . alloc_binding (
274
281
Name :: new_symbol_root ( sym:: self_. clone ( ) ) ,
275
282
BindingAnnotation :: new ( is_mutable, false ) ,
276
283
) ;
277
- let hygiene = self_param
284
+ let hygiene = self_param_syn
278
285
. name ( )
279
286
. map ( |name| self . hygiene_id_for ( name. syntax ( ) . text_range ( ) . start ( ) ) )
280
287
. unwrap_or ( HygieneId :: ROOT ) ;
281
288
if !hygiene. is_root ( ) {
282
289
self . body . binding_hygiene . insert ( binding_id, hygiene) ;
283
290
}
284
- self . body . self_param = Some ( binding_id) ;
285
- self . source_map . self_param = Some ( self . expander . in_file ( AstPtr :: new ( & self_param) ) ) ;
291
+ self_param = Some ( binding_id) ;
292
+ self . source_map . self_param =
293
+ Some ( self . expander . in_file ( AstPtr :: new ( & self_param_syn) ) ) ;
286
294
}
287
295
288
296
for ( param, _) in param_list. params ( ) . zip ( attr_enabled) . filter ( |( _, enabled) | * enabled)
289
297
{
290
298
let param_pat = self . collect_pat_top ( param. pat ( ) ) ;
291
299
params. push ( param_pat) ;
292
300
}
293
- self . body . params = params. into_boxed_slice ( ) ;
294
301
} ;
295
- self . body . body_expr = self . with_label_rib ( RibKind :: Closure , |this| {
302
+ let body_expr = self . with_label_rib ( RibKind :: Closure , |this| {
296
303
if is_async_fn {
297
304
match body {
298
305
Some ( e) => {
@@ -310,7 +317,7 @@ impl ExprCollector<'_> {
310
317
}
311
318
} ) ;
312
319
313
- ( self . body , self . source_map )
320
+ ( self . body . finish ( body_expr , self_param , params . into_boxed_slice ( ) ) , self . source_map )
314
321
}
315
322
316
323
fn ctx ( & mut self ) -> LowerCtx < ' _ > {
@@ -1934,7 +1941,7 @@ impl ExprCollector<'_> {
1934
1941
f : impl FnOnce ( & mut Self ) -> T ,
1935
1942
) -> T {
1936
1943
self . label_ribs . push ( LabelRib :: new ( RibKind :: Normal (
1937
- self . body [ label] . name . clone ( ) ,
1944
+ self . body . labels [ label] . name . clone ( ) ,
1938
1945
label,
1939
1946
hygiene,
1940
1947
) ) ) ;
0 commit comments