From c67a34b9e509b76ff145526f28a20f9495c2ab61 Mon Sep 17 00:00:00 2001 From: Garming Sam Date: Thu, 6 Aug 2015 18:43:02 +1200 Subject: [PATCH 1/4] Binary ops should add parenthesis to each side Otherwise, we get (1 + 2) * 3 looking like 1 + 2 * 3 --- src/libsyntax/print/pprust.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 3b8ee91374c..147314739f8 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1670,10 +1670,10 @@ impl<'a> State<'a> { op: ast::BinOp, lhs: &ast::Expr, rhs: &ast::Expr) -> io::Result<()> { - try!(self.print_expr(lhs)); + try!(self.print_expr_maybe_paren(lhs)); try!(space(&mut self.s)); try!(self.word_space(ast_util::binop_to_string(op.node))); - self.print_expr(rhs) + self.print_expr_maybe_paren(rhs) } fn print_expr_unary(&mut self, From c0c6af7f073620aacfb103c070e997a8d50b7201 Mon Sep 17 00:00:00 2001 From: Garming Sam Date: Thu, 6 Aug 2015 19:55:27 +1200 Subject: [PATCH 2/4] Add operator precedence for pretty printer Previously it just added parentheses in excess. e.g. ((1 + 2) + 3) + 4 --- src/libsyntax/print/pprust.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 147314739f8..b3fd05325b1 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1555,6 +1555,21 @@ impl<'a> State<'a> { self.pclose() } + pub fn check_expr_bin_needs_paren(&mut self, sub_expr: &ast::Expr, + binop: ast::BinOp) -> bool { + match sub_expr.node { + ast::ExprBinary(ref sub_op, _, _) => { + if ast_util::operator_prec(sub_op.node) < + ast_util::operator_prec(binop.node) { + true + } else { + false + } + } + _ => true + } + } + pub fn print_expr_maybe_paren(&mut self, expr: &ast::Expr) -> io::Result<()> { let needs_par = needs_parentheses(expr); if needs_par { @@ -1670,10 +1685,18 @@ impl<'a> State<'a> { op: ast::BinOp, lhs: &ast::Expr, rhs: &ast::Expr) -> io::Result<()> { - try!(self.print_expr_maybe_paren(lhs)); + if self.check_expr_bin_needs_paren(lhs, op) { + try!(self.print_expr_maybe_paren(lhs)); + } else { + try!(self.print_expr(lhs)); + } try!(space(&mut self.s)); try!(self.word_space(ast_util::binop_to_string(op.node))); - self.print_expr_maybe_paren(rhs) + if self.check_expr_bin_needs_paren(rhs, op) { + self.print_expr_maybe_paren(rhs) + } else { + self.print_expr(rhs) + } } fn print_expr_unary(&mut self, From 6a51de0a0a846524dc76b027f52f0afec1597383 Mon Sep 17 00:00:00 2001 From: Garming Sam Date: Thu, 6 Aug 2015 19:57:41 +1200 Subject: [PATCH 3/4] Casts are a type of binop This just adds paren following the same cases as before --- src/libsyntax/print/pprust.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index b3fd05325b1..d59ab2ba565 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1753,7 +1753,7 @@ impl<'a> State<'a> { try!(self.print_literal(&**lit)); } ast::ExprCast(ref expr, ref ty) => { - try!(self.print_expr(&**expr)); + try!(self.print_expr_maybe_paren(&**expr)); try!(space(&mut self.s)); try!(self.word_space("as")); try!(self.print_type(&**ty)); From 22baa46f784856b6d6bb4374bcc3fb4b66bb8097 Mon Sep 17 00:00:00 2001 From: Garming Sam Date: Mon, 10 Aug 2015 04:45:57 +1200 Subject: [PATCH 4/4] Avoid adding extra paren with two casts --- src/libsyntax/print/pprust.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index d59ab2ba565..7919bd45ced 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1753,7 +1753,11 @@ impl<'a> State<'a> { try!(self.print_literal(&**lit)); } ast::ExprCast(ref expr, ref ty) => { - try!(self.print_expr_maybe_paren(&**expr)); + if let ast::ExprCast(..) = expr.node { + try!(self.print_expr(&**expr)); + } else { + try!(self.print_expr_maybe_paren(&**expr)); + } try!(space(&mut self.s)); try!(self.word_space("as")); try!(self.print_type(&**ty));