about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiklas Lindorfer <niklas@lindorfer.com>2024-03-04 18:14:25 +0000
committerNiklas Lindorfer <niklas@lindorfer.com>2024-03-04 21:50:01 +0000
commit2a4ba4295b3bb53e672cb2dded2247a5553cf089 (patch)
treef8b81903d10fb72b4144842d9501fa40d2db2fcc
parent9f14343f9ee24f53f17492c5f9b653427e2ad15e (diff)
downloadrust-2a4ba4295b3bb53e672cb2dded2247a5553cf089.tar.gz
rust-2a4ba4295b3bb53e672cb2dded2247a5553cf089.zip
fix: hide destructure_struct_binding assist if no public fields
-rw-r--r--crates/ide-assists/src/handlers/destructure_struct_binding.rs27
-rw-r--r--crates/syntax/src/ast/make.rs5
2 files changed, 23 insertions, 9 deletions
diff --git a/crates/ide-assists/src/handlers/destructure_struct_binding.rs b/crates/ide-assists/src/handlers/destructure_struct_binding.rs
index 4edc52b614a..c1a3f930265 100644
--- a/crates/ide-assists/src/handlers/destructure_struct_binding.rs
+++ b/crates/ide-assists/src/handlers/destructure_struct_binding.rs
@@ -107,6 +107,10 @@ fn collect_data(ident_pat: ast::IdentPat, ctx: &AssistContext<'_>) -> Option<Str
     let visible_fields =
         fields.into_iter().filter(|field| field.is_visible_from(ctx.db(), module)).collect_vec();
 
+    if visible_fields.is_empty() {
+        return None;
+    }
+
     let has_private_members =
         (is_non_exhaustive && is_foreign_crate) || visible_fields.len() < n_fields;
 
@@ -413,7 +417,7 @@ mod tests {
 
     #[test]
     fn unit_struct() {
-        check_assist(
+        check_assist_not_applicable(
             destructure_struct_binding,
             r#"
             struct Foo;
@@ -422,13 +426,6 @@ mod tests {
                 let $0foo = Foo;
             }
             "#,
-            r#"
-            struct Foo;
-
-            fn main() {
-                let Foo = Foo;
-            }
-            "#,
         )
     }
 
@@ -739,4 +736,18 @@ mod tests {
             "#,
         )
     }
+
+    #[test]
+    fn record_struct_no_public_members() {
+        check_assist_not_applicable(
+            destructure_struct_binding,
+            r#"
+            //- /lib.rs crate:dep
+            pub struct Foo { bar: i32, baz: i32 };
+
+            //- /main.rs crate:main deps:dep
+            fn main($0foo: dep::Foo) {}
+            "#,
+        )
+    }
 }
diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs
index f299dda4f0f..ff18fee9bab 100644
--- a/crates/syntax/src/ast/make.rs
+++ b/crates/syntax/src/ast/make.rs
@@ -724,7 +724,10 @@ pub fn record_pat_field_list(
 ) -> ast::RecordPatFieldList {
     let mut fields = fields.into_iter().join(", ");
     if let Some(rest_pat) = rest_pat {
-        format_to!(fields, ", {rest_pat}");
+        if !fields.is_empty() {
+            fields.push_str(", ");
+        }
+        format_to!(fields, "{rest_pat}");
     }
     ast_from_text(&format!("fn f(S {{ {fields} }}: ()))"))
 }