Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/ide-completion/src/render.rs | 10 | ||||
| -rw-r--r-- | crates/ide-completion/src/render/literal.rs | 4 | ||||
| -rw-r--r-- | crates/ide-completion/src/tests/expression.rs | 31 |
3 files changed, 42 insertions, 3 deletions
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs index 608dec1285..433d49820d 100644 --- a/crates/ide-completion/src/render.rs +++ b/crates/ide-completion/src/render.rs @@ -120,6 +120,15 @@ impl<'a> RenderContext<'a> { }) } + /// Whether an enum variant should be rendered as deprecated. + /// + /// A variant inherits deprecation from its parent enum, matching rustc's + /// behavior where `#[deprecated]` on an enum applies to its variants. + fn is_variant_deprecated(&self, variant: hir::EnumVariant) -> bool { + let db = self.db(); + variant.attrs(db).is_deprecated() || variant.parent_enum(db).attrs(db).is_deprecated() + } + // FIXME: remove this fn docs(&self, def: impl HasDocs) -> Option<Documentation<'a>> { def.docs(self.db()) @@ -583,6 +592,7 @@ fn scope_def_docs(db: &RootDatabase, resolution: ScopeDef) -> Option<Documentati fn scope_def_is_deprecated(ctx: &RenderContext<'_>, resolution: ScopeDef) -> bool { let db = ctx.db(); match resolution { + ScopeDef::ModuleDef(hir::ModuleDef::EnumVariant(it)) => ctx.is_variant_deprecated(it), ScopeDef::ModuleDef(it) => ctx.is_deprecated(it, it.as_assoc_item(db)), ScopeDef::GenericParam(it) => { ctx.is_deprecated(it, None /* generic params can't be assoc items */) diff --git a/crates/ide-completion/src/render/literal.rs b/crates/ide-completion/src/render/literal.rs index b7de3da468..eb03e27cd9 100644 --- a/crates/ide-completion/src/render/literal.rs +++ b/crates/ide-completion/src/render/literal.rs @@ -192,9 +192,7 @@ impl Variant { Variant::Struct(it) => { ctx.is_deprecated(it, None /* structs can't be assoc items */) } - Variant::EnumVariant(it) => { - ctx.is_deprecated(it, None /* enum variants can't be assoc items */) - } + Variant::EnumVariant(it) => ctx.is_variant_deprecated(it), } } diff --git a/crates/ide-completion/src/tests/expression.rs b/crates/ide-completion/src/tests/expression.rs index 294434297e..f6da07a6f2 100644 --- a/crates/ide-completion/src/tests/expression.rs +++ b/crates/ide-completion/src/tests/expression.rs @@ -3162,6 +3162,37 @@ fn foo() { } #[test] +fn deprecated_enum_marks_variants_deprecated() { + check( + r#" +#[deprecated] +enum Foo { Bar } +fn main() { let _ = Foo::$0; } +"#, + expect![[r#" + ev Bar Bar DEPRECATED + "#]], + ); +} + +#[test] +fn deprecated_variant_of_undeprecated_enum_still_deprecated() { + check( + r#" +enum Foo { + #[deprecated] Bar, + Baz, +} +fn main() { let _ = Foo::$0; } +"#, + expect![[r#" + ev Bar Bar DEPRECATED + ev Baz Baz + "#]], + ); +} + +#[test] fn non_std_test_attr_macro() { check( r#" |