33// - Remove unused aliases if there are no longer any users, see inline_call.rs.
44
55use hir:: { HasSource , PathResolution } ;
6- use ide_db:: { defs:: Definition , search:: FileReference } ;
6+ use ide_db:: {
7+ defs:: Definition , imports:: insert_use:: ast_to_remove_for_path_in_use_stmt,
8+ search:: FileReference ,
9+ } ;
710use itertools:: Itertools ;
811use std:: collections:: HashMap ;
912use syntax:: {
@@ -16,6 +19,8 @@ use crate::{
1619 AssistId , AssistKind ,
1720} ;
1821
22+ use super :: inline_call:: split_refs_and_uses;
23+
1924// Assist: inline_type_alias_uses
2025//
2126// Inline a type alias into all of its uses where possible.
@@ -31,7 +36,7 @@ use crate::{
3136// ```
3237// ->
3338// ```
34- // type A = i32;
39+ //
3540// fn id(x: i32) -> i32 {
3641// x
3742// };
@@ -58,32 +63,41 @@ pub(crate) fn inline_type_alias_uses(acc: &mut Assists, ctx: &AssistContext<'_>)
5863 name. syntax ( ) . text_range ( ) ,
5964 |builder| {
6065 let usages = usages. all ( ) ;
66+ let mut definition_deleted = false ;
6167
6268 let mut inline_refs_for_file = |file_id, refs : Vec < FileReference > | {
6369 builder. edit_file ( file_id) ;
6470
65- let path_types: Vec < ast:: PathType > = refs
66- . into_iter ( )
67- . filter_map ( |file_ref| match file_ref. name {
68- ast:: NameLike :: NameRef ( path_type) => {
69- path_type. syntax ( ) . ancestors ( ) . nth ( 3 ) . and_then ( ast:: PathType :: cast)
70- }
71- _ => None ,
72- } )
73- . collect ( ) ;
71+ let ( path_types, path_type_uses) =
72+ split_refs_and_uses ( builder, refs, |path_type| {
73+ path_type. syntax ( ) . ancestors ( ) . nth ( 3 ) . and_then ( ast:: PathType :: cast)
74+ } ) ;
7475
76+ path_type_uses
77+ . iter ( )
78+ . flat_map ( ast_to_remove_for_path_in_use_stmt)
79+ . for_each ( |x| builder. delete ( x. syntax ( ) . text_range ( ) ) ) ;
7580 for ( target, replacement) in path_types. into_iter ( ) . filter_map ( |path_type| {
7681 let replacement = inline ( & ast_alias, & path_type) ?. to_text ( & concrete_type) ;
7782 let target = path_type. syntax ( ) . text_range ( ) ;
7883 Some ( ( target, replacement) )
7984 } ) {
8085 builder. replace ( target, replacement) ;
8186 }
87+
88+ if file_id == ctx. file_id ( ) {
89+ builder. delete ( ast_alias. syntax ( ) . text_range ( ) ) ;
90+ definition_deleted = true ;
91+ }
8292 } ;
8393
8494 for ( file_id, refs) in usages. into_iter ( ) {
8595 inline_refs_for_file ( file_id, refs) ;
8696 }
97+ if !definition_deleted {
98+ builder. edit_file ( ctx. file_id ( ) ) ;
99+ builder. delete ( ast_alias. syntax ( ) . text_range ( ) ) ;
100+ }
87101 } ,
88102 )
89103}
@@ -929,7 +943,7 @@ fn foo() {
929943}
930944"# ,
931945 r#"
932- type A = u32;
946+
933947
934948fn foo() {
935949 let _: u32 = 3;
@@ -960,13 +974,13 @@ fn foo() {
960974 r#"
961975//- /lib.rs
962976mod foo;
963- type T<E> = Vec<E>;
977+
964978fn f() -> Vec<&str> {
965979 vec!["hello"]
966980}
967981
968982//- /foo.rs
969- use super::T;
983+
970984fn foo() {
971985 let _: Vec<i8> = Vec::new();
972986}
@@ -990,7 +1004,12 @@ fn foo() {
9901004}
9911005"# ,
9921006 r#"
993- use super::I;
1007+ //- /lib.rs
1008+ mod foo;
1009+
1010+
1011+ //- /foo.rs
1012+
9941013fn foo() {
9951014 let _: i32 = 0;
9961015}
0 commit comments