@@ -4,7 +4,10 @@ use ide_db::{
44 search:: { FileReference , SearchScope , UsageSearchResult } ,
55} ;
66use itertools:: Itertools ;
7- use syntax:: { TextRange , ast:: { self , AstNode , IdentPat , NameOwner } } ;
7+ use syntax:: {
8+ ast:: { self , AstNode , IdentPat , NameOwner } ,
9+ TextRange ,
10+ } ;
811
912use crate :: assist_context:: { AssistBuilder , AssistContext , Assists } ;
1013
@@ -49,7 +52,11 @@ pub(crate) fn destructure_tuple_binding(acc: &mut Assists, ctx: &AssistContext)
4952 destructure_tuple_binding_impl ( acc, ctx, false )
5053}
5154
52- pub ( crate ) fn destructure_tuple_binding_impl ( acc : & mut Assists , ctx : & AssistContext , with_sub_pattern : bool ) -> Option < ( ) > {
55+ pub ( crate ) fn destructure_tuple_binding_impl (
56+ acc : & mut Assists ,
57+ ctx : & AssistContext ,
58+ with_sub_pattern : bool ,
59+ ) -> Option < ( ) > {
5360 let ident_pat = ctx. find_node_at_offset :: < ast:: IdentPat > ( ) ?;
5461 let data = collect_data ( ident_pat, ctx) ?;
5562
@@ -121,7 +128,7 @@ fn generate_name(
121128 _usages : & Option < UsageSearchResult > ,
122129 _ctx : & AssistContext ,
123130) -> String {
124- //TODO : detect if name already used
131+ // FIXME : detect if name already used
125132 format ! ( "_{}" , index)
126133}
127134
@@ -133,16 +140,19 @@ struct TupleData {
133140 // field_types: Vec<Type>,
134141 usages : Option < UsageSearchResult > ,
135142}
136- fn edit_tuple_assignment ( data : & TupleData , builder : & mut AssistBuilder , ctx : & AssistContext , in_sub_pattern : bool ) {
143+ fn edit_tuple_assignment (
144+ data : & TupleData ,
145+ builder : & mut AssistBuilder ,
146+ ctx : & AssistContext ,
147+ in_sub_pattern : bool ,
148+ ) {
137149 let tuple_pat = {
138150 let original = & data. ident_pat ;
139151 let is_ref = original. ref_token ( ) . is_some ( ) ;
140152 let is_mut = original. mut_token ( ) . is_some ( ) ;
141- let fields =
142- data
143- . field_names
144- . iter ( )
145- . map ( |name| ast:: Pat :: from ( ast:: make:: ident_pat ( is_ref, is_mut, ast:: make:: name ( name) ) ) ) ;
153+ let fields = data. field_names . iter ( ) . map ( |name| {
154+ ast:: Pat :: from ( ast:: make:: ident_pat ( is_ref, is_mut, ast:: make:: name ( name) ) )
155+ } ) ;
146156 ast:: make:: tuple_pat ( fields)
147157 } ;
148158
@@ -231,17 +241,17 @@ fn detect_tuple_index(usage: &FileReference, data: &TupleData) -> Option<TupleIn
231241 // PAREN_EXRP*
232242 // FIELD_EXPR
233243
234- let node =
235- usage. name . syntax ( )
244+ let node = usage
245+ . name
246+ . syntax ( )
236247 . ancestors ( )
237248 . skip_while ( |s| !ast:: PathExpr :: can_cast ( s. kind ( ) ) )
238249 . skip ( 1 ) // PATH_EXPR
239- . find ( |s| !ast:: ParenExpr :: can_cast ( s. kind ( ) ) ) ?; // skip parentheses
250+ . find ( |s| !ast:: ParenExpr :: can_cast ( s. kind ( ) ) ) ?; // skip parentheses
240251
241252 if let Some ( field_expr) = ast:: FieldExpr :: cast ( node) {
242253 let idx = field_expr. name_ref ( ) ?. as_tuple_field ( ) ?;
243254 if idx < data. field_names . len ( ) {
244-
245255 // special case: in macro call -> range of `field_expr` in applied macro, NOT range in actual file!
246256 if field_expr. syntax ( ) . ancestors ( ) . any ( |a| ast:: MacroStmts :: can_cast ( a. kind ( ) ) ) {
247257 cov_mark:: hit!( destructure_tuple_macro_call) ;
@@ -260,10 +270,7 @@ fn detect_tuple_index(usage: &FileReference, data: &TupleData) -> Option<TupleIn
260270 return None ;
261271 }
262272
263- Some ( TupleIndex {
264- index : idx,
265- range : field_expr. syntax ( ) . text_range ( ) ,
266- } )
273+ Some ( TupleIndex { index : idx, range : field_expr. syntax ( ) . text_range ( ) } )
267274 } else {
268275 // tuple index out of range
269276 None
@@ -279,7 +286,7 @@ mod tests {
279286
280287 use crate :: tests:: { check_assist, check_assist_not_applicable} ;
281288
282- // Tests for direct tuple destructure:
289+ // Tests for direct tuple destructure:
283290 // `let $0t = (1,2);` -> `let (_0, _1) = (1,2);`
284291
285292 fn assist ( acc : & mut Assists , ctx : & AssistContext ) -> Option < ( ) > {
@@ -459,13 +466,13 @@ fn main() {
459466 r#"
460467fn main() {
461468 let $0t = ("3.14", 0);
462- let pi: f32 = t.0.parse().unwrap( );
469+ let pi: f32 = t.0.parse().unwrap_or(0.0 );
463470}
464471 "# ,
465472 r#"
466473fn main() {
467474 let ($0_0, _1) = ("3.14", 0);
468- let pi: f32 = _0.parse().unwrap( );
475+ let pi: f32 = _0.parse().unwrap_or(0.0 );
469476}
470477 "# ,
471478 )
@@ -849,7 +856,6 @@ fn f(o: Option<(usize, usize)>) {
849856 )
850857 }
851858
852-
853859 #[ test]
854860 fn in_match ( ) {
855861 check_assist (
@@ -1019,7 +1025,7 @@ fn main() {
10191025 assist,
10201026 r#"
10211027fn main {
1022- let $0t =
1028+ let $0t =
10231029 if 1 > 2 {
10241030 (1,2)
10251031 } else {
@@ -1036,7 +1042,7 @@ fn main {
10361042 "# ,
10371043 r#"
10381044fn main {
1039- let ($0_0, _1) =
1045+ let ($0_0, _1) =
10401046 if 1 > 2 {
10411047 (1,2)
10421048 } else {
@@ -1062,28 +1068,21 @@ fn main {
10621068 destructure_tuple_binding_impl ( acc, ctx, true )
10631069 }
10641070
1065- pub ( crate ) fn check_in_place_assist (
1066-
1067- ra_fixture_before : & str ,
1068- ra_fixture_after : & str ,
1069- ) {
1071+ pub ( crate ) fn check_in_place_assist ( ra_fixture_before : & str , ra_fixture_after : & str ) {
10701072 check_assist_by_label (
1071- assist,
1072- ra_fixture_before,
1073- ra_fixture_after,
1074- "Destructure tuple in place"
1073+ assist,
1074+ ra_fixture_before,
1075+ ra_fixture_after,
1076+ "Destructure tuple in place" ,
10751077 ) ;
10761078 }
10771079
1078- pub ( crate ) fn check_sub_pattern_assist (
1079- ra_fixture_before : & str ,
1080- ra_fixture_after : & str ,
1081- ) {
1080+ pub ( crate ) fn check_sub_pattern_assist ( ra_fixture_before : & str , ra_fixture_after : & str ) {
10821081 check_assist_by_label (
1083- assist,
1084- ra_fixture_before,
1085- ra_fixture_after,
1086- "Destructure tuple in sub-pattern"
1082+ assist,
1083+ ra_fixture_before,
1084+ ra_fixture_after,
1085+ "Destructure tuple in sub-pattern" ,
10871086 ) ;
10881087 }
10891088
@@ -1097,11 +1096,11 @@ fn main {
10971096 }
10981097 }
10991098
1100- /// Tests for destructure of tuple in sub-pattern:
1099+ /// Tests for destructure of tuple in sub-pattern:
11011100 /// `let $0t = (1,2);` -> `let t @ (_0, _1) = (1,2);`
11021101 mod sub_pattern {
1103- use super :: * ;
11041102 use super :: assist:: * ;
1103+ use super :: * ;
11051104 use crate :: tests:: check_assist_by_label;
11061105
11071106 #[ test]
@@ -1123,7 +1122,7 @@ fn main() {
11231122 "# ,
11241123 )
11251124 }
1126-
1125+
11271126 #[ test]
11281127 fn trigger_both_destructure_tuple_assists ( ) {
11291128 fn assist ( acc : & mut Assists , ctx : & AssistContext ) -> Option < ( ) > {
@@ -1135,23 +1134,23 @@ fn main() {
11351134}
11361135 "# ;
11371136 check_assist_by_label (
1138- assist,
1139- text,
1137+ assist,
1138+ text,
11401139 r#"
11411140fn main() {
11421141 let ($0_0, _1) = (1,2);
11431142}
1144- "# ,
1143+ "# ,
11451144 "Destructure tuple in place" ,
11461145 ) ;
11471146 check_assist_by_label (
1148- assist,
1149- text,
1147+ assist,
1148+ text,
11501149 r#"
11511150fn main() {
11521151 let t @ ($0_0, _1) = (1,2);
11531152}
1154- "# ,
1153+ "# ,
11551154 "Destructure tuple in sub-pattern" ,
11561155 ) ;
11571156 }
@@ -1175,7 +1174,7 @@ fn main() {
11751174 "# ,
11761175 )
11771176 }
1178-
1177+
11791178 #[ test]
11801179 fn keep_function_call ( ) {
11811180 cov_mark:: check!( destructure_tuple_call_with_subpattern) ;
@@ -1194,7 +1193,7 @@ fn main() {
11941193 "# ,
11951194 )
11961195 }
1197-
1196+
11981197 #[ test]
11991198 fn keep_type ( ) {
12001199 check_sub_pattern_assist (
@@ -1293,11 +1292,10 @@ fn main() {
12931292 }
12941293
12951294 /// Tests for tuple usage in macro call:
1296- /// `dbg!( t.0)`
1297- mod in_macro_call {
1295+ /// `println!("{}", t.0)`
1296+ mod in_macro_call {
12981297 use super :: assist:: * ;
12991298
1300-
13011299 #[ test]
13021300 fn detect_macro_call ( ) {
13031301 cov_mark:: check!( destructure_tuple_macro_call) ;
@@ -1539,7 +1537,6 @@ fn main() {
15391537}
15401538 "# ,
15411539 )
1542-
15431540 }
15441541 }
15451542}
0 commit comments