From 8b13fd447a890507c8690929ad6840ea3de444aa Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 7 Feb 2022 21:24:13 -0800 Subject: [PATCH 1/3] Add pretty printer test for use trees --- src/test/pretty/use-tree.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/pretty/use-tree.rs diff --git a/src/test/pretty/use-tree.rs b/src/test/pretty/use-tree.rs new file mode 100644 index 0000000000000..299a08c63525b --- /dev/null +++ b/src/test/pretty/use-tree.rs @@ -0,0 +1,17 @@ +// pp-exact +// edition:2021 + +#![allow(unused_imports)] + +use ::std::fmt::{self, Debug, Display, Write as _}; + +use core::option::Option::*; + +use core::{cmp::{Eq, Ord, PartialEq, PartialOrd}, + convert::{AsMut, AsRef, From, Into}, + iter::{DoubleEndedIterator, ExactSizeIterator, Extend, FromIterator, + IntoIterator, Iterator}, + marker::{Copy as Copy, Send as Send, Sized as Sized, Sync as Sync, Unpin + as U}, ops::{*, Drop, Fn, FnMut, FnOnce}}; + +fn main() {} From d1b9e4a6f25854e3b6de8fcea73b8988b25654db Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 7 Feb 2022 21:03:06 -0800 Subject: [PATCH 2/3] Pretty print ItemKind::Use in rustfmt style --- .../rustc_ast_pretty/src/pp/convenience.rs | 4 ++ .../rustc_ast_pretty/src/pprust/state/expr.rs | 2 +- .../rustc_ast_pretty/src/pprust/state/item.rs | 48 +++++++++++++------ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/compiler/rustc_ast_pretty/src/pp/convenience.rs b/compiler/rustc_ast_pretty/src/pp/convenience.rs index 785e6886d8a38..93310dd45c575 100644 --- a/compiler/rustc_ast_pretty/src/pp/convenience.rs +++ b/compiler/rustc_ast_pretty/src/pp/convenience.rs @@ -75,6 +75,10 @@ impl Printer { } 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 { blank_space: 1, pre_break: Some(','), diff --git a/compiler/rustc_ast_pretty/src/pprust/state/expr.rs b/compiler/rustc_ast_pretty/src/pprust/state/expr.rs index 44116fa76a0c1..6435f1b6141e3 100644 --- a/compiler/rustc_ast_pretty/src/pprust/state/expr.rs +++ b/compiler/rustc_ast_pretty/src/pprust/state/expr.rs @@ -142,7 +142,7 @@ impl<'a> State<'a> { if !field.is_last || has_rest { self.word_space(","); } else { - self.trailing_comma(); + self.trailing_comma_or_space(); } } if has_rest { diff --git a/compiler/rustc_ast_pretty/src/pprust/state/item.rs b/compiler/rustc_ast_pretty/src/pprust/state/item.rs index dac84ae9d5fc8..d7e9ef0e50dd8 100644 --- a/compiler/rustc_ast_pretty/src/pprust/state/item.rs +++ b/compiler/rustc_ast_pretty/src/pprust/state/item.rs @@ -1,5 +1,6 @@ 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::GenericBound; @@ -138,11 +139,10 @@ impl<'a> State<'a> { self.end(); // end outer head-block } 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.word(";"); - self.end(); // end inner head-block - self.end(); // end outer head-block } ast::ItemKind::Static(ref ty, mutbl, ref body) => { let def = ast::Defaultness::Final; @@ -615,8 +615,8 @@ impl<'a> State<'a> { ast::UseTreeKind::Simple(rename, ..) => { self.print_path(&tree.prefix, false, 0); if let Some(rename) = rename { - self.space(); - self.word_space("as"); + self.nbsp(); + self.word_nbsp("as"); self.print_ident(rename); } } @@ -628,16 +628,36 @@ impl<'a> State<'a> { self.word("*"); } ast::UseTreeKind::Nested(ref items) => { - if tree.prefix.segments.is_empty() { - self.word("{"); - } else { + if !tree.prefix.segments.is_empty() { 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("}"); } } } From b64a8222ab1868490bbcadc160a8c868b2ce5d13 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 7 Feb 2022 21:34:04 -0800 Subject: [PATCH 3/3] Bless use tree pretty print test --- src/test/pretty/use-tree.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/test/pretty/use-tree.rs b/src/test/pretty/use-tree.rs index 299a08c63525b..5da9523524552 100644 --- a/src/test/pretty/use-tree.rs +++ b/src/test/pretty/use-tree.rs @@ -7,11 +7,17 @@ use ::std::fmt::{self, Debug, Display, Write as _}; use core::option::Option::*; -use core::{cmp::{Eq, Ord, PartialEq, PartialOrd}, +use core::{ + cmp::{Eq, Ord, PartialEq, PartialOrd}, convert::{AsMut, AsRef, From, Into}, - iter::{DoubleEndedIterator, ExactSizeIterator, Extend, FromIterator, - IntoIterator, Iterator}, - marker::{Copy as Copy, Send as Send, Sized as Sized, Sync as Sync, Unpin - as U}, ops::{*, Drop, Fn, FnMut, FnOnce}}; + iter::{ + DoubleEndedIterator, ExactSizeIterator, Extend, FromIterator, + IntoIterator, Iterator, + }, + marker::{ + Copy as Copy, Send as Send, Sized as Sized, Sync as Sync, Unpin as U, + }, + ops::{*, Drop, Fn, FnMut, FnOnce}, +}; fn main() {}