@@ -12,9 +12,6 @@ mod doc_tests;
12
12
mod utils;
13
13
pub mod ast_transform;
14
14
15
- use std:: cmp:: Ordering ;
16
-
17
- use either:: Either ;
18
15
use ra_db:: FileRange ;
19
16
use ra_ide_db:: RootDatabase ;
20
17
use ra_syntax:: { TextRange , TextUnit } ;
@@ -35,6 +32,9 @@ pub struct AssistLabel {
35
32
pub id : AssistId ,
36
33
}
37
34
35
+ #[ derive( Clone , Debug ) ]
36
+ pub struct GroupLabel ( pub String ) ;
37
+
38
38
impl AssistLabel {
39
39
pub ( crate ) fn new ( label : String , id : AssistId ) -> AssistLabel {
40
40
// FIXME: make fields private, so that this invariant can't be broken
@@ -45,7 +45,6 @@ impl AssistLabel {
45
45
46
46
#[ derive( Debug , Clone ) ]
47
47
pub struct AssistAction {
48
- pub label : Option < String > ,
49
48
pub edit : TextEdit ,
50
49
pub cursor_position : Option < TextUnit > ,
51
50
// FIXME: This belongs to `AssistLabel`
@@ -55,16 +54,8 @@ pub struct AssistAction {
55
54
#[ derive( Debug , Clone ) ]
56
55
pub struct ResolvedAssist {
57
56
pub label : AssistLabel ,
58
- pub action_data : Either < AssistAction , Vec < AssistAction > > ,
59
- }
60
-
61
- impl ResolvedAssist {
62
- pub fn get_first_action ( & self ) -> AssistAction {
63
- match & self . action_data {
64
- Either :: Left ( action) => action. clone ( ) ,
65
- Either :: Right ( actions) => actions[ 0 ] . clone ( ) ,
66
- }
67
- }
57
+ pub group_label : Option < GroupLabel > ,
58
+ pub action : AssistAction ,
68
59
}
69
60
70
61
/// Return all the assists applicable at the given position.
@@ -76,10 +67,8 @@ pub fn unresolved_assists(db: &RootDatabase, range: FileRange) -> Vec<AssistLabe
76
67
handlers:: all ( )
77
68
. iter ( )
78
69
. filter_map ( |f| f ( ctx. clone ( ) ) )
79
- . map ( |a| match a {
80
- Assist :: Unresolved { label } => label,
81
- Assist :: Resolved { .. } => unreachable ! ( ) ,
82
- } )
70
+ . flat_map ( |it| it. 0 )
71
+ . map ( |a| a. label )
83
72
. collect ( )
84
73
}
85
74
@@ -92,24 +81,13 @@ pub fn resolved_assists(db: &RootDatabase, range: FileRange) -> Vec<ResolvedAssi
92
81
let mut a = handlers:: all ( )
93
82
. iter ( )
94
83
. filter_map ( |f| f ( ctx. clone ( ) ) )
95
- . map ( |a| match a {
96
- Assist :: Resolved { assist } => assist,
97
- Assist :: Unresolved { .. } => unreachable ! ( ) ,
98
- } )
84
+ . flat_map ( |it| it. 0 )
85
+ . map ( |it| it. into_resolved ( ) . unwrap ( ) )
99
86
. collect :: < Vec < _ > > ( ) ;
100
- sort_assists ( & mut a ) ;
87
+ a . sort_by_key ( |it| it . action . target . map_or ( TextUnit :: from ( ! 0u32 ) , |it| it . len ( ) ) ) ;
101
88
a
102
89
}
103
90
104
- fn sort_assists ( assists : & mut [ ResolvedAssist ] ) {
105
- assists. sort_by ( |a, b| match ( a. get_first_action ( ) . target , b. get_first_action ( ) . target ) {
106
- ( Some ( a) , Some ( b) ) => a. len ( ) . cmp ( & b. len ( ) ) ,
107
- ( Some ( _) , None ) => Ordering :: Less ,
108
- ( None , Some ( _) ) => Ordering :: Greater ,
109
- ( None , None ) => Ordering :: Equal ,
110
- } ) ;
111
- }
112
-
113
91
mod handlers {
114
92
use crate :: AssistHandler ;
115
93
@@ -184,7 +162,7 @@ mod helpers {
184
162
use ra_syntax:: TextRange ;
185
163
use test_utils:: { add_cursor, assert_eq_text, extract_offset, extract_range} ;
186
164
187
- use crate :: { Assist , AssistCtx , AssistHandler } ;
165
+ use crate :: { AssistCtx , AssistHandler } ;
188
166
189
167
pub ( crate ) fn with_single_file ( text : & str ) -> ( RootDatabase , FileId ) {
190
168
let ( mut db, file_id) = RootDatabase :: with_single_file ( text) ;
@@ -202,10 +180,7 @@ mod helpers {
202
180
FileRange { file_id, range : TextRange :: offset_len ( before_cursor_pos, 0 . into ( ) ) } ;
203
181
let assist =
204
182
assist ( AssistCtx :: new ( & db, frange, true ) ) . expect ( "code action is not applicable" ) ;
205
- let action = match assist {
206
- Assist :: Unresolved { .. } => unreachable ! ( ) ,
207
- Assist :: Resolved { assist } => assist. get_first_action ( ) ,
208
- } ;
183
+ let action = assist. 0 [ 0 ] . action . clone ( ) . unwrap ( ) ;
209
184
210
185
let actual = action. edit . apply ( & before) ;
211
186
let actual_cursor_pos = match action. cursor_position {
@@ -225,10 +200,7 @@ mod helpers {
225
200
let frange = FileRange { file_id, range } ;
226
201
let assist =
227
202
assist ( AssistCtx :: new ( & db, frange, true ) ) . expect ( "code action is not applicable" ) ;
228
- let action = match assist {
229
- Assist :: Unresolved { .. } => unreachable ! ( ) ,
230
- Assist :: Resolved { assist } => assist. get_first_action ( ) ,
231
- } ;
203
+ let action = assist. 0 [ 0 ] . action . clone ( ) . unwrap ( ) ;
232
204
233
205
let mut actual = action. edit . apply ( & before) ;
234
206
if let Some ( pos) = action. cursor_position {
@@ -244,10 +216,7 @@ mod helpers {
244
216
FileRange { file_id, range : TextRange :: offset_len ( before_cursor_pos, 0 . into ( ) ) } ;
245
217
let assist =
246
218
assist ( AssistCtx :: new ( & db, frange, true ) ) . expect ( "code action is not applicable" ) ;
247
- let action = match assist {
248
- Assist :: Unresolved { .. } => unreachable ! ( ) ,
249
- Assist :: Resolved { assist } => assist. get_first_action ( ) ,
250
- } ;
219
+ let action = assist. 0 [ 0 ] . action . clone ( ) . unwrap ( ) ;
251
220
252
221
let range = action. target . expect ( "expected target on action" ) ;
253
222
assert_eq_text ! ( & before[ range. start( ) . to_usize( ) ..range. end( ) . to_usize( ) ] , target) ;
@@ -259,10 +228,7 @@ mod helpers {
259
228
let frange = FileRange { file_id, range } ;
260
229
let assist =
261
230
assist ( AssistCtx :: new ( & db, frange, true ) ) . expect ( "code action is not applicable" ) ;
262
- let action = match assist {
263
- Assist :: Unresolved { .. } => unreachable ! ( ) ,
264
- Assist :: Resolved { assist } => assist. get_first_action ( ) ,
265
- } ;
231
+ let action = assist. 0 [ 0 ] . action . clone ( ) . unwrap ( ) ;
266
232
267
233
let range = action. target . expect ( "expected target on action" ) ;
268
234
assert_eq_text ! ( & before[ range. start( ) . to_usize( ) ..range. end( ) . to_usize( ) ] , target) ;
0 commit comments