(&mut self, ast: &Expr, level: u8)
| 919 | } |
| 920 | |
| 921 | fn unparse_expr(&mut self, ast: &Expr, level: u8) { |
| 922 | macro_rules! opprec { |
| 923 | ($opty:ident, $x:expr, $enu:path, $($var:ident($op:literal, $prec:ident)),*$(,)?) => { |
| 924 | match $x { |
| 925 | $(<$enu>::$var => (opprec!(@space $opty, $op), precedence::$prec),)* |
| 926 | } |
| 927 | }; |
| 928 | (@space bin, $op:literal) => { |
| 929 | concat!(" ", $op, " ") |
| 930 | }; |
| 931 | (@space un, $op:literal) => { |
| 932 | $op |
| 933 | }; |
| 934 | } |
| 935 | macro_rules! group_if { |
| 936 | ($lvl:expr, $body:block) => {{ |
| 937 | let group = level > $lvl; |
| 938 | self.p_if(group, "("); |
| 939 | let ret = $body; |
| 940 | self.p_if(group, ")"); |
| 941 | ret |
| 942 | }}; |
| 943 | } |
| 944 | match ast { |
| 945 | Expr::BoolOp(ast::ExprBoolOp { |
| 946 | op, |
| 947 | values, |
| 948 | range: _, |
| 949 | node_index: _, |
| 950 | }) => { |
| 951 | let (op, prec) = opprec!(bin, op, BoolOp, And("and", AND), Or("or", OR)); |
| 952 | group_if!(prec, { |
| 953 | let mut first = true; |
| 954 | for val in values { |
| 955 | self.p_delim(&mut first, op); |
| 956 | self.unparse_expr(val, prec + 1); |
| 957 | } |
| 958 | }); |
| 959 | } |
| 960 | Expr::Named(ast::ExprNamed { |
| 961 | target, |
| 962 | value, |
| 963 | range: _, |
| 964 | node_index: _, |
| 965 | }) => { |
| 966 | group_if!(precedence::NAMED_EXPR, { |
| 967 | self.unparse_expr(target, precedence::NAMED_EXPR); |
| 968 | self.p(" := "); |
| 969 | self.unparse_expr(value, precedence::NAMED_EXPR + 1); |
| 970 | }); |
| 971 | } |
| 972 | Expr::BinOp(ast::ExprBinOp { |
| 973 | left, |
| 974 | op, |
| 975 | right, |
| 976 | range: _, |
| 977 | node_index: _, |
| 978 | }) => { |
no test coverage detected