Pretty print ItemKind::Use in rustfmt style

This commit is contained in:
David Tolnay 2022-02-07 21:03:06 -08:00
parent 8b13fd447a
commit d1b9e4a6f2
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
3 changed files with 39 additions and 15 deletions

View File

@ -75,6 +75,10 @@ impl Printer {
} }
pub fn trailing_comma(&mut self) { pub fn trailing_comma(&mut self) {
self.scan_break(BreakToken { pre_break: Some(','), ..BreakToken::default() });
}
pub fn trailing_comma_or_space(&mut self) {
self.scan_break(BreakToken { self.scan_break(BreakToken {
blank_space: 1, blank_space: 1,
pre_break: Some(','), pre_break: Some(','),

View File

@ -142,7 +142,7 @@ impl<'a> State<'a> {
if !field.is_last || has_rest { if !field.is_last || has_rest {
self.word_space(","); self.word_space(",");
} else { } else {
self.trailing_comma(); self.trailing_comma_or_space();
} }
} }
if has_rest { if has_rest {

View File

@ -1,5 +1,6 @@
use crate::pp::Breaks::Inconsistent; use crate::pp::Breaks::Inconsistent;
use crate::pprust::state::{AnnNode, PrintState, State}; use crate::pprust::state::delimited::IterDelimited;
use crate::pprust::state::{AnnNode, PrintState, State, INDENT_UNIT};
use rustc_ast as ast; use rustc_ast as ast;
use rustc_ast::GenericBound; use rustc_ast::GenericBound;
@ -138,11 +139,10 @@ impl<'a> State<'a> {
self.end(); // end outer head-block self.end(); // end outer head-block
} }
ast::ItemKind::Use(ref tree) => { ast::ItemKind::Use(ref tree) => {
self.head(visibility_qualified(&item.vis, "use")); self.print_visibility(&item.vis);
self.word_nbsp("use");
self.print_use_tree(tree); self.print_use_tree(tree);
self.word(";"); self.word(";");
self.end(); // end inner head-block
self.end(); // end outer head-block
} }
ast::ItemKind::Static(ref ty, mutbl, ref body) => { ast::ItemKind::Static(ref ty, mutbl, ref body) => {
let def = ast::Defaultness::Final; let def = ast::Defaultness::Final;
@ -615,8 +615,8 @@ impl<'a> State<'a> {
ast::UseTreeKind::Simple(rename, ..) => { ast::UseTreeKind::Simple(rename, ..) => {
self.print_path(&tree.prefix, false, 0); self.print_path(&tree.prefix, false, 0);
if let Some(rename) = rename { if let Some(rename) = rename {
self.space(); self.nbsp();
self.word_space("as"); self.word_nbsp("as");
self.print_ident(rename); self.print_ident(rename);
} }
} }
@ -628,16 +628,36 @@ impl<'a> State<'a> {
self.word("*"); self.word("*");
} }
ast::UseTreeKind::Nested(ref items) => { ast::UseTreeKind::Nested(ref items) => {
if tree.prefix.segments.is_empty() { if !tree.prefix.segments.is_empty() {
self.word("{");
} else {
self.print_path(&tree.prefix, false, 0); self.print_path(&tree.prefix, false, 0);
self.word("::{"); self.word("::");
}
if items.is_empty() {
self.word("{}");
} else if items.len() == 1 {
self.print_use_tree(&items[0].0);
} else {
self.cbox(INDENT_UNIT);
self.word("{");
self.zerobreak();
self.ibox(0);
for use_tree in items.iter().delimited() {
self.print_use_tree(&use_tree.0);
if !use_tree.is_last {
self.word(",");
if let ast::UseTreeKind::Nested(_) = use_tree.0.kind {
self.hardbreak();
} else {
self.space();
}
}
}
self.end();
self.trailing_comma();
self.offset(-INDENT_UNIT);
self.word("}");
self.end();
} }
self.commasep(Inconsistent, &items, |this, &(ref tree, _)| {
this.print_use_tree(tree)
});
self.word("}");
} }
} }
} }