11
11
use std:: cmp;
12
12
13
13
use strings:: string_buffer:: StringBuffer ;
14
- use syntax:: { ast, ptr , visit} ;
14
+ use syntax:: { ast, visit} ;
15
15
use syntax:: attr:: HasAttrs ;
16
16
use syntax:: codemap:: { self , BytePos , CodeMap , Pos , Span } ;
17
17
use syntax:: parse:: ParseSess ;
@@ -30,7 +30,7 @@ use lists::{itemize_list, write_list, DefinitiveListTactic, ListFormatting, Sepa
30
30
use macros:: { rewrite_macro, MacroPosition } ;
31
31
use regex:: Regex ;
32
32
use rewrite:: { Rewrite , RewriteContext } ;
33
- use utils:: { self , contains_skip, inner_attributes, mk_sp} ;
33
+ use utils:: { self , contains_skip, inner_attributes, mk_sp, ptr_vec_to_ref_vec } ;
34
34
35
35
fn is_use_item ( item : & ast:: Item ) -> bool {
36
36
match item. node {
@@ -152,9 +152,7 @@ impl<'a> FmtVisitor<'a> {
152
152
self . visit_attrs ( attrs, ast:: AttrStyle :: Inner ) ;
153
153
}
154
154
155
- for stmt in & b. stmts {
156
- self . visit_stmt ( stmt)
157
- }
155
+ self . walk_block_stmts ( b) ;
158
156
159
157
if !b. stmts . is_empty ( ) {
160
158
if let Some ( expr) = utils:: stmt_expr ( & b. stmts [ b. stmts . len ( ) - 1 ] ) {
@@ -641,12 +639,7 @@ impl<'a> FmtVisitor<'a> {
641
639
false
642
640
}
643
641
644
- fn reorder_items < F > (
645
- & mut self ,
646
- items_left : & [ ptr:: P < ast:: Item > ] ,
647
- is_item : & F ,
648
- in_group : bool ,
649
- ) -> usize
642
+ fn reorder_items < F > ( & mut self , items_left : & [ & ast:: Item ] , is_item : & F , in_group : bool ) -> usize
650
643
where
651
644
F : Fn ( & ast:: Item ) -> bool ,
652
645
{
@@ -679,8 +672,7 @@ impl<'a> FmtVisitor<'a> {
679
672
item_length
680
673
}
681
674
682
- fn walk_mod_items ( & mut self , m : & ast:: Mod ) {
683
- let mut items_left: & [ ptr:: P < ast:: Item > ] = & m. items ;
675
+ fn walk_items ( & mut self , mut items_left : & [ & ast:: Item ] ) {
684
676
while !items_left. is_empty ( ) {
685
677
// If the next item is a `use` declaration, then extract it and any subsequent `use`s
686
678
// to be potentially reordered within `format_imports`. Otherwise, just format the
@@ -711,6 +703,43 @@ impl<'a> FmtVisitor<'a> {
711
703
}
712
704
}
713
705
706
+ fn walk_mod_items ( & mut self , m : & ast:: Mod ) {
707
+ self . walk_items ( & ptr_vec_to_ref_vec ( & m. items ) ) ;
708
+ }
709
+
710
+ fn walk_stmts ( & mut self , stmts : & [ ast:: Stmt ] ) {
711
+ fn to_stmt_item ( stmt : & ast:: Stmt ) -> Option < & ast:: Item > {
712
+ match stmt. node {
713
+ ast:: StmtKind :: Item ( ref item) => Some ( & * * item) ,
714
+ _ => None ,
715
+ }
716
+ }
717
+
718
+ if stmts. is_empty ( ) {
719
+ return ;
720
+ }
721
+
722
+ // Extract leading `use ...;`.
723
+ let items: Vec < _ > = stmts
724
+ . iter ( )
725
+ . take_while ( |stmt| to_stmt_item ( stmt) . is_some ( ) )
726
+ . filter_map ( |stmt| to_stmt_item ( stmt) )
727
+ . take_while ( |item| is_use_item ( item) )
728
+ . collect ( ) ;
729
+
730
+ if items. is_empty ( ) {
731
+ self . visit_stmt ( & stmts[ 0 ] ) ;
732
+ self . walk_stmts ( & stmts[ 1 ..] ) ;
733
+ } else {
734
+ self . walk_items ( & items) ;
735
+ self . walk_stmts ( & stmts[ items. len ( ) ..] ) ;
736
+ }
737
+ }
738
+
739
+ fn walk_block_stmts ( & mut self , b : & ast:: Block ) {
740
+ self . walk_stmts ( & b. stmts )
741
+ }
742
+
714
743
fn format_mod (
715
744
& mut self ,
716
745
m : & ast:: Mod ,
0 commit comments