1
- use ra_ide_db:: {
2
- defs:: Definition , imports_locator:: ImportsLocator , search:: Reference , RootDatabase ,
3
- } ;
1
+ use ra_ide_db:: { defs:: Definition , search:: Reference , RootDatabase } ;
4
2
use ra_syntax:: {
5
3
algo:: find_node_at_offset,
6
4
ast:: { self , AstNode , NameOwner } ,
@@ -9,11 +7,11 @@ use ra_syntax::{
9
7
10
8
use crate :: {
11
9
assist_context:: { AssistBuilder , AssistDirector } ,
12
- utils:: insert_use :: insert_use_statement_with_string_path ,
10
+ utils:: insert_use_statement ,
13
11
AssistContext , AssistId , Assists ,
14
12
} ;
15
13
use ast:: { ArgListOwner , VisibilityOwner } ;
16
- use hir:: { EnumVariant , Module , ModuleDef } ;
14
+ use hir:: { EnumVariant , Module , ModuleDef , Name } ;
17
15
use ra_db:: FileId ;
18
16
use ra_fmt:: leading_indent;
19
17
use rustc_hash:: FxHashSet ;
@@ -46,11 +44,11 @@ pub(crate) fn extract_struct_from_enum_variant(
46
44
return None ;
47
45
}
48
46
let enum_ast = variant. parent_enum ( ) ;
49
- let enum_name = enum_ast. name ( ) ?. to_string ( ) ;
50
47
let visibility = enum_ast. visibility ( ) ;
51
- let current_module_def =
52
- ImportsLocator :: new ( ctx. db ) . find_imports ( & enum_name) . first ( ) ?. left ( ) ?;
53
- let current_module = current_module_def. module ( ctx. db ) ?;
48
+ let enum_hir = ctx. sema . to_def ( & enum_ast) ?;
49
+ let variant_hir_name = variant_hir. name ( ctx. db ) ;
50
+ let enum_module_def = ModuleDef :: from ( enum_hir) ;
51
+ let current_module = enum_hir. module ( ctx. db ) ;
54
52
let target = variant. syntax ( ) . text_range ( ) ;
55
53
acc. add_in_multiple_files (
56
54
AssistId ( "extract_struct_from_enum_variant" ) ,
@@ -69,7 +67,8 @@ pub(crate) fn extract_struct_from_enum_variant(
69
67
edit,
70
68
reference,
71
69
& source_file,
72
- & current_module_def,
70
+ & enum_module_def,
71
+ & variant_hir_name,
73
72
& mut visited_modules_set,
74
73
) ;
75
74
}
@@ -102,20 +101,15 @@ fn insert_import(
102
101
builder : & mut AssistBuilder ,
103
102
path : & ast:: PathExpr ,
104
103
module : & Module ,
105
- module_def : & ModuleDef ,
106
- path_segment : ast :: NameRef ,
104
+ enum_module_def : & ModuleDef ,
105
+ variant_hir_name : & Name ,
107
106
) -> Option < ( ) > {
108
107
let db = ctx. db ;
109
- let mod_path = module. find_use_path ( db, module_def . clone ( ) ) ;
108
+ let mod_path = module. find_use_path ( db, enum_module_def . clone ( ) ) ;
110
109
if let Some ( mut mod_path) = mod_path {
111
110
mod_path. segments . pop ( ) ;
112
- let use_path = format ! ( "{}::{}" , mod_path. to_string( ) , path_segment. to_string( ) ) ;
113
- insert_use_statement_with_string_path (
114
- path. syntax ( ) ,
115
- & use_path,
116
- ctx,
117
- builder. text_edit_builder ( ) ,
118
- ) ;
111
+ mod_path. segments . push ( variant_hir_name. clone ( ) ) ;
112
+ insert_use_statement ( path. syntax ( ) , & mod_path, ctx, builder. text_edit_builder ( ) ) ;
119
113
}
120
114
Some ( ( ) )
121
115
}
@@ -175,7 +169,8 @@ fn update_reference(
175
169
edit : & mut AssistDirector ,
176
170
reference : Reference ,
177
171
source_file : & SourceFile ,
178
- module_def : & ModuleDef ,
172
+ enum_module_def : & ModuleDef ,
173
+ variant_hir_name : & Name ,
179
174
visited_modules_set : & mut FxHashSet < Module > ,
180
175
) -> Option < ( ) > {
181
176
let path_expr: ast:: PathExpr = find_node_at_offset :: < ast:: PathExpr > (
@@ -185,7 +180,6 @@ fn update_reference(
185
180
let call = path_expr. syntax ( ) . parent ( ) . and_then ( ast:: CallExpr :: cast) ?;
186
181
let list = call. arg_list ( ) ?;
187
182
let segment = path_expr. path ( ) ?. segment ( ) ?;
188
- let segment_name = segment. name_ref ( ) ?;
189
183
let module = ctx. sema . scope ( & path_expr. syntax ( ) ) . module ( ) ?;
190
184
let list_range = list. syntax ( ) . text_range ( ) ;
191
185
let inside_list_range = TextRange :: new (
@@ -194,7 +188,8 @@ fn update_reference(
194
188
) ;
195
189
edit. perform ( reference. file_range . file_id , |builder| {
196
190
if !visited_modules_set. contains ( & module) {
197
- if insert_import ( ctx, builder, & path_expr, & module, module_def, segment_name) . is_some ( )
191
+ if insert_import ( ctx, builder, & path_expr, & module, enum_module_def, variant_hir_name)
192
+ . is_some ( )
198
193
{
199
194
visited_modules_set. insert ( module) ;
200
195
}
0 commit comments