about summary refs log tree commit diff
diff options
context:
space:
mode:
authorA4-Tacks <wdsjxhno1001@163.com>2025-09-17 22:57:25 +0800
committerA4-Tacks <wdsjxhno1001@163.com>2025-09-17 22:57:25 +0800
commit28b0e4e15e0ffd0c5f747f94dadb7a243566449d (patch)
tree1a8e888b37123613b28a106d6ae9a8d85ec2d656
parentc307fd8e3320bbaabd68a5299e6fb89ad703887b (diff)
downloadrust-28b0e4e15e0ffd0c5f747f94dadb7a243566449d.tar.gz
rust-28b0e4e15e0ffd0c5f747f94dadb7a243566449d.zip
Fix applicable on variant field for change_visibility
Enum variant fields do not allow visibility

Example
---
```rust
enum Foo {
    Variant($0String),
}
```

**Before this PR**:

```rust
enum Foo {
    Variant(pub(crate) String),
}
```

**After this PR**:

Assist not applicable
-rw-r--r--src/tools/rust-analyzer/crates/ide-assists/src/handlers/change_visibility.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/change_visibility.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/change_visibility.rs
index 9b9f0c4522e..7119d5b9c23 100644
--- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/change_visibility.rs
+++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/change_visibility.rs
@@ -65,11 +65,13 @@ fn add_vis(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
         if field.visibility().is_some() {
             return None;
         }
+        check_is_not_variant(&field)?;
         (vis_offset(field.syntax()), field_name.syntax().text_range())
     } else if let Some(field) = ctx.find_node_at_offset::<ast::TupleField>() {
         if field.visibility().is_some() {
             return None;
         }
+        check_is_not_variant(&field)?;
         (vis_offset(field.syntax()), field.syntax().text_range())
     } else {
         return None;
@@ -134,6 +136,11 @@ fn change_vis(acc: &mut Assists, vis: ast::Visibility) -> Option<()> {
     None
 }
 
+fn check_is_not_variant(field: &impl AstNode) -> Option<()> {
+    let kind = field.syntax().parent()?.parent()?.kind();
+    (kind != SyntaxKind::VARIANT).then_some(())
+}
+
 #[cfg(test)]
 mod tests {
     use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
@@ -240,6 +247,13 @@ mod tests {
     }
 
     #[test]
+    fn not_applicable_for_enum_variant_fields() {
+        check_assist_not_applicable(change_visibility, r"pub enum Foo { Foo1($0i32) }");
+
+        check_assist_not_applicable(change_visibility, r"pub enum Foo { Foo1 { $0n: i32 } }");
+    }
+
+    #[test]
     fn change_visibility_target() {
         check_assist_target(change_visibility, "$0fn foo() {}", "fn");
         check_assist_target(change_visibility, "pub(crate)$0 fn foo() {}", "pub(crate)");