@@ -82,6 +82,7 @@ pub struct FmtVisitor<'a> {
82
82
pub is_if_else_block : bool ,
83
83
pub snippet_provider : & ' a SnippetProvider < ' a > ,
84
84
pub line_number : usize ,
85
+ pub skipped_range : Vec < ( usize , usize ) > ,
85
86
}
86
87
87
88
impl < ' b , ' a : ' b > FmtVisitor < ' a > {
@@ -101,13 +102,17 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
101
102
self . visit_item ( item) ;
102
103
}
103
104
ast:: StmtKind :: Local ( ..) | ast:: StmtKind :: Expr ( ..) | ast:: StmtKind :: Semi ( ..) => {
104
- let rewrite = stmt. rewrite ( & self . get_context ( ) , self . shape ( ) ) ;
105
- self . push_rewrite ( stmt. span ( ) , rewrite)
105
+ if contains_skip ( get_attrs_from_stmt ( stmt) ) {
106
+ self . push_skipped_with_span ( stmt. span ( ) ) ;
107
+ } else {
108
+ let rewrite = stmt. rewrite ( & self . get_context ( ) , self . shape ( ) ) ;
109
+ self . push_rewrite ( stmt. span ( ) , rewrite)
110
+ }
106
111
}
107
112
ast:: StmtKind :: Mac ( ref mac) => {
108
113
let ( ref mac, _macro_style, ref attrs) = * * mac;
109
114
if self . visit_attrs ( attrs, ast:: AttrStyle :: Outer ) {
110
- self . push_rewrite ( stmt. span ( ) , None ) ;
115
+ self . push_skipped_with_span ( stmt. span ( ) ) ;
111
116
} else {
112
117
self . visit_mac ( mac, None , MacroPosition :: Statement ) ;
113
118
}
@@ -321,7 +326,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
321
326
// Module is inline, in this case we treat modules like any
322
327
// other item.
323
328
if self . visit_attrs ( & item. attrs , ast:: AttrStyle :: Outer ) {
324
- self . push_rewrite ( item. span , None ) ;
329
+ self . push_skipped_with_span ( item. span ( ) ) ;
325
330
return ;
326
331
}
327
332
} else if contains_skip ( & item. attrs ) {
@@ -349,7 +354,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
349
354
}
350
355
_ => {
351
356
if self . visit_attrs ( & item. attrs , ast:: AttrStyle :: Outer ) {
352
- self . push_rewrite ( item. span , None ) ;
357
+ self . push_skipped_with_span ( item. span ( ) ) ;
353
358
return ;
354
359
}
355
360
}
@@ -436,7 +441,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
436
441
skip_out_of_file_lines_range_visitor ! ( self , ti. span) ;
437
442
438
443
if self . visit_attrs ( & ti. attrs , ast:: AttrStyle :: Outer ) {
439
- self . push_rewrite ( ti. span , None ) ;
444
+ self . push_skipped_with_span ( ti. span ( ) ) ;
440
445
return ;
441
446
}
442
447
@@ -478,7 +483,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
478
483
skip_out_of_file_lines_range_visitor ! ( self , ii. span) ;
479
484
480
485
if self . visit_attrs ( & ii. attrs , ast:: AttrStyle :: Outer ) {
481
- self . push_rewrite ( ii. span , None ) ;
486
+ self . push_skipped_with_span ( ii. span ( ) ) ;
482
487
return ;
483
488
}
484
489
@@ -525,8 +530,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
525
530
self . buffer . push_str ( s) ;
526
531
}
527
532
528
- pub fn push_rewrite ( & mut self , span : Span , rewrite : Option < String > ) {
529
- self . format_missing_with_indent ( source ! ( self , span) . lo ( ) ) ;
533
+ fn push_rewrite_inner ( & mut self , span : Span , rewrite : Option < String > ) {
530
534
if let Some ( ref s) = rewrite {
531
535
self . push_str ( s) ;
532
536
} else {
@@ -536,6 +540,19 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
536
540
self . last_pos = source ! ( self , span) . hi ( ) ;
537
541
}
538
542
543
+ pub fn push_rewrite ( & mut self , span : Span , rewrite : Option < String > ) {
544
+ self . format_missing_with_indent ( source ! ( self , span) . lo ( ) ) ;
545
+ self . push_rewrite_inner ( span, rewrite) ;
546
+ }
547
+
548
+ pub fn push_skipped_with_span ( & mut self , span : Span ) {
549
+ self . format_missing_with_indent ( source ! ( self , span) . lo ( ) ) ;
550
+ let lo = self . line_number + 1 ;
551
+ self . push_rewrite_inner ( span, None ) ;
552
+ let hi = self . line_number + 1 ;
553
+ self . skipped_range . push ( ( lo, hi) ) ;
554
+ }
555
+
539
556
pub fn from_context ( ctx : & ' a RewriteContext ) -> FmtVisitor < ' a > {
540
557
FmtVisitor :: from_codemap ( ctx. parse_session , ctx. config , ctx. snippet_provider )
541
558
}
@@ -555,6 +572,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
555
572
is_if_else_block : false ,
556
573
snippet_provider : snippet_provider,
557
574
line_number : 0 ,
575
+ skipped_range : vec ! [ ] ,
558
576
}
559
577
}
560
578
@@ -1058,3 +1076,12 @@ pub fn rewrite_extern_crate(context: &RewriteContext, item: &ast::Item) -> Optio
1058
1076
String :: from ( & * Regex :: new ( r"\s;" ) . unwrap ( ) . replace ( no_whitespace, ";" ) )
1059
1077
} )
1060
1078
}
1079
+
1080
+ fn get_attrs_from_stmt ( stmt : & ast:: Stmt ) -> & [ ast:: Attribute ] {
1081
+ match stmt. node {
1082
+ ast:: StmtKind :: Local ( ref local) => & local. attrs ,
1083
+ ast:: StmtKind :: Item ( ref item) => & item. attrs ,
1084
+ ast:: StmtKind :: Expr ( ref expr) | ast:: StmtKind :: Semi ( ref expr) => & expr. attrs ,
1085
+ ast:: StmtKind :: Mac ( ref mac) => & mac. 2 ,
1086
+ }
1087
+ }
0 commit comments