@@ -212,7 +212,7 @@ impl<'ast> State<'_, 'ast> {
212212 format : ListFormat ,
213213 ) where
214214 P : FnMut ( & mut Self , & ' a T ) ,
215- S : FnMut ( & T ) -> Option < Span > + Copy ,
215+ S : FnMut ( & T ) -> Span ,
216216 {
217217 if self . handle_span ( Span :: new ( pos_lo, pos_hi) , true ) {
218218 return ;
@@ -232,26 +232,24 @@ impl<'ast> State<'_, 'ast> {
232232 }
233233
234234 // Format single-item inline lists directly without boxes
235- self . print_inside_parens ( |state| match get_span ( & values [ 0 ] ) {
236- Some ( span) => {
237- state. s . cbox ( state. ind ) ;
238- let mut skip_break = true ;
239- if state. peek_comment_before ( span. hi ( ) ) . is_some ( ) {
240- state. hardbreak ( ) ;
241- skip_break = false ;
242- }
235+ self . print_inside_parens ( |state| {
236+ let span = get_span ( & values [ 0 ] ) ;
237+ state. s . cbox ( state. ind ) ;
238+ let mut skip_break = true ;
239+ if state. peek_comment_before ( span. hi ( ) ) . is_some ( ) {
240+ state. hardbreak ( ) ;
241+ skip_break = false ;
242+ }
243243
244- state. print_comments ( span. lo ( ) , CommentConfig :: skip_ws ( ) . mixed_prev_space ( ) ) ;
245- print ( state, & values[ 0 ] ) ;
244+ state. print_comments ( span. lo ( ) , CommentConfig :: skip_ws ( ) . mixed_prev_space ( ) ) ;
245+ print ( state, & values[ 0 ] ) ;
246246
247- if !state. print_trailing_comment ( span. hi ( ) , None ) && skip_break {
248- state. neverbreak ( ) ;
249- } else {
250- state. break_offset_if_not_bol ( 0 , -state. ind , false ) ;
251- }
252- state. end ( ) ;
247+ if !state. print_trailing_comment ( span. hi ( ) , None ) && skip_break {
248+ state. neverbreak ( ) ;
249+ } else {
250+ state. break_offset_if_not_bol ( 0 , -state. ind , false ) ;
253251 }
254- None => print ( state, & values [ 0 ] ) ,
252+ state. end ( ) ;
255253 } ) ;
256254 }
257255
@@ -263,7 +261,7 @@ impl<'ast> State<'_, 'ast> {
263261 get_span : S ,
264262 ) where
265263 P : FnMut ( & mut Self , & ' a T ) ,
266- S : FnMut ( & T ) -> Option < Span > ,
264+ S : FnMut ( & T ) -> Span ,
267265 {
268266 if self . handle_span ( span, false ) {
269267 return ;
@@ -281,9 +279,9 @@ impl<'ast> State<'_, 'ast> {
281279 format : ListFormat ,
282280 ) -> bool
283281 where
284- S : FnMut ( & T ) -> Option < Span > ,
282+ S : FnMut ( & T ) -> Span ,
285283 {
286- let Some ( span) = values. first ( ) . and_then ( & mut get_span) else {
284+ let Some ( span) = values. first ( ) . map ( & mut get_span) else {
287285 return false ;
288286 } ;
289287
@@ -357,7 +355,7 @@ impl<'ast> State<'_, 'ast> {
357355 format : ListFormat ,
358356 ) where
359357 P : FnMut ( & mut Self , & ' a T ) ,
360- S : FnMut ( & T ) -> Option < Span > ,
358+ S : FnMut ( & T ) -> Span ,
361359 {
362360 if values. is_empty ( ) {
363361 return ;
@@ -366,8 +364,8 @@ impl<'ast> State<'_, 'ast> {
366364 let first = get_span ( & values[ 0 ] ) ;
367365 // we can't simply check `peek_comment_before(pos_hi)` cause we would also account for
368366 // comments in the child expression, and those don't matter.
369- let has_comments = self . peek_comment_before ( first. map_or ( pos_hi , |s| s . lo ( ) ) ) . is_some ( )
370- || self . peek_comment_between ( first. map_or ( pos_hi , |s| s . hi ( ) ) , pos_hi) . is_some ( ) ;
367+ let has_comments = self . peek_comment_before ( first. lo ( ) ) . is_some ( )
368+ || self . peek_comment_between ( first. hi ( ) , pos_hi) . is_some ( ) ;
371369 let is_single_without_cmnts = values. len ( ) == 1 && !format. break_single && !has_comments;
372370
373371 let skip_first_break = if format. with_delimiters || format. is_inline ( ) {
@@ -399,10 +397,9 @@ impl<'ast> State<'_, 'ast> {
399397 is_single_without_cmnts || !format. with_delimiters || format. is_inline ( ) ;
400398 for ( i, value) in values. iter ( ) . enumerate ( ) {
401399 let is_last = i == values. len ( ) - 1 ;
402- if let Some ( span) = get_span ( value)
403- && self
404- . print_comments ( span. lo ( ) , CommentConfig :: skip_ws ( ) . mixed_prev_space ( ) )
405- . is_some_and ( |cmnt| cmnt. is_mixed ( ) )
400+ if self
401+ . print_comments ( get_span ( value) . lo ( ) , CommentConfig :: skip_ws ( ) . mixed_prev_space ( ) )
402+ . is_some_and ( |cmnt| cmnt. is_mixed ( ) )
406403 && format. breaks_cmnts
407404 {
408405 self . hardbreak ( ) ; // trailing and isolated comments already hardbreak
@@ -414,7 +411,7 @@ impl<'ast> State<'_, 'ast> {
414411 self . print_word ( "," ) ;
415412 }
416413
417- let next_span = if is_last { None } else { get_span ( & values[ i + 1 ] ) } ;
414+ let next_span = if is_last { None } else { Some ( get_span ( & values[ i + 1 ] ) ) } ;
418415 let next_pos = next_span. map ( Span :: lo) . unwrap_or ( pos_hi) ;
419416
420417 if !is_last
@@ -447,7 +444,12 @@ impl<'ast> State<'_, 'ast> {
447444 && !self . is_bol_or_only_ind ( )
448445 && !self . inline_config . is_disabled ( next_span)
449446 {
450- format. print_break ( false , values. len ( ) , & mut self . s ) ;
447+ if next_span. is_dummy ( ) && !matches ! ( format. kind, ListFormatKind :: AlwaysBreak ) {
448+ // Don't add spaces between uninformed items (commas)
449+ self . zerobreak ( ) ;
450+ } else {
451+ format. print_break ( false , values. len ( ) , & mut self . s ) ;
452+ }
451453 }
452454 }
453455
0 commit comments