(vm: &VirtualMachine, stmt: &ast::Stmt)
| 470 | } |
| 471 | |
| 472 | fn validate_stmt(vm: &VirtualMachine, stmt: &ast::Stmt) -> PyResult<()> { |
| 473 | match stmt { |
| 474 | ast::Stmt::FunctionDef(func) => { |
| 475 | let owner = if func.is_async { |
| 476 | "AsyncFunctionDef" |
| 477 | } else { |
| 478 | "FunctionDef" |
| 479 | }; |
| 480 | validate_body(vm, &func.body, owner)?; |
| 481 | validate_type_params(vm, &func.type_params)?; |
| 482 | validate_parameters(vm, &func.parameters)?; |
| 483 | validate_decorators(vm, &func.decorator_list)?; |
| 484 | if let Some(returns) = &func.returns { |
| 485 | validate_expr(vm, returns, ast::ExprContext::Load)?; |
| 486 | } |
| 487 | Ok(()) |
| 488 | } |
| 489 | ast::Stmt::ClassDef(class_def) => { |
| 490 | validate_body(vm, &class_def.body, "ClassDef")?; |
| 491 | validate_type_params(vm, &class_def.type_params)?; |
| 492 | if let Some(arguments) = &class_def.arguments { |
| 493 | validate_exprs(vm, &arguments.args, ast::ExprContext::Load, false)?; |
| 494 | validate_keywords(vm, &arguments.keywords)?; |
| 495 | } |
| 496 | validate_decorators(vm, &class_def.decorator_list) |
| 497 | } |
| 498 | ast::Stmt::Return(ret) => { |
| 499 | if let Some(value) = &ret.value { |
| 500 | validate_expr(vm, value, ast::ExprContext::Load)?; |
| 501 | } |
| 502 | Ok(()) |
| 503 | } |
| 504 | ast::Stmt::Delete(del) => validate_assignlist(vm, &del.targets, ast::ExprContext::Del), |
| 505 | ast::Stmt::Assign(assign) => { |
| 506 | validate_assignlist(vm, &assign.targets, ast::ExprContext::Store)?; |
| 507 | validate_expr(vm, &assign.value, ast::ExprContext::Load) |
| 508 | } |
| 509 | ast::Stmt::AugAssign(assign) => { |
| 510 | validate_expr(vm, &assign.target, ast::ExprContext::Store)?; |
| 511 | validate_expr(vm, &assign.value, ast::ExprContext::Load) |
| 512 | } |
| 513 | ast::Stmt::AnnAssign(assign) => { |
| 514 | if assign.simple && !matches!(&*assign.target, ast::Expr::Name(_)) { |
| 515 | return Err(vm.new_type_error("AnnAssign with simple non-Name target")); |
| 516 | } |
| 517 | validate_expr(vm, &assign.target, ast::ExprContext::Store)?; |
| 518 | if let Some(value) = &assign.value { |
| 519 | validate_expr(vm, value, ast::ExprContext::Load)?; |
| 520 | } |
| 521 | validate_expr(vm, &assign.annotation, ast::ExprContext::Load) |
| 522 | } |
| 523 | ast::Stmt::TypeAlias(alias) => { |
| 524 | if !matches!(&*alias.name, ast::Expr::Name(_)) { |
| 525 | return Err(vm.new_type_error("TypeAlias with non-Name name")); |
| 526 | } |
| 527 | validate_expr(vm, &alias.name, ast::ExprContext::Store)?; |
| 528 | validate_type_params(vm, &alias.type_params)?; |
| 529 | validate_expr(vm, &alias.value, ast::ExprContext::Load) |
no test coverage detected