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