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:1227–1286  ·  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

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,

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