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:1220–1279  ·  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

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,

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