Parse an assignment statement. # Panics If the parser isn't positioned at an `=` token. See:
(&mut self, target: ParsedExpr, start: TextSize)
| 1218 | /// |
| 1219 | /// See: <https://docs.python.org/3/reference/simple_stmts.html#assignment-statements> |
| 1220 | fn parse_assign_statement(&mut self, target: ParsedExpr, start: TextSize) -> ast::StmtAssign { |
| 1221 | self.bump(TokenKind::Equal); |
| 1222 | |
| 1223 | let mut targets = vec![target.expr]; |
| 1224 | |
| 1225 | // test_err assign_stmt_missing_rhs |
| 1226 | // x = |
| 1227 | // 1 + 1 |
| 1228 | // x = y = |
| 1229 | // 2 + 2 |
| 1230 | // x = = y |
| 1231 | // 3 + 3 |
| 1232 | |
| 1233 | // test_err assign_stmt_keyword_target |
| 1234 | // a = pass = c |
| 1235 | // a + b |
| 1236 | // a = b = pass = c |
| 1237 | // a + b |
| 1238 | |
| 1239 | // test_err assign_stmt_invalid_value_expr |
| 1240 | // x = (*a and b,) |
| 1241 | // x = (42, *yield x) |
| 1242 | // x = (42, *yield from x) |
| 1243 | // x = (*lambda x: x,) |
| 1244 | // x = x := 1 |
| 1245 | |
| 1246 | let mut value = |
| 1247 | self.parse_expression_list(ExpressionContext::yield_or_starred_bitwise_or()); |
| 1248 | |
| 1249 | if self.at(TokenKind::Equal) { |
| 1250 | // This path is only taken when there are more than one assignment targets. |
| 1251 | self.parse_list(RecoveryContextKind::AssignmentTargets, |parser| { |
| 1252 | parser.bump(TokenKind::Equal); |
| 1253 | |
| 1254 | let mut parsed_expr = |
| 1255 | parser.parse_expression_list(ExpressionContext::yield_or_starred_bitwise_or()); |
| 1256 | |
| 1257 | std::mem::swap(&mut value, &mut parsed_expr); |
| 1258 | |
| 1259 | targets.push(parsed_expr.expr); |
| 1260 | }); |
| 1261 | } |
| 1262 | |
| 1263 | for target in &mut targets { |
| 1264 | helpers::set_expr_ctx(target, ExprContext::Store); |
| 1265 | // test_err assign_stmt_invalid_target |
| 1266 | // 1 = 1 |
| 1267 | // x = 1 = 2 |
| 1268 | // x = 1 = y = 2 = z |
| 1269 | // ["a", "b"] = ["a", "b"] |
| 1270 | self.validate_assignment_target(target); |
| 1271 | } |
| 1272 | |
| 1273 | ast::StmtAssign { |
| 1274 | targets, |
| 1275 | value: Box::new(value.expr), |
| 1276 | range: self.node_range(start), |
| 1277 | node_index: AtomicNodeIndex::NONE, |
no test coverage detected