@@ -311,7 +311,6 @@ pub fn rewrite_macro_def(
311
311
let multi_branch_style = def. legacy || parsed_def. branches . len ( ) != 1 ;
312
312
313
313
let mac_indent = if multi_branch_style {
314
- result += " {" ;
315
314
indent. block_indent ( context. config )
316
315
} else {
317
316
indent
@@ -322,28 +321,25 @@ pub fn rewrite_macro_def(
322
321
let branch_items = itemize_list (
323
322
context. codemap ,
324
323
parsed_def. branches . iter ( ) ,
325
- "" ,
326
- "" ,
327
- |branch| branch. args_span . lo ( ) ,
328
- |branch| branch. body . hi ( ) ,
324
+ "}" ,
325
+ ";" ,
326
+ |branch| {
327
+ branch. span . lo ( )
328
+ } ,
329
+ |branch| {
330
+ branch. span . hi ( )
331
+ } ,
329
332
|branch| {
330
- let mut result = String :: new ( ) ;
331
-
332
333
// Only attempt to format function-like macros.
333
334
if branch. args_paren_kind != DelimToken :: Paren {
334
335
// FIXME(#1539): implement for non-sugared macros.
335
336
return None ;
336
337
}
337
338
338
- let args = format_macro_args ( branch. args . clone ( ) ) ?;
339
+ let mut result = format_macro_args ( branch. args . clone ( ) ) ?;
339
340
340
341
if multi_branch_style {
341
- result += "\n " ;
342
- result += & mac_indent_str;
343
- result += & args;
344
342
result += " =>" ;
345
- } else {
346
- result += & args;
347
343
}
348
344
349
345
// The macro body is the most interesting part. It might end up as various
@@ -418,13 +414,14 @@ pub fn rewrite_macro_def(
418
414
}
419
415
420
416
result += "}" ;
417
+
421
418
if def. legacy {
422
419
result += ";" ;
423
420
}
424
- result += " \n " ;
421
+
425
422
Some ( result)
426
423
} ,
427
- span . lo ( ) ,
424
+ context . codemap . span_after ( span , "{" ) ,
428
425
span. hi ( ) ,
429
426
false
430
427
) . collect :: < Vec < _ > > ( ) ;
@@ -439,14 +436,20 @@ pub fn rewrite_macro_def(
439
436
trailing_separator : SeparatorTactic :: Never ,
440
437
separator_place : SeparatorPlace :: Back ,
441
438
shape : arm_shape,
442
- ends_with_newline : false ,
439
+ ends_with_newline : true ,
443
440
preserve_newline : true ,
444
441
config : context. config ,
445
442
} ;
446
443
444
+ if multi_branch_style {
445
+ result += " {\n " ;
446
+ result += & mac_indent_str;
447
+ }
448
+
447
449
result += write_list ( & branch_items, & fmt) ?. as_str ( ) ;
448
450
449
451
if multi_branch_style {
452
+ result += "\n " ;
450
453
result += & indent. to_string ( context. config ) ;
451
454
result += "}" ;
452
455
}
@@ -792,28 +795,29 @@ impl MacroParser {
792
795
// `(` ... `)` `=>` `{` ... `}`
793
796
fn parse_branch ( & mut self ) -> Option < MacroBranch > {
794
797
let tok = self . toks . next ( ) ?;
795
- let ( args_span , args_paren_kind) = match tok {
798
+ let ( lo , args_paren_kind) = match tok {
796
799
TokenTree :: Token ( ..) => return None ,
797
- TokenTree :: Delimited ( sp, ref d) => ( sp, d. delim ) ,
800
+ TokenTree :: Delimited ( sp, ref d) => ( sp. lo ( ) , d. delim ) ,
798
801
} ;
799
802
let args = tok. joint ( ) . into ( ) ;
800
803
match self . toks . next ( ) ? {
801
804
TokenTree :: Token ( _, Token :: FatArrow ) => { }
802
805
_ => return None ,
803
806
}
804
- let body = match self . toks . next ( ) ? {
807
+ let ( mut hi , body) = match self . toks . next ( ) ? {
805
808
TokenTree :: Token ( ..) => return None ,
806
809
TokenTree :: Delimited ( sp, _) => {
807
810
let data = sp. data ( ) ;
808
- Span :: new ( data. lo + BytePos ( 1 ) , data. hi - BytePos ( 1 ) , data. ctxt )
811
+ ( data . hi , Span :: new ( data. lo + BytePos ( 1 ) , data. hi - BytePos ( 1 ) , data. ctxt ) )
809
812
}
810
813
} ;
811
- if let Some ( TokenTree :: Token ( _ , Token :: Semi ) ) = self . toks . look_ahead ( 0 ) {
814
+ if let Some ( TokenTree :: Token ( sp , Token :: Semi ) ) = self . toks . look_ahead ( 0 ) {
812
815
self . toks . next ( ) ;
816
+ hi = sp. hi ( ) ;
813
817
}
814
818
Some ( MacroBranch {
819
+ span : mk_sp ( lo, hi) ,
815
820
args_paren_kind,
816
- args_span,
817
821
args,
818
822
body,
819
823
} )
@@ -828,8 +832,8 @@ struct Macro {
828
832
// FIXME: it would be more efficient to use references to the token streams
829
833
// rather than clone them, if we can make the borrowing work out.
830
834
struct MacroBranch {
835
+ span : Span ,
831
836
args_paren_kind : DelimToken ,
832
- args_span : Span ,
833
837
args : ThinTokenStream ,
834
838
body : Span ,
835
839
}
0 commit comments