diff options
author | Chetan Khilosiya <[email protected]> | 2021-03-06 19:21:48 +0000 |
---|---|---|
committer | Chetan Khilosiya <[email protected]> | 2021-03-06 19:21:48 +0000 |
commit | e4b6541c7a86f387c1b60f36df2177047907048e (patch) | |
tree | d6e026518695e06b64d9d0603e1bc0f0a27d4fe4 | |
parent | 9a84daf47d259380ae0fba21a54853a0fa384cb1 (diff) |
7708: handle both FamousDefs fixture and plain code.
Also fix typo in example.
-rw-r--r-- | crates/ide_assists/src/handlers/generate_default_from_new.rs | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/crates/ide_assists/src/handlers/generate_default_from_new.rs b/crates/ide_assists/src/handlers/generate_default_from_new.rs index 2eb0d6aad..82f05c65d 100644 --- a/crates/ide_assists/src/handlers/generate_default_from_new.rs +++ b/crates/ide_assists/src/handlers/generate_default_from_new.rs | |||
@@ -53,8 +53,7 @@ pub(crate) fn generate_default_from_new(acc: &mut Assists, ctx: &AssistContext) | |||
53 | } | 53 | } |
54 | 54 | ||
55 | let impl_ = fn_node.syntax().ancestors().into_iter().find_map(ast::Impl::cast)?; | 55 | let impl_ = fn_node.syntax().ancestors().into_iter().find_map(ast::Impl::cast)?; |
56 | let implements_default = is_default_implemented(ctx, &impl_)?; | 56 | if is_default_implemented(ctx, &impl_) { |
57 | if implements_default { | ||
58 | return None; | 57 | return None; |
59 | } | 58 | } |
60 | 59 | ||
@@ -84,14 +83,25 @@ impl Default for {} {{ | |||
84 | ) | 83 | ) |
85 | } | 84 | } |
86 | 85 | ||
87 | fn is_default_implemented(ctx: &AssistContext, impl_: &Impl) -> Option<bool> { | 86 | fn is_default_implemented(ctx: &AssistContext, impl_: &Impl) -> bool { |
88 | let db = ctx.sema.db; | 87 | let db = ctx.sema.db; |
89 | let impl_def = ctx.sema.to_def(impl_)?; | 88 | let impl_ = ctx.sema.to_def(impl_); |
89 | let impl_def; | ||
90 | match impl_ { | ||
91 | Some(value) => impl_def = value, | ||
92 | None => return false, | ||
93 | } | ||
94 | |||
90 | let ty = impl_def.target_ty(db); | 95 | let ty = impl_def.target_ty(db); |
91 | let krate = impl_def.module(db).krate(); | 96 | let krate = impl_def.module(db).krate(); |
92 | let default_trait = FamousDefs(&ctx.sema, Some(krate)).core_default_Default()?; | 97 | let default = FamousDefs(&ctx.sema, Some(krate)).core_default_Default(); |
93 | let implements_default = ty.impls_trait(db, default_trait, &[]); | 98 | let default_trait; |
94 | Some(implements_default) | 99 | match default { |
100 | Some(value) => default_trait = value, | ||
101 | None => return false, | ||
102 | } | ||
103 | |||
104 | ty.impls_trait(db, default_trait, &[]) | ||
95 | } | 105 | } |
96 | 106 | ||
97 | #[cfg(test)] | 107 | #[cfg(test)] |
@@ -205,7 +215,7 @@ impl Exmaple { | |||
205 | r#" | 215 | r#" |
206 | struct Example { _inner: () } | 216 | struct Example { _inner: () } |
207 | 217 | ||
208 | impl Exmaple { | 218 | impl Example { |
209 | pub fn n$0ew() -> Self { | 219 | pub fn n$0ew() -> Self { |
210 | Self { _inner: () } | 220 | Self { _inner: () } |
211 | } | 221 | } |