@@ -81,6 +81,19 @@ enum AttrAdditionKind {
8181 Inherit { factory : fn ( Span , & hir:: Attribute ) -> hir:: Attribute } ,
8282}
8383
84+ /// Summary info about function parameters.
85+ #[ derive( Debug , Clone , Copy , Eq , PartialEq ) ]
86+ struct ParamInfo {
87+ /// The number of function parameters, including any C variadic `...` parameter.
88+ pub param_count : usize ,
89+
90+ /// Whether the function arguments end in a C variadic `...` parameter.
91+ pub c_variadic : bool ,
92+
93+ /// The index of the splatted parameter, if any.
94+ pub splatted : Option < u16 > ,
95+ }
96+
8497const PARENT_ID : hir:: ItemLocalId = hir:: ItemLocalId :: ZERO ;
8598
8699static ATTRS_ADDITIONS : & [ AttrAdditionInfo ] = & [
@@ -141,27 +154,20 @@ impl<'hir> LoweringContext<'_, 'hir> {
141154
142155 let is_method = self . is_method ( sig_id, span) ;
143156
144- let ( param_count , c_variadic , splatted ) = self . param_count ( sig_id) ;
157+ let param_info = self . param_info ( sig_id) ;
145158
146159 let mut generics =
147160 self . uplift_delegation_generics ( delegation, sig_id, item_id, is_method) ;
148161
149162 let body_id = self . lower_delegation_body (
150163 delegation,
151164 is_method,
152- param_count,
165+ param_info . param_count ,
153166 & mut generics,
154167 span,
155168 ) ;
156169
157- let decl = self . lower_delegation_decl (
158- sig_id,
159- param_count,
160- c_variadic,
161- splatted,
162- span,
163- & generics,
164- ) ;
170+ let decl = self . lower_delegation_decl ( sig_id, param_info, span, & generics) ;
165171
166172 let sig = self . lower_delegation_sig ( sig_id, decl, span) ;
167173 let ident = self . lower_ident ( delegation. ident ) ;
@@ -275,21 +281,26 @@ impl<'hir> LoweringContext<'_, 'hir> {
275281 self . get_partial_res ( node_id) . and_then ( |r| r. expect_full_res ( ) . opt_def_id ( ) )
276282 }
277283
278- // Function parameter count , including C variadic `...` and `#[splat]` if present.
279- fn param_count ( & self , def_id : DefId ) -> ( usize , bool /*c_variadic*/ , Option < u16 > /*splatted*/ ) {
284+ /// Returns function parameter info , including C variadic `...` and `#[splat]` if present.
285+ fn param_info ( & self , def_id : DefId ) -> ParamInfo {
280286 let sig = self . tcx . fn_sig ( def_id) . skip_binder ( ) . skip_binder ( ) ;
281- ( sig. inputs ( ) . len ( ) + usize:: from ( sig. c_variadic ( ) ) , sig. c_variadic ( ) , sig. splatted ( ) )
287+
288+ ParamInfo {
289+ param_count : sig. inputs ( ) . len ( ) + usize:: from ( sig. c_variadic ( ) ) ,
290+ c_variadic : sig. c_variadic ( ) ,
291+ splatted : sig. splatted ( ) ,
292+ }
282293 }
283294
284295 fn lower_delegation_decl (
285296 & mut self ,
286297 sig_id : DefId ,
287- param_count : usize ,
288- c_variadic : bool ,
289- splatted : Option < u16 > ,
298+ param_info : ParamInfo ,
290299 span : Span ,
291300 generics : & GenericsGenerationResults < ' hir > ,
292301 ) -> & ' hir hir:: FnDecl < ' hir > {
302+ let ParamInfo { param_count, c_variadic, splatted } = param_info;
303+
293304 // The last parameter in C variadic functions is skipped in the signature,
294305 // like during regular lowering.
295306 let decl_param_count = param_count - c_variadic as usize ;
0 commit comments