MCPcopy Create free account
hub / github.com/astral-sh/ruff / parse_assign_statement

Method parse_assign_statement

crates/ruff_python_parser/src/parser/statement.rs:1229–1288  ·  view source on GitHub ↗

Parse an assignment statement. # Panics If the parser isn't positioned at an `=` token. See:

(&mut self, target: ParsedExpr, start: TextSize)

Source from the content-addressed store, hash-verified

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

Callers 1

Calls 8

set_expr_ctxFunction · 0.85
parse_expression_listMethod · 0.80
parse_listMethod · 0.80
node_rangeMethod · 0.80
bumpMethod · 0.45
atMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected