about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/ide-assists/src/handlers/fill_record_pattern_fields.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/crates/ide-assists/src/handlers/fill_record_pattern_fields.rs b/crates/ide-assists/src/handlers/fill_record_pattern_fields.rs
index e639de4b670..42bd0d3e668 100644
--- a/crates/ide-assists/src/handlers/fill_record_pattern_fields.rs
+++ b/crates/ide-assists/src/handlers/fill_record_pattern_fields.rs
@@ -188,6 +188,84 @@ fn foo(bar: Bar) {
     }
 
     #[test]
+    fn fill_fields_struct_generated_by_macro() {
+        check_assist(
+            fill_record_pattern_fields,
+            r#"
+macro_rules! position {
+    ($t: ty) => {
+        struct Pos {x: $t, y: $t}
+    };
+}
+
+position!(usize);
+
+fn macro_call(pos: Pos) {
+    let Pos { ..$0 } = pos;
+}
+"#,
+            r#"
+macro_rules! position {
+    ($t: ty) => {
+        struct Pos {x: $t, y: $t}
+    };
+}
+
+position!(usize);
+
+fn macro_call(pos: Pos) {
+    let Pos { x, y  } = pos;
+}
+"#,
+        );
+    }
+
+    #[test]
+    fn fill_fields_enum_generated_by_macro() {
+        check_assist(
+            fill_record_pattern_fields,
+            r#"
+macro_rules! enum_gen {
+    ($t: ty) => {
+        enum Foo {
+            A($t),
+            B{x: $t, y: $t},
+        }
+    };
+}
+
+enum_gen!(usize);
+
+fn macro_call(foo: Foo) {
+    match foo {
+        Foo::A(_) => false,
+        Foo::B{ ..$0 } => true,
+    }
+}
+"#,
+            r#"
+macro_rules! enum_gen {
+    ($t: ty) => {
+        enum Foo {
+            A($t),
+            B{x: $t, y: $t},
+        }
+    };
+}
+
+enum_gen!(usize);
+
+fn macro_call(foo: Foo) {
+    match foo {
+        Foo::A(_) => false,
+        Foo::B{ x, y  } => true,
+    }
+}
+"#,
+        );
+    }
+
+    #[test]
     fn not_applicable_when_not_in_ellipsis() {
         check_assist_not_applicable(
             fill_record_pattern_fields,