diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-07-13 19:11:07 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-07-15 12:42:07 +0300 |
| commit | 65a714a6a0848d5604e1d5f847a06e196951e669 (patch) | |
| tree | 3c8e7499bee15a77ac65d07e5a8dbca25cdca54b /src/libsyntax | |
| parent | 9bb855cda0c5ae97faf5dbf1cd4935dd37fad066 (diff) | |
| download | rust-65a714a6a0848d5604e1d5f847a06e196951e669.tar.gz rust-65a714a6a0848d5604e1d5f847a06e196951e669.zip | |
pprust: Move some methods to the `PrintState` trait
So that path and macro argument printing code can be shared
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 267 |
1 files changed, 132 insertions, 135 deletions
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 0e3ce2787f3..5f3d691400b 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -188,7 +188,7 @@ pub fn literal_to_string(lit: token::Lit) -> String { } /// Print an ident from AST, `$crate` is converted into its respective crate name. -fn ast_ident_to_string(ident: ast::Ident, is_raw: bool) -> String { +pub fn ast_ident_to_string(ident: ast::Ident, is_raw: bool) -> String { ident_to_string(ident.name, is_raw, Some(ident.span)) } @@ -446,6 +446,8 @@ impl std::ops::DerefMut for State<'_> { pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefMut { fn comments(&mut self) -> &mut Option<Comments<'a>>; + fn print_ident(&mut self, ident: ast::Ident); + fn print_generic_args(&mut self, args: &ast::GenericArgs, colons_before_params: bool); fn commasep<T, F>(&mut self, b: Breaks, elts: &[T], mut op: F) where F: FnMut(&mut Self, &T), @@ -596,17 +598,6 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM } } - fn print_attribute_path(&mut self, path: &ast::Path) { - for (i, segment) in path.segments.iter().enumerate() { - if i > 0 { - self.word("::"); - } - if segment.ident.name != kw::PathRoot { - self.word(ast_ident_to_string(segment.ident, segment.ident.is_raw_guess())); - } - } - } - fn print_attribute(&mut self, attr: &ast::Attribute) { self.print_attribute_inline(attr, false) } @@ -628,7 +619,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM if let Some(mi) = attr.meta() { self.print_meta_item(&mi); } else { - self.print_attribute_path(&attr.path); + self.print_path(&attr.path, false, 0); self.space(); self.print_tts(attr.tokens.clone(), true); } @@ -650,15 +641,15 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM fn print_meta_item(&mut self, item: &ast::MetaItem) { self.ibox(INDENT_UNIT); match item.node { - ast::MetaItemKind::Word => self.print_attribute_path(&item.path), + ast::MetaItemKind::Word => self.print_path(&item.path, false, 0), ast::MetaItemKind::NameValue(ref value) => { - self.print_attribute_path(&item.path); + self.print_path(&item.path, false, 0); self.space(); self.word_space("="); self.print_literal(value); } ast::MetaItemKind::List(ref items) => { - self.print_attribute_path(&item.path); + self.print_path(&item.path, false, 0); self.popen(); self.commasep(Consistent, &items[..], @@ -707,16 +698,56 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM } self.end(); } -} -impl<'a> PrintState<'a> for State<'a> { - fn comments(&mut self) -> &mut Option<Comments<'a>> { - &mut self.comments + fn print_mac_common( + &mut self, + path: &ast::Path, + has_bang: bool, + tts: TokenStream, + delim: MacDelimiter, + span: Span, + ) { + self.print_path(path, false, 0); + if has_bang { + self.word("!"); + } + match delim { + MacDelimiter::Parenthesis => self.popen(), + MacDelimiter::Bracket => self.word("["), + MacDelimiter::Brace => { + self.head(""); + self.bopen(); + } + } + self.print_tts(tts, true); + match delim { + MacDelimiter::Parenthesis => self.pclose(), + MacDelimiter::Bracket => self.word("]"), + MacDelimiter::Brace => self.bclose(span), + } } -} -impl<'a> State<'a> { - crate fn head<S: Into<Cow<'static, str>>>(&mut self, w: S) { + fn print_path(&mut self, path: &ast::Path, colons_before_params: bool, depth: usize) { + self.maybe_print_comment(path.span.lo()); + + for (i, segment) in path.segments[..path.segments.len() - depth].iter().enumerate() { + if i > 0 { + self.word("::") + } + self.print_path_segment(segment, colons_before_params); + } + } + + fn print_path_segment(&mut self, segment: &ast::PathSegment, colons_before_params: bool) { + if segment.ident.name != kw::PathRoot { + self.print_ident(segment.ident); + if let Some(ref args) = segment.args { + self.print_generic_args(args, colons_before_params); + } + } + } + + fn head<S: Into<Cow<'static, str>>>(&mut self, w: S) { let w = w.into(); // outer-box is consistent self.cbox(INDENT_UNIT); @@ -728,36 +759,103 @@ impl<'a> State<'a> { } } - crate fn bopen(&mut self) { - self.s.word("{"); + fn bopen(&mut self) { + self.word("{"); self.end(); // close the head-box } - crate fn bclose_maybe_open(&mut self, span: syntax_pos::Span, close_box: bool) { + fn bclose_maybe_open(&mut self, span: syntax_pos::Span, close_box: bool) { self.maybe_print_comment(span.hi()); self.break_offset_if_not_bol(1, -(INDENT_UNIT as isize)); - self.s.word("}"); + self.word("}"); if close_box { self.end(); // close the outer-box } } - crate fn bclose(&mut self, span: syntax_pos::Span) { + + fn bclose(&mut self, span: syntax_pos::Span) { self.bclose_maybe_open(span, true) } - crate fn break_offset_if_not_bol(&mut self, n: usize, off: isize) { - if !self.s.is_beginning_of_line() { - self.s.break_offset(n, off) + fn break_offset_if_not_bol(&mut self, n: usize, off: isize) { + if !self.is_beginning_of_line() { + self.break_offset(n, off) } else { - if off != 0 && self.s.last_token().is_hardbreak_tok() { + if off != 0 && self.last_token().is_hardbreak_tok() { // We do something pretty sketchy here: tuck the nonzero // offset-adjustment we were going to deposit along with the // break into the previous hardbreak. - self.s.replace_last_token(pp::Printer::hardbreak_tok_offset(off)); + self.replace_last_token(pp::Printer::hardbreak_tok_offset(off)); } } } +} +impl<'a> PrintState<'a> for State<'a> { + fn comments(&mut self) -> &mut Option<Comments<'a>> { + &mut self.comments + } + + fn print_ident(&mut self, ident: ast::Ident) { + self.s.word(ast_ident_to_string(ident, ident.is_raw_guess())); + self.ann.post(self, AnnNode::Ident(&ident)) + } + + fn print_generic_args(&mut self, args: &ast::GenericArgs, colons_before_params: bool) { + if colons_before_params { + self.s.word("::") + } + + match *args { + ast::GenericArgs::AngleBracketed(ref data) => { + self.s.word("<"); + + self.commasep(Inconsistent, &data.args, |s, generic_arg| { + s.print_generic_arg(generic_arg) + }); + + let mut comma = data.args.len() != 0; + + for constraint in data.constraints.iter() { + if comma { + self.word_space(",") + } + self.print_ident(constraint.ident); + self.s.space(); + match constraint.kind { + ast::AssocTyConstraintKind::Equality { ref ty } => { + self.word_space("="); + self.print_type(ty); + } + ast::AssocTyConstraintKind::Bound { ref bounds } => { + self.print_type_bounds(":", &*bounds); + } + } + comma = true; + } + + self.s.word(">") + } + + ast::GenericArgs::Parenthesized(ref data) => { + self.s.word("("); + self.commasep( + Inconsistent, + &data.inputs, + |s, ty| s.print_type(ty)); + self.s.word(")"); + + if let Some(ref ty) = data.output { + self.space_if_not_bol(); + self.word_space("->"); + self.print_type(ty); + } + } + } + } +} + +impl<'a> State<'a> { // Synthesizes a comment that was not textually present in the original source // file. pub fn synth_comment(&mut self, text: String) { @@ -1645,22 +1743,7 @@ impl<'a> State<'a> { } crate fn print_mac(&mut self, m: &ast::Mac) { - self.print_path(&m.node.path, false, 0); - self.s.word("!"); - match m.node.delim { - MacDelimiter::Parenthesis => self.popen(), - MacDelimiter::Bracket => self.s.word("["), - MacDelimiter::Brace => { - self.head(""); - self.bopen(); - } - } - self.print_tts(m.node.stream(), true); - match m.node.delim { - MacDelimiter::Parenthesis => self.pclose(), - MacDelimiter::Bracket => self.s.word("]"), - MacDelimiter::Brace => self.bclose(m.span), - } + self.print_mac_common(&m.node.path, true, m.node.stream(), m.node.delim, m.span); } @@ -2204,11 +2287,6 @@ impl<'a> State<'a> { } } - crate fn print_ident(&mut self, ident: ast::Ident) { - self.s.word(ast_ident_to_string(ident, ident.is_raw_guess())); - self.ann.post(self, AnnNode::Ident(&ident)) - } - crate fn print_usize(&mut self, i: usize) { self.s.word(i.to_string()) } @@ -2218,31 +2296,6 @@ impl<'a> State<'a> { self.ann.post(self, AnnNode::Name(&name)) } - fn print_path(&mut self, - path: &ast::Path, - colons_before_params: bool, - depth: usize) { - self.maybe_print_comment(path.span.lo()); - - for (i, segment) in path.segments[..path.segments.len() - depth].iter().enumerate() { - if i > 0 { - self.s.word("::") - } - self.print_path_segment(segment, colons_before_params); - } - } - - fn print_path_segment(&mut self, - segment: &ast::PathSegment, - colons_before_params: bool) { - if segment.ident.name != kw::PathRoot { - self.print_ident(segment.ident); - if let Some(ref args) = segment.args { - self.print_generic_args(args, colons_before_params); - } - } - } - fn print_qpath(&mut self, path: &ast::Path, qself: &ast::QSelf, @@ -2266,62 +2319,6 @@ impl<'a> State<'a> { } } - fn print_generic_args(&mut self, - args: &ast::GenericArgs, - colons_before_params: bool) - { - if colons_before_params { - self.s.word("::") - } - - match *args { - ast::GenericArgs::AngleBracketed(ref data) => { - self.s.word("<"); - - self.commasep(Inconsistent, &data.args, |s, generic_arg| { - s.print_generic_arg(generic_arg) - }); - - let mut comma = data.args.len() != 0; - - for constraint in data.constraints.iter() { - if comma { - self.word_space(",") - } - self.print_ident(constraint.ident); - self.s.space(); - match constraint.kind { - ast::AssocTyConstraintKind::Equality { ref ty } => { - self.word_space("="); - self.print_type(ty); - } - ast::AssocTyConstraintKind::Bound { ref bounds } => { - self.print_type_bounds(":", &*bounds); - } - } - comma = true; - } - - self.s.word(">") - } - - ast::GenericArgs::Parenthesized(ref data) => { - self.s.word("("); - self.commasep( - Inconsistent, - &data.inputs, - |s, ty| s.print_type(ty)); - self.s.word(")"); - - if let Some(ref ty) = data.output { - self.space_if_not_bol(); - self.word_space("->"); - self.print_type(ty); - } - } - } - } - crate fn print_pat(&mut self, pat: &ast::Pat) { self.maybe_print_comment(pat.span.lo()); self.ann.pre(self, AnnNode::Pat(pat)); |
