Change struct expr pretty printing to match rustfmt style
This commit is contained in:
parent
63406ac771
commit
40fcbbafa0
3 changed files with 84 additions and 32 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
mod delimited;
|
||||||
mod expr;
|
mod expr;
|
||||||
mod item;
|
mod item;
|
||||||
|
|
||||||
|
@ -23,6 +24,8 @@ use rustc_span::{BytePos, FileName, Span};
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
|
pub use self::delimited::IterDelimited;
|
||||||
|
|
||||||
pub enum MacHeader<'a> {
|
pub enum MacHeader<'a> {
|
||||||
Path(&'a ast::Path),
|
Path(&'a ast::Path),
|
||||||
Keyword(&'static str),
|
Keyword(&'static str),
|
||||||
|
|
41
compiler/rustc_ast_pretty/src/pprust/state/delimited.rs
Normal file
41
compiler/rustc_ast_pretty/src/pprust/state/delimited.rs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
use std::iter::Peekable;
|
||||||
|
use std::mem;
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
pub struct Delimited<I: Iterator> {
|
||||||
|
is_first: bool,
|
||||||
|
iter: Peekable<I>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait IterDelimited: Iterator + Sized {
|
||||||
|
fn delimited(self) -> Delimited<Self> {
|
||||||
|
Delimited { is_first: true, iter: self.peekable() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<I: Iterator> IterDelimited for I {}
|
||||||
|
|
||||||
|
pub struct IteratorItem<T> {
|
||||||
|
value: T,
|
||||||
|
pub is_first: bool,
|
||||||
|
pub is_last: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<I: Iterator> Iterator for Delimited<I> {
|
||||||
|
type Item = IteratorItem<I::Item>;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
let value = self.iter.next()?;
|
||||||
|
let is_first = mem::replace(&mut self.is_first, false);
|
||||||
|
let is_last = self.iter.peek().is_none();
|
||||||
|
Some(IteratorItem { value, is_first, is_last })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Deref for IteratorItem<T> {
|
||||||
|
type Target = T;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.value
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::pp::Breaks::{Consistent, Inconsistent};
|
use crate::pp::Breaks::Inconsistent;
|
||||||
use crate::pprust::state::{AnnNode, PrintState, State, INDENT_UNIT};
|
use crate::pprust::state::{AnnNode, IterDelimited, PrintState, State, INDENT_UNIT};
|
||||||
|
|
||||||
use rustc_ast::ptr::P;
|
use rustc_ast::ptr::P;
|
||||||
use rustc_ast::util::parser::{self, AssocOp, Fixity};
|
use rustc_ast::util::parser::{self, AssocOp, Fixity};
|
||||||
|
@ -117,38 +117,46 @@ impl<'a> State<'a> {
|
||||||
} else {
|
} else {
|
||||||
self.print_path(path, true, 0);
|
self.print_path(path, true, 0);
|
||||||
}
|
}
|
||||||
|
self.nbsp();
|
||||||
self.word("{");
|
self.word("{");
|
||||||
self.commasep_cmnt(
|
let has_rest = match rest {
|
||||||
Consistent,
|
ast::StructRest::Base(_) | ast::StructRest::Rest(_) => true,
|
||||||
fields,
|
ast::StructRest::None => false,
|
||||||
|s, field| {
|
};
|
||||||
s.print_outer_attributes(&field.attrs);
|
if fields.is_empty() && !has_rest {
|
||||||
s.ibox(INDENT_UNIT);
|
self.word("}");
|
||||||
if !field.is_shorthand {
|
return;
|
||||||
s.print_ident(field.ident);
|
|
||||||
s.word_space(":");
|
|
||||||
}
|
|
||||||
s.print_expr(&field.expr);
|
|
||||||
s.end();
|
|
||||||
},
|
|
||||||
|f| f.span,
|
|
||||||
);
|
|
||||||
match rest {
|
|
||||||
ast::StructRest::Base(_) | ast::StructRest::Rest(_) => {
|
|
||||||
self.ibox(INDENT_UNIT);
|
|
||||||
if !fields.is_empty() {
|
|
||||||
self.word(",");
|
|
||||||
self.space();
|
|
||||||
}
|
|
||||||
self.word("..");
|
|
||||||
if let ast::StructRest::Base(ref expr) = *rest {
|
|
||||||
self.print_expr(expr);
|
|
||||||
}
|
|
||||||
self.end();
|
|
||||||
}
|
|
||||||
ast::StructRest::None if !fields.is_empty() => self.word(","),
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
|
self.cbox(0);
|
||||||
|
for field in fields.iter().delimited() {
|
||||||
|
self.maybe_print_comment(field.span.hi());
|
||||||
|
self.print_outer_attributes(&field.attrs);
|
||||||
|
if field.is_first {
|
||||||
|
self.space_if_not_bol();
|
||||||
|
}
|
||||||
|
if !field.is_shorthand {
|
||||||
|
self.print_ident(field.ident);
|
||||||
|
self.word_nbsp(":");
|
||||||
|
}
|
||||||
|
self.print_expr(&field.expr);
|
||||||
|
if !field.is_last || has_rest {
|
||||||
|
self.word_space(",");
|
||||||
|
} else {
|
||||||
|
self.trailing_comma();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if has_rest {
|
||||||
|
if fields.is_empty() {
|
||||||
|
self.space();
|
||||||
|
}
|
||||||
|
self.word("..");
|
||||||
|
if let ast::StructRest::Base(expr) = rest {
|
||||||
|
self.print_expr(expr);
|
||||||
|
}
|
||||||
|
self.space();
|
||||||
|
}
|
||||||
|
self.offset(-INDENT_UNIT);
|
||||||
|
self.end();
|
||||||
self.word("}");
|
self.word("}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue