(&mut self)
| 938 | && trial.match_assign() |
| 939 | { |
| 940 | *self = trial; |
| 941 | let rvalue = self.parse_assignment()?; |
| 942 | return Ok(Expression::Assignment { |
| 943 | target: Box::new(target), |
| 944 | rvalue: Box::new(rvalue), |
| 945 | }); |
| 946 | } |
| 947 | |
| 948 | self.pos = saved_pos; |
| 949 | } |
| 950 | |
| 951 | let left = self.parse_or()?; |
| 952 | if self.match_assign() { |
| 953 | let target = self.expression_to_target(left)?; |
| 954 | let rvalue = self.parse_assignment()?; |
| 955 | Ok(Expression::Assignment { |
| 956 | target: Box::new(target), |
| 957 | rvalue: Box::new(rvalue), |
| 958 | }) |
| 959 | } else if let Some(op) = self.match_compound_assign() { |
| 960 | // `lhs OP= rhs` desugars to `lhs = lhs OP (rhs)`, so lhs evaluates twice. |
| 961 | // HLL assignment targets are simple lvalues, so that is benign. |
| 962 | let target = self.expression_to_target(left.clone())?; |
| 963 | let rhs = self.parse_assignment()?; |
| 964 | let rvalue = Expression::Binary { |
| 965 | op, |
| 966 | left: Box::new(left), |
| 967 | right: Box::new(rhs), |
| 968 | }; |
| 969 | Ok(Expression::Assignment { |
| 970 | target: Box::new(target), |
| 971 | rvalue: Box::new(rvalue), |
| 972 | }) |
no test coverage detected