@@ -39,15 +39,16 @@ pub(crate) fn extract_struct_from_enum(acc: &mut Assists, ctx: &AssistContext) -
39
39
_ => return None ,
40
40
} ;
41
41
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 ( ) ;
45
42
let variant_hir = ctx. sema . to_def ( & variant) ?;
46
-
47
43
if existing_struct_def ( ctx. db , & variant_name, & variant_hir) {
48
44
return None ;
49
45
}
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 ) ?;
51
52
let target = variant. syntax ( ) . text_range ( ) ;
52
53
return acc. add_in_multiple_files (
53
54
AssistId ( "extract_struct_from_enum_variant" ) ,
@@ -56,18 +57,17 @@ pub(crate) fn extract_struct_from_enum(acc: &mut Assists, ctx: &AssistContext) -
56
57
|edit| {
57
58
let definition = Definition :: ModuleDef ( ModuleDef :: EnumVariant ( variant_hir) ) ;
58
59
let res = definition. find_usages ( & ctx. db , None ) ;
59
- let module_def = mod_def_for_target_module ( ctx, & enum_name) ;
60
60
let start_offset = variant. parent_enum ( ) . syntax ( ) . text_range ( ) . start ( ) ;
61
61
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 ) ;
63
63
for reference in res {
64
64
let source_file = ctx. sema . parse ( reference. file_range . file_id ) ;
65
65
update_reference (
66
66
ctx,
67
67
edit,
68
68
reference,
69
69
& source_file,
70
- & module_def ,
70
+ & current_module_def ,
71
71
& mut visited_modules_set,
72
72
) ;
73
73
}
@@ -95,10 +95,6 @@ fn existing_struct_def(db: &RootDatabase, variant_name: &str, variant: &EnumVari
95
95
. any ( |( name, _) | name. to_string ( ) == variant_name. to_string ( ) )
96
96
}
97
97
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
-
102
98
fn insert_import (
103
99
ctx : & AssistContext ,
104
100
builder : & mut AssistBuilder ,
@@ -186,23 +182,16 @@ fn update_reference(
186
182
let call = path_expr. syntax ( ) . parent ( ) . and_then ( ast:: CallExpr :: cast) ?;
187
183
let list = call. arg_list ( ) ?;
188
184
let segment = path_expr. path ( ) ?. segment ( ) ?;
185
+ let segment_name = segment. name_ref ( ) ?;
186
+ let module = ctx. sema . scope ( & path_expr. syntax ( ) ) . module ( ) ?;
189
187
let list_range = list. syntax ( ) . text_range ( ) ;
190
188
let inside_list_range = TextRange :: new (
191
189
list_range. start ( ) . checked_add ( TextSize :: from ( 1 ) ) ?,
192
190
list_range. end ( ) . checked_sub ( TextSize :: from ( 1 ) ) ?,
193
191
) ;
194
192
edit. perform ( reference. file_range . file_id , |builder| {
195
- let module = ctx. sema . scope ( & path_expr. syntax ( ) ) . module ( ) . unwrap ( ) ;
196
193
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 ( )
206
195
{
207
196
visited_modules_set. insert ( module) ;
208
197
}
0 commit comments