Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22116 from Brumbelow/master
fix: mark enum variants as deprecated when their parent enum is deprecated
A4-Tacks 4 weeks ago
parent 8eb5cb9 · parent e1ae66d · commit 0705955
-rw-r--r--crates/ide-completion/src/render.rs10
-rw-r--r--crates/ide-completion/src/render/literal.rs4
-rw-r--r--crates/ide-completion/src/tests/expression.rs31
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#"