Skip to content

Commit 616f182

Browse files
authored
fix: mark enum variants as deprecated when their parent enum is deprecated
1 parent f381976 commit 616f182

3 files changed

Lines changed: 46 additions & 3 deletions

File tree

crates/ide-completion/src/render.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,15 @@ impl<'a> RenderContext<'a> {
120120
})
121121
}
122122

123+
/// Whether an enum variant should be rendered as deprecated.
124+
///
125+
/// A variant inherits deprecation from its parent enum, matching rustc's
126+
/// behavior where `#[deprecated]` on an enum applies to its variants.
127+
fn is_variant_deprecated(&self, variant: hir::EnumVariant) -> bool {
128+
let db = self.db();
129+
variant.attrs(db).is_deprecated() || variant.parent_enum(db).attrs(db).is_deprecated()
130+
}
131+
123132
// FIXME: remove this
124133
fn docs(&self, def: impl HasDocs) -> Option<Documentation<'a>> {
125134
def.docs(self.db())
@@ -583,6 +592,7 @@ fn scope_def_docs(db: &RootDatabase, resolution: ScopeDef) -> Option<Documentati
583592
fn scope_def_is_deprecated(ctx: &RenderContext<'_>, resolution: ScopeDef) -> bool {
584593
let db = ctx.db();
585594
match resolution {
595+
ScopeDef::ModuleDef(hir::ModuleDef::EnumVariant(it)) => ctx.is_variant_deprecated(it),
586596
ScopeDef::ModuleDef(it) => ctx.is_deprecated(it, it.as_assoc_item(db)),
587597
ScopeDef::GenericParam(it) => {
588598
ctx.is_deprecated(it, None /* generic params can't be assoc items */)

crates/ide-completion/src/render/literal.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,7 @@ impl Variant {
192192
Variant::Struct(it) => {
193193
ctx.is_deprecated(it, None /* structs can't be assoc items */)
194194
}
195-
Variant::EnumVariant(it) => {
196-
ctx.is_deprecated(it, None /* enum variants can't be assoc items */)
197-
}
195+
Variant::EnumVariant(it) => ctx.is_variant_deprecated(it),
198196
}
199197
}
200198

crates/ide-completion/src/tests/expression.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3161,6 +3161,41 @@ fn foo() {
31613161
);
31623162
}
31633163

3164+
#[test]
3165+
fn deprecated_enum_marks_variants_deprecated() {
3166+
// regression: rust-lang/rust-analyzer#22090 — a variant inherits the
3167+
// `#[deprecated]` attribute of its parent enum.
3168+
check(
3169+
r#"
3170+
#[deprecated]
3171+
enum Foo { Bar }
3172+
fn main() { let _ = Foo::$0; }
3173+
"#,
3174+
expect![[r#"
3175+
ev Bar Bar DEPRECATED
3176+
"#]],
3177+
);
3178+
}
3179+
3180+
#[test]
3181+
fn deprecated_variant_of_undeprecated_enum_still_deprecated() {
3182+
// regression guard for rust-lang/rust-analyzer#22090 — the existing
3183+
// per-variant `#[deprecated]` behavior must keep working.
3184+
check(
3185+
r#"
3186+
enum Foo {
3187+
#[deprecated] Bar,
3188+
Baz,
3189+
}
3190+
fn main() { let _ = Foo::$0; }
3191+
"#,
3192+
expect![[r#"
3193+
ev Bar Bar DEPRECATED
3194+
ev Baz Baz
3195+
"#]],
3196+
);
3197+
}
3198+
31643199
#[test]
31653200
fn non_std_test_attr_macro() {
31663201
check(

0 commit comments

Comments
 (0)