@@ -39,15 +39,16 @@ pub(crate) fn extract_struct_from_enum(acc: &mut Assists, ctx: &AssistContext) -
3939 _ => return None ,
4040 } ;
4141 let variant_name = variant. name ( ) ?. to_string ( ) ;
42- let enum_ast = variant. parent_enum ( ) ;
43- let enum_name = enum_ast. name ( ) ?. to_string ( ) ;
44- let visibility = enum_ast. visibility ( ) ;
4542 let variant_hir = ctx. sema . to_def ( & variant) ?;
46-
4743 if existing_struct_def ( ctx. db , & variant_name, & variant_hir) {
4844 return None ;
4945 }
50-
46+ let enum_ast = variant. parent_enum ( ) ;
47+ let enum_name = enum_ast. name ( ) ?. to_string ( ) ;
48+ let visibility = enum_ast. visibility ( ) ;
49+ let current_module_def =
50+ ImportsLocator :: new ( ctx. db ) . find_imports ( & enum_name) . first ( ) ?. left ( ) ?;
51+ let current_module = current_module_def. module ( ctx. db ) ?;
5152 let target = variant. syntax ( ) . text_range ( ) ;
5253 return acc. add_in_multiple_files (
5354 AssistId ( "extract_struct_from_enum_variant" ) ,
@@ -56,18 +57,17 @@ pub(crate) fn extract_struct_from_enum(acc: &mut Assists, ctx: &AssistContext) -
5657 |edit| {
5758 let definition = Definition :: ModuleDef ( ModuleDef :: EnumVariant ( variant_hir) ) ;
5859 let res = definition. find_usages ( & ctx. db , None ) ;
59- let module_def = mod_def_for_target_module ( ctx, & enum_name) ;
6060 let start_offset = variant. parent_enum ( ) . syntax ( ) . text_range ( ) . start ( ) ;
6161 let mut visited_modules_set: FxHashSet < Module > = FxHashSet :: default ( ) ;
62- visited_modules_set. insert ( module_def . module ( ctx . db ) . unwrap ( ) ) ;
62+ visited_modules_set. insert ( current_module ) ;
6363 for reference in res {
6464 let source_file = ctx. sema . parse ( reference. file_range . file_id ) ;
6565 update_reference (
6666 ctx,
6767 edit,
6868 reference,
6969 & source_file,
70- & module_def ,
70+ & current_module_def ,
7171 & mut visited_modules_set,
7272 ) ;
7373 }
@@ -95,10 +95,6 @@ fn existing_struct_def(db: &RootDatabase, variant_name: &str, variant: &EnumVari
9595 . any ( |( name, _) | name. to_string ( ) == variant_name. to_string ( ) )
9696}
9797
98- fn mod_def_for_target_module ( ctx : & AssistContext , enum_name : & str ) -> ModuleDef {
99- ImportsLocator :: new ( ctx. db ) . find_imports ( enum_name) . first ( ) . unwrap ( ) . left ( ) . unwrap ( )
100- }
101-
10298fn insert_import (
10399 ctx : & AssistContext ,
104100 builder : & mut AssistBuilder ,
@@ -186,23 +182,16 @@ fn update_reference(
186182 let call = path_expr. syntax ( ) . parent ( ) . and_then ( ast:: CallExpr :: cast) ?;
187183 let list = call. arg_list ( ) ?;
188184 let segment = path_expr. path ( ) ?. segment ( ) ?;
185+ let segment_name = segment. name_ref ( ) ?;
186+ let module = ctx. sema . scope ( & path_expr. syntax ( ) ) . module ( ) ?;
189187 let list_range = list. syntax ( ) . text_range ( ) ;
190188 let inside_list_range = TextRange :: new (
191189 list_range. start ( ) . checked_add ( TextSize :: from ( 1 ) ) ?,
192190 list_range. end ( ) . checked_sub ( TextSize :: from ( 1 ) ) ?,
193191 ) ;
194192 edit. perform ( reference. file_range . file_id , |builder| {
195- let module = ctx. sema . scope ( & path_expr. syntax ( ) ) . module ( ) . unwrap ( ) ;
196193 if !visited_modules_set. contains ( & module) {
197- if insert_import (
198- ctx,
199- builder,
200- & path_expr,
201- & module,
202- module_def,
203- segment. name_ref ( ) . unwrap ( ) ,
204- )
205- . is_some ( )
194+ if insert_import ( ctx, builder, & path_expr, & module, module_def, segment_name) . is_some ( )
206195 {
207196 visited_modules_set. insert ( module) ;
208197 }
0 commit comments