@@ -66,14 +66,18 @@ impl<'hir> LoweringContext<'_, 'hir> {
6666 let Ok ( sig_id) = sig_id else {
6767 return false ;
6868 } ;
69- if let Some ( local_sig_id) = sig_id. as_local ( ) {
69+ self . has_self ( sig_id, span)
70+ }
71+
72+ fn has_self ( & self , def_id : DefId , span : Span ) -> bool {
73+ if let Some ( local_sig_id) = def_id. as_local ( ) {
7074 // The value may be missing due to recursive delegation.
7175 // Error will be emmited later during HIR ty lowering.
7276 self . resolver . delegation_fn_sigs . get ( & local_sig_id) . map_or ( false , |sig| sig. has_self )
7377 } else {
74- match self . tcx . def_kind ( sig_id ) {
78+ match self . tcx . def_kind ( def_id ) {
7579 DefKind :: Fn => false ,
76- DefKind :: AssocFn => self . tcx . associated_item ( sig_id ) . fn_has_self_parameter ,
80+ DefKind :: AssocFn => self . tcx . associated_item ( def_id ) . fn_has_self_parameter ,
7781 _ => span_bug ! ( span, "unexpected DefKind for delegation item" ) ,
7882 }
7983 }
@@ -107,12 +111,17 @@ impl<'hir> LoweringContext<'_, 'hir> {
107111 span : Span ,
108112 ) -> Result < DefId , ErrorGuaranteed > {
109113 let sig_id = if self . is_in_trait_impl { item_id } else { path_id } ;
110- let sig_id =
111- self . resolver . get_partial_res ( sig_id) . and_then ( |r| r. expect_full_res ( ) . opt_def_id ( ) ) ;
112- sig_id. ok_or_else ( || {
113- self . tcx
114- . dcx ( )
115- . span_delayed_bug ( span, "LoweringContext: couldn't resolve delegation item" )
114+ self . get_resolution_id ( sig_id, span)
115+ }
116+
117+ fn get_resolution_id ( & self , node_id : NodeId , span : Span ) -> Result < DefId , ErrorGuaranteed > {
118+ let def_id =
119+ self . resolver . get_partial_res ( node_id) . and_then ( |r| r. expect_full_res ( ) . opt_def_id ( ) ) ;
120+ def_id. ok_or_else ( || {
121+ self . tcx . dcx ( ) . span_delayed_bug (
122+ span,
123+ format ! ( "LoweringContext: couldn't resolve node {:?} in delegation item" , node_id) ,
124+ )
116125 } )
117126 }
118127
@@ -122,7 +131,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
122131 predicates : & [ ] ,
123132 has_where_clause_predicates : false ,
124133 where_clause_span : span,
125- span : span ,
134+ span,
126135 } )
127136 }
128137
@@ -222,12 +231,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
222231 } ) ) ;
223232
224233 let path = self . arena . alloc ( hir:: Path { span, res : Res :: Local ( param_id) , segments } ) ;
225-
226- hir:: Expr {
227- hir_id : self . next_id ( ) ,
228- kind : hir:: ExprKind :: Path ( hir:: QPath :: Resolved ( None , path) ) ,
229- span,
230- }
234+ self . mk_expr ( hir:: ExprKind :: Path ( hir:: QPath :: Resolved ( None , path) ) , span)
231235 }
232236
233237 fn lower_delegation_body (
@@ -236,19 +240,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
236240 param_count : usize ,
237241 span : Span ,
238242 ) -> BodyId {
239- let path = self . lower_qpath (
240- delegation. id ,
241- & delegation. qself ,
242- & delegation. path ,
243- ParamMode :: Optional ,
244- ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
245- None ,
246- ) ;
247243 let block = delegation. body . as_deref ( ) ;
248244
249245 self . lower_body ( |this| {
250- let mut parameters: Vec < hir:: Param < ' _ > > = Vec :: new ( ) ;
251- let mut args: Vec < hir:: Expr < ' hir > > = Vec :: new ( ) ;
246+ let mut parameters: Vec < hir:: Param < ' _ > > = Vec :: with_capacity ( param_count ) ;
247+ let mut args: Vec < hir:: Expr < ' _ > > = Vec :: with_capacity ( param_count ) ;
252248
253249 for idx in 0 ..param_count {
254250 let ( param, pat_node_id) = this. generate_param ( span) ;
@@ -264,55 +260,49 @@ impl<'hir> LoweringContext<'_, 'hir> {
264260 } ;
265261 self_resolver. visit_block ( block) ;
266262 let block = this. lower_block ( block, false ) ;
267- hir:: Expr {
268- hir_id : this. next_id ( ) ,
269- kind : hir:: ExprKind :: Block ( block, None ) ,
270- span : block. span ,
271- }
263+ this. mk_expr ( hir:: ExprKind :: Block ( block, None ) , block. span )
272264 } else {
273265 let pat_hir_id = this. lower_node_id ( pat_node_id) ;
274266 this. generate_arg ( pat_hir_id, span)
275267 } ;
276268 args. push ( arg) ;
277269 }
278270
279- let args = self . arena . alloc_from_iter ( args) ;
280- let final_expr = this. generate_call ( path, args) ;
271+ let final_expr = this. finalize_body_lowering ( delegation, args, span) ;
281272 ( this. arena . alloc_from_iter ( parameters) , final_expr)
282273 } )
283274 }
284275
285- fn generate_call (
276+ // Generates fully qualified call for the resulting body.
277+ fn finalize_body_lowering (
286278 & mut self ,
287- path : hir:: QPath < ' hir > ,
288- args : & ' hir [ hir:: Expr < ' hir > ] ,
279+ delegation : & Delegation ,
280+ args : Vec < hir:: Expr < ' hir > > ,
281+ span : Span ,
289282 ) -> hir:: Expr < ' hir > {
290- let callee = self . arena . alloc ( hir:: Expr {
291- hir_id : self . next_id ( ) ,
292- kind : hir:: ExprKind :: Path ( path) ,
293- span : path. span ( ) ,
294- } ) ;
283+ let path = self . lower_qpath (
284+ delegation. id ,
285+ & delegation. qself ,
286+ & delegation. path ,
287+ ParamMode :: Optional ,
288+ ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
289+ None ,
290+ ) ;
295291
296- let expr = self . arena . alloc ( hir:: Expr {
297- hir_id : self . next_id ( ) ,
298- kind : hir:: ExprKind :: Call ( callee, args) ,
299- span : path. span ( ) ,
300- } ) ;
292+ let args = self . arena . alloc_from_iter ( args) ;
293+ let path_expr = self . arena . alloc ( self . mk_expr ( hir:: ExprKind :: Path ( path) , span) ) ;
294+ let call = self . arena . alloc ( self . mk_expr ( hir:: ExprKind :: Call ( path_expr, args) , span) ) ;
301295
302296 let block = self . arena . alloc ( hir:: Block {
303297 stmts : & [ ] ,
304- expr : Some ( expr ) ,
298+ expr : Some ( call ) ,
305299 hir_id : self . next_id ( ) ,
306300 rules : hir:: BlockCheckMode :: DefaultBlock ,
307- span : path . span ( ) ,
301+ span,
308302 targeted_by_break : false ,
309303 } ) ;
310304
311- hir:: Expr {
312- hir_id : self . next_id ( ) ,
313- kind : hir:: ExprKind :: Block ( block, None ) ,
314- span : path. span ( ) ,
315- }
305+ self . mk_expr ( hir:: ExprKind :: Block ( block, None ) , span)
316306 }
317307
318308 fn generate_delegation_error (
@@ -333,11 +323,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
333323 let header = self . generate_header_error ( ) ;
334324 let sig = hir:: FnSig { decl, header, span } ;
335325
336- let body_id = self . lower_body ( |this| {
337- let expr =
338- hir:: Expr { hir_id : this. next_id ( ) , kind : hir:: ExprKind :: Err ( err) , span : span } ;
339- ( & [ ] , expr)
340- } ) ;
326+ let body_id = self . lower_body ( |this| ( & [ ] , this. mk_expr ( hir:: ExprKind :: Err ( err) , span) ) ) ;
341327 DelegationResults { generics, body_id, sig }
342328 }
343329
@@ -349,6 +335,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
349335 abi : abi:: Abi :: Rust ,
350336 }
351337 }
338+
339+ #[ inline]
340+ fn mk_expr ( & mut self , kind : hir:: ExprKind < ' hir > , span : Span ) -> hir:: Expr < ' hir > {
341+ hir:: Expr { hir_id : self . next_id ( ) , kind, span }
342+ }
352343}
353344
354345struct SelfResolver < ' a > {
0 commit comments