diff options
| author | Young-Flash <871946895@qq.com> | 2023-12-26 21:23:41 +0800 |
|---|---|---|
| committer | Young-Flash <871946895@qq.com> | 2023-12-26 21:23:41 +0800 |
| commit | 8a0a3b24934496741c5be376257e5108da0f29b5 (patch) | |
| tree | 65f8909b0acfe283e75fd0e03b124869650dbfff | |
| parent | 85fb463fc586594925f05fc8e285b1568f98f41a (diff) | |
| download | rust-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.rs | 26 |
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() |
