@@ -29,7 +29,7 @@ use tracing::{debug, trace};
2929use super :: url_parts_builder:: UrlPartsBuilder ;
3030use crate :: clean:: types:: ExternalLocation ;
3131use crate :: clean:: utils:: find_nearest_parent_module;
32- use crate :: clean:: { self , ExternalCrate , PrimitiveType } ;
32+ use crate :: clean:: { self , ExternalCrate , Parameter , PrimitiveType } ;
3333use crate :: display:: { Joined as _, MaybeDisplay as _} ;
3434use crate :: formats:: cache:: Cache ;
3535use crate :: formats:: item_type:: ItemType ;
@@ -1264,6 +1264,7 @@ impl std::fmt::Write for WriteCounter {
12641264}
12651265
12661266// Implements Display by emitting the given number of spaces.
1267+ #[ derive( Clone , Copy ) ]
12671268struct Indent ( usize ) ;
12681269
12691270impl Display for Indent {
@@ -1325,40 +1326,21 @@ impl clean::FnDecl {
13251326 } )
13261327 }
13271328
1328- fn inner_full_print (
1329- & self ,
1330- // For None, the declaration will not be line-wrapped. For Some(n),
1331- // the declaration will be line-wrapped, with an indent of n spaces.
1332- line_wrapping_indent : Option < usize > ,
1333- f : & mut fmt:: Formatter < ' _ > ,
1334- cx : & Context < ' _ > ,
1335- ) -> fmt:: Result {
1336- let amp = if f. alternate ( ) { "&" } else { "&" } ;
1337-
1338- write ! ( f, "(" ) ?;
1339- if let Some ( n) = line_wrapping_indent
1340- && !self . inputs . is_empty ( )
1341- {
1342- write ! ( f, "\n {}" , Indent ( n + 4 ) ) ?;
1343- }
1344-
1345- let last_input_index = self . inputs . len ( ) . checked_sub ( 1 ) ;
1346- for ( i, param) in self . inputs . iter ( ) . enumerate ( ) {
1347- if let Some ( selfty) = param. to_receiver ( ) {
1348- match selfty {
1349- clean:: SelfTy => {
1350- write ! ( f, "self" ) ?;
1351- }
1329+ fn print_param ( param : & Parameter , cx : & Context < ' _ > ) -> impl fmt:: Display {
1330+ fmt:: from_fn ( move |f| {
1331+ if let Some ( self_ty) = param. to_receiver ( ) {
1332+ match self_ty {
1333+ clean:: SelfTy => f. write_str ( "self" ) ,
13521334 clean:: BorrowedRef { lifetime, mutability, type_ : box clean:: SelfTy } => {
1353- write ! ( f , "{ amp}" ) ?;
1335+ f . write_str ( if f . alternate ( ) { "&" } else { "& amp;" } ) ?;
13541336 if let Some ( lt) = lifetime {
13551337 write ! ( f, "{lt} " , lt = lt. print( ) ) ?;
13561338 }
1357- write ! ( f, "{mutability}self" , mutability = mutability. print_with_space( ) ) ? ;
1339+ write ! ( f, "{mutability}self" , mutability = mutability. print_with_space( ) )
13581340 }
13591341 _ => {
1360- write ! ( f , "self: " ) ?;
1361- selfty . print ( cx) . fmt ( f) ? ;
1342+ f . write_str ( "self: " ) ?;
1343+ self_ty . print ( cx) . fmt ( f)
13621344 }
13631345 }
13641346 } else {
@@ -1368,28 +1350,59 @@ impl clean::FnDecl {
13681350 if let Some ( name) = param. name {
13691351 write ! ( f, "{name}: " ) ?;
13701352 }
1371- param. type_ . print ( cx) . fmt ( f) ?;
1353+ param. type_ . print ( cx) . fmt ( f)
1354+ }
1355+ } )
1356+ }
1357+
1358+ fn inner_full_print (
1359+ & self ,
1360+ // For None, the declaration will not be line-wrapped. For Some(n),
1361+ // the declaration will be line-wrapped, with an indent of n spaces.
1362+ line_wrapping_indent : Option < usize > ,
1363+ f : & mut fmt:: Formatter < ' _ > ,
1364+ cx : & Context < ' _ > ,
1365+ ) -> fmt:: Result {
1366+ f. write_char ( '(' ) ?;
1367+
1368+ if !self . inputs . is_empty ( ) {
1369+ if self . inputs . is_empty ( ) {
1370+ return Ok ( ( ) ) ;
1371+ }
1372+
1373+ let line_wrapping_indent = line_wrapping_indent. map ( |n| Indent ( n + 4 ) ) ;
1374+
1375+ if let Some ( indent) = line_wrapping_indent {
1376+ write ! ( f, "\n {indent}" ) ?;
1377+ }
1378+
1379+ let sep = fmt:: from_fn ( |f| {
1380+ if let Some ( indent) = line_wrapping_indent {
1381+ write ! ( f, ",\n {indent}" )
1382+ } else {
1383+ f. write_str ( ", " )
1384+ }
1385+ } ) ;
1386+
1387+ self . inputs . iter ( ) . map ( |param| Self :: print_param ( param, cx) ) . joined ( sep, f) ?;
1388+
1389+ if line_wrapping_indent. is_some ( ) {
1390+ writeln ! ( f, "," ) ?
13721391 }
1373- match ( line_wrapping_indent , last_input_index ) {
1374- ( _ , None ) => ( ) ,
1375- ( None , Some ( last_i ) ) if i != last_i => write ! ( f , ", " ) ? ,
1376- ( None , Some ( _ ) ) => ( ) ,
1377- ( Some ( n ) , Some ( last_i ) ) if i != last_i => write ! ( f, ", \n {}" , Indent ( n + 4 ) ) ?,
1378- ( Some ( _ ) , Some ( _ ) ) => writeln ! ( f , "," ) ? ,
1392+
1393+ if self . c_variadic {
1394+ match line_wrapping_indent {
1395+ None => write ! ( f , ", ..." ) ? ,
1396+ Some ( indent ) => writeln ! ( f, "{indent}..." ) ?,
1397+ } ;
13791398 }
13801399 }
13811400
1382- if self . c_variadic {
1383- match line_wrapping_indent {
1384- None => write ! ( f, ", ..." ) ?,
1385- Some ( n) => writeln ! ( f, "{}..." , Indent ( n + 4 ) ) ?,
1386- } ;
1401+ if let Some ( n) = line_wrapping_indent {
1402+ write ! ( f, "{}" , Indent ( n) ) ?
13871403 }
13881404
1389- match line_wrapping_indent {
1390- None => write ! ( f, ")" ) ?,
1391- Some ( n) => write ! ( f, "{})" , Indent ( n) ) ?,
1392- } ;
1405+ f. write_char ( ')' ) ?;
13931406
13941407 self . print_output ( cx) . fmt ( f)
13951408 }
0 commit comments