Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/add_missing_impl_members.rs')
-rw-r--r--crates/ide-assists/src/handlers/add_missing_impl_members.rs67
1 files changed, 56 insertions, 11 deletions
diff --git a/crates/ide-assists/src/handlers/add_missing_impl_members.rs b/crates/ide-assists/src/handlers/add_missing_impl_members.rs
index ab183ac708..7e03eb3030 100644
--- a/crates/ide-assists/src/handlers/add_missing_impl_members.rs
+++ b/crates/ide-assists/src/handlers/add_missing_impl_members.rs
@@ -183,13 +183,11 @@ fn add_missing_impl_members_inner(
.clone()
.into_iter()
.chain(other_items.iter().cloned())
- .map(either::Either::Right)
.collect::<Vec<_>>();
let mut editor = edit.make_editor(impl_def.syntax());
if let Some(assoc_item_list) = impl_def.assoc_item_list() {
- let items = new_assoc_items.into_iter().filter_map(either::Either::right).collect();
- assoc_item_list.add_items(&mut editor, items);
+ assoc_item_list.add_items(&mut editor, new_assoc_items);
} else {
let assoc_item_list = make::assoc_item_list(Some(new_assoc_items)).clone_for_update();
editor.insert_all(
@@ -201,14 +199,12 @@ fn add_missing_impl_members_inner(
if let Some(cap) = ctx.config.snippet_cap {
let mut placeholder = None;
- if let DefaultMethods::No = mode {
- if let Some(ast::AssocItem::Fn(func)) = &first_new_item {
- if let Some(m) = func.syntax().descendants().find_map(ast::MacroCall::cast)
- && m.syntax().text() == "todo!()"
- {
- placeholder = Some(m);
- }
- }
+ if let DefaultMethods::No = mode
+ && let Some(ast::AssocItem::Fn(func)) = &first_new_item
+ && let Some(m) = func.syntax().descendants().find_map(ast::MacroCall::cast)
+ && m.syntax().text() == "todo!()"
+ {
+ placeholder = Some(m);
}
if let Some(macro_call) = placeholder {
@@ -2425,4 +2421,53 @@ impl other_file_2::Trait for MyStruct {
}"#,
);
}
+
+ #[test]
+ fn test_qualify_ident_pat_in_default_members() {
+ check_assist(
+ add_missing_default_members,
+ r#"
+//- /lib.rs crate:b new_source_root:library
+pub enum State {
+ Active,
+ Inactive,
+}
+
+use State::*;
+
+pub trait Checker {
+ fn check(&self) -> State;
+
+ fn is_active(&self) -> bool {
+ match self.check() {
+ Active => true,
+ Inactive => false,
+ }
+ }
+}
+//- /main.rs crate:a deps:b
+struct MyChecker;
+
+impl b::Checker for MyChecker {
+ fn check(&self) -> b::State {
+ todo!();
+ }$0
+}"#,
+ r#"
+struct MyChecker;
+
+impl b::Checker for MyChecker {
+ fn check(&self) -> b::State {
+ todo!();
+ }
+
+ $0fn is_active(&self) -> bool {
+ match self.check() {
+ b::State::Active => true,
+ b::State::Inactive => false,
+ }
+ }
+}"#,
+ );
+ }
}