Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/generate_function.rs')
-rw-r--r--crates/ide-assists/src/handlers/generate_function.rs33
1 files changed, 23 insertions, 10 deletions
diff --git a/crates/ide-assists/src/handlers/generate_function.rs b/crates/ide-assists/src/handlers/generate_function.rs
index 14dd4061e7..3c3fde80f9 100644
--- a/crates/ide-assists/src/handlers/generate_function.rs
+++ b/crates/ide-assists/src/handlers/generate_function.rs
@@ -491,7 +491,7 @@ fn get_fn_target(
let mut file = ctx.vfs_file_id();
let target = match target_module {
Some(target_module) => {
- let (in_file, target) = next_space_for_fn_in_module(ctx.db(), target_module);
+ let (in_file, target) = next_space_for_fn_in_module(ctx.db(), target_module)?;
file = in_file;
target
}
@@ -1310,7 +1310,7 @@ fn next_space_for_fn_after_call_site(expr: ast::CallableExpr) -> Option<Generate
fn next_space_for_fn_in_module(
db: &dyn hir::db::HirDatabase,
target_module: hir::Module,
-) -> (FileId, GeneratedFunctionTarget) {
+) -> Option<(FileId, GeneratedFunctionTarget)> {
let module_source = target_module.definition_source(db);
let file = module_source.file_id.original_file(db);
let assist_item = match &module_source.value {
@@ -1318,14 +1318,13 @@ fn next_space_for_fn_in_module(
Some(last_item) => GeneratedFunctionTarget::AfterItem(last_item.syntax().clone()),
None => GeneratedFunctionTarget::AfterItem(it.syntax().clone()),
},
- hir::ModuleSource::Module(it) => match it.item_list().and_then(|it| it.items().last()) {
- Some(last_item) => GeneratedFunctionTarget::AfterItem(last_item.syntax().clone()),
- None => {
- let item_list =
- it.item_list().expect("module definition source should have an item list");
- GeneratedFunctionTarget::InEmptyItemList(item_list.syntax().clone())
+ hir::ModuleSource::Module(it) => {
+ let item_list = it.item_list()?;
+ match item_list.items().last() {
+ Some(last_item) => GeneratedFunctionTarget::AfterItem(last_item.syntax().clone()),
+ None => GeneratedFunctionTarget::InEmptyItemList(item_list.syntax().clone()),
}
- },
+ }
hir::ModuleSource::BlockExpr(it) => {
if let Some(last_item) =
it.statements().take_while(|stmt| matches!(stmt, ast::Stmt::Item(_))).last()
@@ -1337,7 +1336,7 @@ fn next_space_for_fn_in_module(
}
};
- (file.file_id(db), assist_item)
+ Some((file.file_id(db), assist_item))
}
#[derive(Clone, Copy)]
@@ -2460,6 +2459,20 @@ pub(crate) fn bar() {
}
#[test]
+ fn add_function_not_applicable_in_unresolved_module() {
+ check_assist_not_applicable(
+ generate_function,
+ r"
+mod foo;
+
+fn main() {
+ foo::bar$0();
+}
+",
+ )
+ }
+
+ #[test]
fn add_function_with_return_type() {
check_assist(
generate_function,