about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYoung-Flash <871946895@qq.com>2023-12-26 21:23:41 +0800
committerYoung-Flash <871946895@qq.com>2023-12-26 21:23:41 +0800
commit8a0a3b24934496741c5be376257e5108da0f29b5 (patch)
tree65f8909b0acfe283e75fd0e03b124869650dbfff
parent85fb463fc586594925f05fc8e285b1568f98f41a (diff)
downloadrust-8a0a3b24934496741c5be376257e5108da0f29b5.tar.gz
rust-8a0a3b24934496741c5be376257e5108da0f29b5.zip
fix: extract_struct_from_enum_variant should resolve `Self` generic arg
-rw-r--r--crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
index 37db27a8fc0..b55344f157d 100644
--- a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
+++ b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
@@ -246,6 +246,32 @@ fn create_struct_def(
         Either::Left(field_list) => {
             let field_list = field_list.clone_for_update();
 
+            // replace `Self` with the enum name when construct struct def
+            field_list
+                .fields()
+                .filter_map(|field| match field.ty()? {
+                    ast::Type::PathType(p) => {
+                        let generic_arg_list = p.path()?.segment()?.generic_arg_list()?;
+                        Some(
+                            generic_arg_list
+                                .generic_args()
+                                .filter_map(|generic_arg| {
+                                    if generic_arg.to_string() == "Self" {
+                                        let type_arg =
+                                            make::type_arg(make::ty(&enum_.name()?.to_string()))
+                                                .clone_for_update();
+                                        Some(ted::replace(generic_arg.syntax(), type_arg.syntax()))
+                                    } else {
+                                        None
+                                    }
+                                })
+                                .count(),
+                        )
+                    }
+                    _ => None,
+                })
+                .count();
+
             if let Some(vis) = &enum_vis {
                 field_list
                     .fields()