diff options
Diffstat (limited to 'src/libsyntax/print/pprust.rs')
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 42f156d6a11..699b4f43b14 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1164,11 +1164,20 @@ impl<'a> State<'a> { pub fn print_tts(&mut self, tts: &[ast::TokenTree]) -> IoResult<()> { try!(self.ibox(0)); + let mut suppress_space = false; for (i, tt) in tts.iter().enumerate() { - if i != 0 { + if i != 0 && !suppress_space { try!(space(&mut self.s)); } try!(self.print_tt(tt)); + // There should be no space between the module name and the following `::` in paths, + // otherwise imported macros get re-parsed from crate metadata incorrectly (#20701) + suppress_space = match tt { + &ast::TtToken(_, token::Ident(_, token::ModName)) | + &ast::TtToken(_, token::MatchNt(_, _, _, token::ModName)) | + &ast::TtToken(_, token::SubstNt(_, token::ModName)) => true, + _ => false + } } self.end() } @@ -1618,7 +1627,7 @@ impl<'a> State<'a> { rhs: &ast::Expr) -> IoResult<()> { try!(self.print_expr(lhs)); try!(space(&mut self.s)); - try!(self.word_space(ast_util::binop_to_string(op))); + try!(self.word_space(ast_util::binop_to_string(op.node))); self.print_expr(rhs) } @@ -1786,7 +1795,7 @@ impl<'a> State<'a> { ast::ExprAssignOp(op, ref lhs, ref rhs) => { try!(self.print_expr(&**lhs)); try!(space(&mut self.s)); - try!(word(&mut self.s, ast_util::binop_to_string(op))); + try!(word(&mut self.s, ast_util::binop_to_string(op.node))); try!(self.word_space("=")); try!(self.print_expr(&**rhs)); } |
