in starlark/src/analysis/flow.rs [104:141]
fn check_stmt(codemap: &CodeMap, x: &AstStmt, res: &mut Vec<LintT<FlowIssue>>) {
match &**x {
Stmt::Def(name, _params, ret_type, body, _payload) => {
let rets = returns(body);
// Do I require my return statements to have an expression
let require_expression = require_return_expression(ret_type)
.or_else(|| rets.iter().find(|x| x.1.is_some()).map(|x| x.0));
if let Some(reason) = require_expression {
if !final_return(body) {
res.push(LintT::new(
codemap,
x.span,
FlowIssue::MissingReturn(
// Statements often end with \n, so remove that to fit nicely
name.node.0.trim_end().to_owned(),
codemap.file_span(reason).resolve(),
),
));
}
for (span, ret) in rets {
if ret.is_none() {
res.push(LintT::new(
codemap,
span,
FlowIssue::MissingReturnExpression(
name.0.clone(),
codemap.file_span(x.span).resolve(),
codemap.file_span(reason).resolve(),
),
))
}
}
}
}
_ => {}
}
}