Skip to content

Commit 178a339

Browse files
committed
Reorder use items inside blocks
1 parent 8e5c760 commit 178a339

File tree

2 files changed

+45
-16
lines changed

2 files changed

+45
-16
lines changed

src/imports.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
use std::cmp::Ordering;
1212

13-
use syntax::{ast, ptr};
13+
use syntax::ast;
1414
use syntax::codemap::{BytePos, Span};
1515

1616
use {Shape, Spanned};
@@ -216,7 +216,7 @@ fn rewrite_import(
216216

217217
fn rewrite_imports(
218218
context: &RewriteContext,
219-
use_items: &[ptr::P<ast::Item>],
219+
use_items: &[&ast::Item],
220220
shape: Shape,
221221
span: Span,
222222
) -> Option<String> {
@@ -275,7 +275,7 @@ fn rewrite_imports(
275275
}
276276

277277
impl<'a> FmtVisitor<'a> {
278-
pub fn format_imports(&mut self, use_items: &[ptr::P<ast::Item>]) {
278+
pub fn format_imports(&mut self, use_items: &[&ast::Item]) {
279279
if use_items.is_empty() {
280280
return;
281281
}

src/visitor.rs

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use std::cmp;
1212

1313
use strings::string_buffer::StringBuffer;
14-
use syntax::{ast, ptr, visit};
14+
use syntax::{ast, visit};
1515
use syntax::attr::HasAttrs;
1616
use syntax::codemap::{self, BytePos, CodeMap, Pos, Span};
1717
use syntax::parse::ParseSess;
@@ -30,7 +30,7 @@ use lists::{itemize_list, write_list, DefinitiveListTactic, ListFormatting, Sepa
3030
use macros::{rewrite_macro, MacroPosition};
3131
use regex::Regex;
3232
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};
3434

3535
fn is_use_item(item: &ast::Item) -> bool {
3636
match item.node {
@@ -152,9 +152,7 @@ impl<'a> FmtVisitor<'a> {
152152
self.visit_attrs(attrs, ast::AttrStyle::Inner);
153153
}
154154

155-
for stmt in &b.stmts {
156-
self.visit_stmt(stmt)
157-
}
155+
self.walk_block_stmts(b);
158156

159157
if !b.stmts.is_empty() {
160158
if let Some(expr) = utils::stmt_expr(&b.stmts[b.stmts.len() - 1]) {
@@ -641,12 +639,7 @@ impl<'a> FmtVisitor<'a> {
641639
false
642640
}
643641

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
650643
where
651644
F: Fn(&ast::Item) -> bool,
652645
{
@@ -679,8 +672,7 @@ impl<'a> FmtVisitor<'a> {
679672
item_length
680673
}
681674

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]) {
684676
while !items_left.is_empty() {
685677
// If the next item is a `use` declaration, then extract it and any subsequent `use`s
686678
// to be potentially reordered within `format_imports`. Otherwise, just format the
@@ -711,6 +703,43 @@ impl<'a> FmtVisitor<'a> {
711703
}
712704
}
713705

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+
714743
fn format_mod(
715744
&mut self,
716745
m: &ast::Mod,

0 commit comments

Comments
 (0)