1
1
use std:: assert_matches:: debug_assert_matches;
2
- use std:: fmt:: Write as _;
2
+ use std:: fmt:: { self , Display , Write as _} ;
3
3
use std:: mem;
4
4
use std:: sync:: LazyLock as Lazy ;
5
5
@@ -24,6 +24,7 @@ use crate::clean::{
24
24
clean_middle_ty, inline,
25
25
} ;
26
26
use crate :: core:: DocContext ;
27
+ use crate :: display:: Joined as _;
27
28
28
29
#[ cfg( test) ]
29
30
mod tests;
@@ -250,16 +251,20 @@ pub(crate) fn qpath_to_string(p: &hir::QPath<'_>) -> String {
250
251
hir:: QPath :: LangItem ( lang_item, ..) => return lang_item. name ( ) . to_string ( ) ,
251
252
} ;
252
253
253
- let mut s = String :: new ( ) ;
254
- for ( i, seg) in segments. iter ( ) . enumerate ( ) {
255
- if i > 0 {
256
- s. push_str ( "::" ) ;
257
- }
258
- if seg. ident . name != kw:: PathRoot {
259
- s. push_str ( seg. ident . as_str ( ) ) ;
260
- }
261
- }
262
- s
254
+ fmt:: from_fn ( |f| {
255
+ segments
256
+ . iter ( )
257
+ . map ( |seg| {
258
+ fmt:: from_fn ( |f| {
259
+ if seg. ident . name != kw:: PathRoot {
260
+ write ! ( f, "{}" , seg. ident) ?;
261
+ }
262
+ Ok ( ( ) )
263
+ } )
264
+ } )
265
+ . joined ( "::" , f)
266
+ } )
267
+ . to_string ( )
263
268
}
264
269
265
270
pub ( crate ) fn build_deref_target_impls (
@@ -299,35 +304,49 @@ pub(crate) fn name_from_pat(p: &hir::Pat<'_>) -> Symbol {
299
304
300
305
Symbol :: intern ( & match p. kind {
301
306
// FIXME(never_patterns): does this make sense?
302
- PatKind :: Wild | PatKind :: Err ( _) | PatKind :: Never | PatKind :: Struct ( ..) => {
307
+ PatKind :: Wild
308
+ | PatKind :: Err ( _)
309
+ | PatKind :: Never
310
+ | PatKind :: Struct ( ..)
311
+ | PatKind :: Range ( ..) => {
303
312
return kw:: Underscore ;
304
313
}
305
314
PatKind :: Binding ( _, _, ident, _) => return ident. name ,
315
+ PatKind :: Box ( p) | PatKind :: Ref ( p, _) | PatKind :: Guard ( p, _) => return name_from_pat ( p) ,
306
316
PatKind :: TupleStruct ( ref p, ..)
307
317
| PatKind :: Expr ( PatExpr { kind : PatExprKind :: Path ( ref p) , .. } ) => qpath_to_string ( p) ,
308
318
PatKind :: Or ( pats) => {
309
- pats. iter ( ) . map ( |p| name_from_pat ( p) . to_string ( ) ) . collect :: < Vec < String > > ( ) . join ( " | " )
319
+ fmt:: from_fn ( |f| pats. iter ( ) . map ( |p| name_from_pat ( p) ) . joined ( " | " , f) ) . to_string ( )
320
+ }
321
+ PatKind :: Tuple ( elts, _) => {
322
+ format ! ( "({})" , fmt:: from_fn( |f| elts. iter( ) . map( |p| name_from_pat( p) ) . joined( ", " , f) ) )
310
323
}
311
- PatKind :: Tuple ( elts, _) => format ! (
312
- "({})" ,
313
- elts. iter( ) . map( |p| name_from_pat( p) . to_string( ) ) . collect:: <Vec <String >>( ) . join( ", " )
314
- ) ,
315
- PatKind :: Box ( p) => return name_from_pat ( p) ,
316
324
PatKind :: Deref ( p) => format ! ( "deref!({})" , name_from_pat( p) ) ,
317
- PatKind :: Ref ( p, _) => return name_from_pat ( p) ,
318
325
PatKind :: Expr ( ..) => {
319
326
warn ! (
320
327
"tried to get argument name from PatKind::Expr, which is silly in function arguments"
321
328
) ;
322
329
return Symbol :: intern ( "()" ) ;
323
330
}
324
- PatKind :: Guard ( p, _) => return name_from_pat ( p) ,
325
- PatKind :: Range ( ..) => return kw:: Underscore ,
326
- PatKind :: Slice ( begin, ref mid, end) => {
327
- let begin = begin. iter ( ) . map ( |p| name_from_pat ( p) . to_string ( ) ) ;
328
- let mid = mid. as_ref ( ) . map ( |p| format ! ( "..{}" , name_from_pat( p) ) ) . into_iter ( ) ;
329
- let end = end. iter ( ) . map ( |p| name_from_pat ( p) . to_string ( ) ) ;
330
- format ! ( "[{}]" , begin. chain( mid) . chain( end) . collect:: <Vec <_>>( ) . join( ", " ) )
331
+ PatKind :: Slice ( begin, mid, end) => {
332
+ fn print_pat < ' a > ( pat : & ' a Pat < ' a > , wild : bool ) -> impl Display + ' a {
333
+ fmt:: from_fn ( move |f| {
334
+ if wild {
335
+ f. write_str ( ".." ) ?;
336
+ }
337
+ name_from_pat ( pat) . fmt ( f)
338
+ } )
339
+ }
340
+
341
+ format ! (
342
+ "[{}]" ,
343
+ fmt:: from_fn( |f| {
344
+ let begin = begin. iter( ) . map( |p| print_pat( p, false ) ) ;
345
+ let mid = mid. map( |p| print_pat( p, true ) ) ;
346
+ let end = end. iter( ) . map( |p| print_pat( p, false ) ) ;
347
+ begin. chain( mid) . chain( end) . joined( ", " , f)
348
+ } )
349
+ )
331
350
}
332
351
} )
333
352
}
0 commit comments