refactor: use hir to test if a value is returned

This commit is contained in:
Côme ALLART 2021-12-11 20:52:14 +01:00
parent 80a68685db
commit 9e53db274b

View File

@ -159,7 +159,7 @@ fn safety_builder(ast_func: &ast::Fn) -> Option<Vec<String>> {
fn gen_ex_template(ast_func: &ast::Fn, ctx: &AssistContext) -> Option<Vec<String>> { fn gen_ex_template(ast_func: &ast::Fn, ctx: &AssistContext) -> Option<Vec<String>> {
let (mut lines, ex_helper) = gen_ex_start_helper(ast_func, ctx)?; let (mut lines, ex_helper) = gen_ex_start_helper(ast_func, ctx)?;
// Call the function, check result // Call the function, check result
if returns_a_value(ast_func) { if returns_a_value(ast_func, ctx) {
if count_parameters(&ex_helper.param_list) < 3 { if count_parameters(&ex_helper.param_list) < 3 {
lines.push(format!("assert_eq!({}, );", ex_helper.function_call)); lines.push(format!("assert_eq!({}, );", ex_helper.function_call));
} else { } else {
@ -183,7 +183,7 @@ fn gen_ex_template(ast_func: &ast::Fn, ctx: &AssistContext) -> Option<Vec<String
/// `None` if the function has a `self` parameter but is not in an `impl`. /// `None` if the function has a `self` parameter but is not in an `impl`.
fn gen_panic_ex_template(ast_func: &ast::Fn, ctx: &AssistContext) -> Option<Vec<String>> { fn gen_panic_ex_template(ast_func: &ast::Fn, ctx: &AssistContext) -> Option<Vec<String>> {
let (mut lines, ex_helper) = gen_ex_start_helper(ast_func, ctx)?; let (mut lines, ex_helper) = gen_ex_start_helper(ast_func, ctx)?;
match returns_a_value(ast_func) { match returns_a_value(ast_func, ctx) {
true => lines.push(format!("let _ = {}; // panics", ex_helper.function_call)), true => lines.push(format!("let _ = {}; // panics", ex_helper.function_call)),
false => lines.push(format!("{}; // panics", ex_helper.function_call)), false => lines.push(format!("{}; // panics", ex_helper.function_call)),
} }
@ -424,11 +424,12 @@ fn return_type(ast_func: &ast::Fn) -> Option<ast::Type> {
} }
/// Helper function to determine if the function returns some data /// Helper function to determine if the function returns some data
fn returns_a_value(ast_func: &ast::Fn) -> bool { fn returns_a_value(ast_func: &ast::Fn, ctx: &AssistContext) -> bool {
match return_type(ast_func) { ctx.sema
Some(ret_type) => !["()", "!"].contains(&ret_type.to_string().as_str()), .to_def(ast_func)
None => false, .map(|hir_func| hir_func.ret_type(ctx.db()))
} .map(|ret_ty| !ret_ty.is_unit() && !ret_ty.is_never())
.unwrap_or(false)
} }
#[cfg(test)] #[cfg(test)]