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 } ;
42use ra_syntax:: {
53 algo:: find_node_at_offset,
64 ast:: { self , AstNode , NameOwner } ,
@@ -9,11 +7,11 @@ use ra_syntax::{
97
108use crate :: {
119 assist_context:: { AssistBuilder , AssistDirector } ,
12- utils:: insert_use :: insert_use_statement_with_string_path ,
10+ utils:: insert_use_statement ,
1311 AssistContext , AssistId , Assists ,
1412} ;
1513use ast:: { ArgListOwner , VisibilityOwner } ;
16- use hir:: { EnumVariant , Module , ModuleDef } ;
14+ use hir:: { EnumVariant , Module , ModuleDef , Name } ;
1715use ra_db:: FileId ;
1816use ra_fmt:: leading_indent;
1917use rustc_hash:: FxHashSet ;
@@ -46,11 +44,11 @@ pub(crate) fn extract_struct_from_enum_variant(
4644 return None ;
4745 }
4846 let enum_ast = variant. parent_enum ( ) ;
49- let enum_name = enum_ast. name ( ) ?. to_string ( ) ;
5047 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 ) ;
5452 let target = variant. syntax ( ) . text_range ( ) ;
5553 acc. add_in_multiple_files (
5654 AssistId ( "extract_struct_from_enum_variant" ) ,
@@ -69,7 +67,8 @@ pub(crate) fn extract_struct_from_enum_variant(
6967 edit,
7068 reference,
7169 & source_file,
72- & current_module_def,
70+ & enum_module_def,
71+ & variant_hir_name,
7372 & mut visited_modules_set,
7473 ) ;
7574 }
@@ -102,20 +101,15 @@ fn insert_import(
102101 builder : & mut AssistBuilder ,
103102 path : & ast:: PathExpr ,
104103 module : & Module ,
105- module_def : & ModuleDef ,
106- path_segment : ast :: NameRef ,
104+ enum_module_def : & ModuleDef ,
105+ variant_hir_name : & Name ,
107106) -> Option < ( ) > {
108107 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 ( ) ) ;
110109 if let Some ( mut mod_path) = mod_path {
111110 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 ( ) ) ;
119113 }
120114 Some ( ( ) )
121115}
@@ -175,7 +169,8 @@ fn update_reference(
175169 edit : & mut AssistDirector ,
176170 reference : Reference ,
177171 source_file : & SourceFile ,
178- module_def : & ModuleDef ,
172+ enum_module_def : & ModuleDef ,
173+ variant_hir_name : & Name ,
179174 visited_modules_set : & mut FxHashSet < Module > ,
180175) -> Option < ( ) > {
181176 let path_expr: ast:: PathExpr = find_node_at_offset :: < ast:: PathExpr > (
@@ -185,7 +180,6 @@ fn update_reference(
185180 let call = path_expr. syntax ( ) . parent ( ) . and_then ( ast:: CallExpr :: cast) ?;
186181 let list = call. arg_list ( ) ?;
187182 let segment = path_expr. path ( ) ?. segment ( ) ?;
188- let segment_name = segment. name_ref ( ) ?;
189183 let module = ctx. sema . scope ( & path_expr. syntax ( ) ) . module ( ) ?;
190184 let list_range = list. syntax ( ) . text_range ( ) ;
191185 let inside_list_range = TextRange :: new (
@@ -194,7 +188,8 @@ fn update_reference(
194188 ) ;
195189 edit. perform ( reference. file_range . file_id , |builder| {
196190 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 ( )
198193 {
199194 visited_modules_set. insert ( module) ;
200195 }
0 commit comments