@@ -18,6 +18,7 @@ use ide_db::{
18
18
} ,
19
19
FxIndexSet , RootDatabase ,
20
20
} ;
21
+ use itertools:: Itertools ;
21
22
use syntax:: {
22
23
ast:: {
23
24
self , edit:: IndentLevel , edit_in_place:: Indent , AstNode , AstToken , HasGenericParams ,
@@ -114,8 +115,7 @@ pub(crate) fn extract_function(acc: &mut Assists, ctx: &AssistContext<'_>) -> Op
114
115
return ;
115
116
}
116
117
117
- let params =
118
- body. extracted_function_params ( ctx, & container_info, locals_used. iter ( ) . copied ( ) ) ;
118
+ let params = body. extracted_function_params ( ctx, & container_info, locals_used) ;
119
119
120
120
let name = make_function_name ( & semantics_scope) ;
121
121
@@ -1067,9 +1067,11 @@ impl FunctionBody {
1067
1067
& self ,
1068
1068
ctx : & AssistContext < ' _ > ,
1069
1069
container_info : & ContainerInfo ,
1070
- locals : impl Iterator < Item = Local > ,
1070
+ locals : FxIndexSet < Local > ,
1071
1071
) -> Vec < Param > {
1072
1072
locals
1073
+ . into_iter ( )
1074
+ . sorted ( )
1073
1075
. map ( |local| ( local, local. primary_source ( ctx. db ( ) ) ) )
1074
1076
. filter ( |( _, src) | is_defined_outside_of_body ( ctx, self , src) )
1075
1077
. filter_map ( |( local, src) | match src. into_ident_pat ( ) {
@@ -3167,11 +3169,11 @@ fn foo() {
3167
3169
let mut c = C { p: P { n: 0 } };
3168
3170
let mut v = C { p: P { n: 0 } };
3169
3171
let u = C { p: P { n: 0 } };
3170
- fun_name(&mut c, &u, & mut v);
3172
+ fun_name(&mut c, &mut v, &u );
3171
3173
let m = c.p.n + v.p.n + u.p.n;
3172
3174
}
3173
3175
3174
- fn $0fun_name(c: &mut C, u : &C, v : &mut C) {
3176
+ fn $0fun_name(c: &mut C, v : &mut C, u : &C) {
3175
3177
c.p.n += u.p.n;
3176
3178
let r = &mut v.p.n;
3177
3179
}
@@ -5602,10 +5604,10 @@ fn parent(factor: i32) {
5602
5604
fn parent(factor: i32) {
5603
5605
let v = &[1, 2, 3];
5604
5606
5605
- fun_name(v, factor );
5607
+ fun_name(factor, v );
5606
5608
}
5607
5609
5608
- fn $0fun_name(v: &[i32; 3], factor: i32 ) {
5610
+ fn $0fun_name(factor: i32, v: &[i32; 3]) {
5609
5611
v.iter().map(|it| it * factor);
5610
5612
}
5611
5613
"# ,
@@ -5786,11 +5788,11 @@ struct Struct<T: Into<i32>>(T);
5786
5788
impl <T: Into<i32> + Copy> Struct<T> {
5787
5789
fn func<V: Into<i32>>(&self, v: V) -> i32 {
5788
5790
let t = self.0;
5789
- fun_name(t, v )
5791
+ fun_name(v, t )
5790
5792
}
5791
5793
}
5792
5794
5793
- fn $0fun_name<T: Into<i32> + Copy, V: Into<i32>>(t: T, v: V ) -> i32 {
5795
+ fn $0fun_name<T: Into<i32> + Copy, V: Into<i32>>(v: V, t: T ) -> i32 {
5794
5796
t.into() + v.into()
5795
5797
}
5796
5798
"# ,
@@ -5815,11 +5817,11 @@ struct Struct<T: Into<i32>, U: Debug>(T, U);
5815
5817
impl <T: Into<i32> + Copy, U: Debug> Struct<T, U> {
5816
5818
fn func<V: Into<i32>>(&self, v: V) -> i32 {
5817
5819
let t = self.0;
5818
- fun_name(t, v )
5820
+ fun_name(v, t )
5819
5821
}
5820
5822
}
5821
5823
5822
- fn $0fun_name<T: Into<i32> + Copy, V: Into<i32>>(t: T, v: V ) -> i32 {
5824
+ fn $0fun_name<T: Into<i32> + Copy, V: Into<i32>>(v: V, t: T ) -> i32 {
5823
5825
t.into() + v.into()
5824
5826
}
5825
5827
"# ,
@@ -5844,11 +5846,11 @@ struct Struct<T>(T) where T: Into<i32>;
5844
5846
impl <T> Struct<T> where T: Into<i32> + Copy {
5845
5847
fn func<V>(&self, v: V) -> i32 where V: Into<i32> {
5846
5848
let t = self.0;
5847
- fun_name(t, v )
5849
+ fun_name(v, t )
5848
5850
}
5849
5851
}
5850
5852
5851
- fn $0fun_name<T, V>(t: T, v: V ) -> i32 where T: Into<i32> + Copy, V: Into<i32> {
5853
+ fn $0fun_name<T, V>(v: V, t: T ) -> i32 where T: Into<i32> + Copy, V: Into<i32> {
5852
5854
t.into() + v.into()
5853
5855
}
5854
5856
"# ,
@@ -5873,11 +5875,11 @@ struct Struct<T, U>(T, U) where T: Into<i32>, U: Debug;
5873
5875
impl <T, U> Struct<T, U> where T: Into<i32> + Copy, U: Debug {
5874
5876
fn func<V>(&self, v: V) -> i32 where V: Into<i32> {
5875
5877
let t = self.0;
5876
- fun_name(t, v )
5878
+ fun_name(v, t )
5877
5879
}
5878
5880
}
5879
5881
5880
- fn $0fun_name<T, V>(t: T, v: V ) -> i32 where T: Into<i32> + Copy, V: Into<i32> {
5882
+ fn $0fun_name<T, V>(v: V, t: T ) -> i32 where T: Into<i32> + Copy, V: Into<i32> {
5881
5883
t.into() + v.into()
5882
5884
}
5883
5885
"# ,
@@ -6106,6 +6108,31 @@ fn $0fun_name() -> i32 {
6106
6108
) ;
6107
6109
}
6108
6110
6111
+ #[ test]
6112
+ fn sort_params_in_order ( ) {
6113
+ check_assist (
6114
+ extract_function,
6115
+ r#"
6116
+ fn existing(a: i32, b: i32, c: i32) {
6117
+ let x = 32;
6118
+
6119
+ let p = $0x + b + c + a$0;
6120
+ }
6121
+ "# ,
6122
+ r#"
6123
+ fn existing(a: i32, b: i32, c: i32) {
6124
+ let x = 32;
6125
+
6126
+ let p = fun_name(a, b, c, x);
6127
+ }
6128
+
6129
+ fn $0fun_name(a: i32, b: i32, c: i32, x: i32) -> i32 {
6130
+ x + b + c + a
6131
+ }
6132
+ "# ,
6133
+ ) ;
6134
+ }
6135
+
6109
6136
#[ test]
6110
6137
fn in_left_curly_is_not_applicable ( ) {
6111
6138
cov_mark:: check!( extract_function_in_braces_is_not_applicable) ;
0 commit comments