in starlark/src/syntax/validate.rs [303:339]
fn f(
codemap: &CodeMap,
dialect: &Dialect,
stmt: &AstStmt,
top_level: bool,
inside_for: bool,
inside_def: bool,
) -> anyhow::Result<()> {
let err = |x| Err(Diagnostic::new(x, stmt.span, codemap));
match &stmt.node {
Stmt::Def(_, _, _, body, _payload) => f(codemap, dialect, body, false, false, true),
Stmt::For(_, box (_, body)) => {
if top_level && !dialect.enable_top_level_stmt {
err(ValidateError::NoTopLevelFor)
} else {
f(codemap, dialect, body, false, true, inside_def)
}
}
Stmt::If(..) | Stmt::IfElse(..) => {
if top_level && !dialect.enable_top_level_stmt {
err(ValidateError::NoTopLevelIf)
} else {
stmt.node.visit_stmt_result(|x| {
f(codemap, dialect, x, false, inside_for, inside_def)
})
}
}
Stmt::Break if !inside_for => err(ValidateError::BreakOutsideLoop),
Stmt::Continue if !inside_for => err(ValidateError::ContinueOutsideLoop),
Stmt::Return(_) if !inside_def => err(ValidateError::ReturnOutsideDef),
Stmt::Load(..) if !top_level => err(ValidateError::LoadNotTop),
_ => stmt.node.visit_stmt_result(|x| {
f(codemap, dialect, x, top_level, inside_for, inside_def)
}),
}
}