Skip to content

Commit 7e0bd37

Browse files
committed
fix: don't replace default members' body
1 parent 0ded8e7 commit 7e0bd37

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

crates/ide-assists/src/handlers/add_missing_impl_members.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,16 @@ fn add_missing_impl_members_inner(
142142
Some(cap) => {
143143
let mut cursor = Cursor::Before(first_new_item.syntax());
144144
let placeholder;
145-
if let ast::AssocItem::Fn(func) = &first_new_item {
146-
if try_gen_trait_body(ctx, func, &trait_, &impl_def).is_none() {
147-
if let Some(m) = func.syntax().descendants().find_map(ast::MacroCall::cast)
148-
{
149-
if m.syntax().text() == "todo!()" {
150-
placeholder = m;
151-
cursor = Cursor::Replace(placeholder.syntax());
145+
if let DefaultMethods::No = mode {
146+
if let ast::AssocItem::Fn(func) = &first_new_item {
147+
if try_gen_trait_body(ctx, func, &trait_, &impl_def).is_none() {
148+
if let Some(m) =
149+
func.syntax().descendants().find_map(ast::MacroCall::cast)
150+
{
151+
if m.syntax().text() == "todo!()" {
152+
placeholder = m;
153+
cursor = Cursor::Replace(placeholder.syntax());
154+
}
152155
}
153156
}
154157
}

crates/ide-assists/src/utils/gen_trait_fn_body.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use syntax::{
55
ted,
66
};
77

8-
/// Generate custom trait bodies where possible.
8+
/// Generate custom trait bodies without default implementation where possible.
99
///
1010
/// Returns `Option` so that we can use `?` rather than `if let Some`. Returning
1111
/// `None` means that generating a custom trait body failed, and the body will remain
@@ -28,6 +28,7 @@ pub(crate) fn gen_trait_fn_body(
2828

2929
/// Generate a `Clone` impl based on the fields and members of the target type.
3030
fn gen_clone_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
31+
debug_assert!(func.name().map_or(false, |name| name.text() == "clone"));
3132
fn gen_clone_call(target: ast::Expr) -> ast::Expr {
3233
let method = make::name_ref("clone");
3334
make::expr_method_call(target, method, make::arg_list(None))
@@ -339,6 +340,7 @@ fn gen_default_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
339340

340341
/// Generate a `Hash` impl based on the fields and members of the target type.
341342
fn gen_hash_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
343+
debug_assert!(func.name().map_or(false, |name| name.text() == "hash"));
342344
fn gen_hash_call(target: ast::Expr) -> ast::Stmt {
343345
let method = make::name_ref("hash");
344346
let arg = make::expr_path(make::ext::ident_path("state"));
@@ -394,9 +396,7 @@ fn gen_hash_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
394396

395397
/// Generate a `PartialEq` impl based on the fields and members of the target type.
396398
fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
397-
if func.name().map_or(false, |name| name.text() == "ne") {
398-
return None;
399-
}
399+
debug_assert!(func.name().map_or(false, |name| name.text() == "eq"));
400400
fn gen_eq_chain(expr: Option<ast::Expr>, cmp: ast::Expr) -> Option<ast::Expr> {
401401
match expr {
402402
Some(expr) => Some(make::expr_bin_op(expr, BinaryOp::LogicOp(LogicOp::And), cmp)),
@@ -573,6 +573,7 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
573573
}
574574

575575
fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
576+
debug_assert!(func.name().map_or(false, |name| name.text() == "partial_cmp"));
576577
fn gen_partial_eq_match(match_target: ast::Expr) -> Option<ast::Stmt> {
577578
let mut arms = vec![];
578579

@@ -643,7 +644,7 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
643644
make::block_expr(stmts.into_iter(), tail).indent(ast::edit::IndentLevel(1))
644645
}
645646

646-
// No fields in the body means there's nothing to hash.
647+
// No fields in the body means there's nothing to compare.
647648
None => {
648649
let expr = make::expr_literal("true").into();
649650
make::block_expr(None, Some(expr)).indent(ast::edit::IndentLevel(1))

0 commit comments

Comments
 (0)