Skip to content

Commit 58be1ed

Browse files
committed
Make more common assist easier to ues
1 parent 14de9e5 commit 58be1ed

File tree

5 files changed

+88
-42
lines changed

5 files changed

+88
-42
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/assists/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@ profile = { path = "../profile", version = "0.0.0" }
2121
ide_db = { path = "../ide_db", version = "0.0.0" }
2222
hir = { path = "../hir", version = "0.0.0" }
2323
test_utils = { path = "../test_utils", version = "0.0.0" }
24+
25+
[dev-dependencies]
26+
expect-test = "1.1"

crates/assists/src/lib.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,7 @@ mod handlers {
179179
early_return::convert_to_guarded_return,
180180
expand_glob_import::expand_glob_import,
181181
move_module_to_file::move_module_to_file,
182-
extract_function::extract_function,
183182
extract_struct_from_enum_variant::extract_struct_from_enum_variant,
184-
extract_variable::extract_variable,
185183
fill_match_arms::fill_match_arms,
186184
fix_visibility::fix_visibility,
187185
flip_binexpr::flip_binexpr,
@@ -229,12 +227,18 @@ mod handlers {
229227
unmerge_use::unmerge_use,
230228
unwrap_block::unwrap_block,
231229
wrap_return_type_in_result::wrap_return_type_in_result,
232-
// These are manually sorted for better priorities
230+
// These are manually sorted for better priorities. By default,
231+
// priority is determined by the size of the target range (smaller
232+
// target wins). If the ranges are equal, position in this list is
233+
// used as a tie-breaker.
233234
add_missing_impl_members::add_missing_impl_members,
234235
add_missing_impl_members::add_missing_default_members,
235236
//
236237
replace_string_with_char::replace_string_with_char,
237238
raw_string::make_raw_string,
239+
//
240+
extract_variable::extract_variable,
241+
extract_function::extract_function,
238242
// Are you sure you want to add new assist here, and not to the
239243
// sorted list above?
240244
]

crates/assists/src/tests.rs

Lines changed: 67 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mod generated;
22

3+
use expect_test::expect;
34
use hir::Semantics;
45
use ide_db::{
56
base_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt},
@@ -10,11 +11,11 @@ use ide_db::{
1011
source_change::FileSystemEdit,
1112
RootDatabase,
1213
};
14+
use stdx::{format_to, trim_indent};
1315
use syntax::TextRange;
14-
use test_utils::{assert_eq_text, extract_offset, extract_range};
16+
use test_utils::{assert_eq_text, extract_offset};
1517

1618
use crate::{handlers::Handler, Assist, AssistConfig, AssistContext, AssistKind, Assists};
17-
use stdx::{format_to, trim_indent};
1819

1920
pub(crate) const TEST_CONFIG: AssistConfig = AssistConfig {
2021
snippet_cap: SnippetCap::new(true),
@@ -163,6 +164,22 @@ fn check(handler: Handler, before: &str, expected: ExpectedResult, assist_label:
163164
};
164165
}
165166

167+
fn labels(assists: &[Assist]) -> String {
168+
let mut labels = assists
169+
.iter()
170+
.map(|assist| {
171+
let mut label = match &assist.group {
172+
Some(g) => g.0.clone(),
173+
None => assist.label.to_string(),
174+
};
175+
label.push('\n');
176+
label
177+
})
178+
.collect::<Vec<_>>();
179+
labels.dedup();
180+
labels.into_iter().collect::<String>()
181+
}
182+
166183
#[test]
167184
fn assist_order_field_struct() {
168185
let before = "struct Foo { $0bar: u32 }";
@@ -181,66 +198,78 @@ fn assist_order_field_struct() {
181198

182199
#[test]
183200
fn assist_order_if_expr() {
184-
let before = "
185-
pub fn test_some_range(a: int) -> bool {
186-
if let 2..6 = $05$0 {
187-
true
188-
} else {
189-
false
190-
}
191-
}";
192-
let (range, before) = extract_range(before);
193-
let (db, file_id) = with_single_file(&before);
194-
let frange = FileRange { file_id, range };
201+
let (db, frange) = RootDatabase::with_range(
202+
r#"
203+
pub fn test_some_range(a: int) -> bool {
204+
if let 2..6 = $05$0 {
205+
true
206+
} else {
207+
false
208+
}
209+
}
210+
"#,
211+
);
212+
195213
let assists = Assist::get(&db, &TEST_CONFIG, false, frange);
196-
let mut assists = assists.iter();
214+
let expected = labels(&assists);
197215

198-
assert_eq!(assists.next().expect("expected assist").label, "Extract into function");
199-
assert_eq!(assists.next().expect("expected assist").label, "Extract into variable");
200-
assert_eq!(assists.next().expect("expected assist").label, "Replace with match");
216+
expect![[r#"
217+
Convert integer base
218+
Extract into variable
219+
Extract into function
220+
Replace with match
221+
"#]]
222+
.assert_eq(&expected);
201223
}
202224

203225
#[test]
204226
fn assist_filter_works() {
205-
let before = "
206-
pub fn test_some_range(a: int) -> bool {
207-
if let 2..6 = $05$0 {
208-
true
209-
} else {
210-
false
211-
}
212-
}";
213-
let (range, before) = extract_range(before);
214-
let (db, file_id) = with_single_file(&before);
215-
let frange = FileRange { file_id, range };
216-
227+
let (db, frange) = RootDatabase::with_range(
228+
r#"
229+
pub fn test_some_range(a: int) -> bool {
230+
if let 2..6 = $05$0 {
231+
true
232+
} else {
233+
false
234+
}
235+
}
236+
"#,
237+
);
217238
{
218239
let mut cfg = TEST_CONFIG;
219240
cfg.allowed = Some(vec![AssistKind::Refactor]);
220241

221242
let assists = Assist::get(&db, &cfg, false, frange);
222-
let mut assists = assists.iter();
243+
let expected = labels(&assists);
223244

224-
assert_eq!(assists.next().expect("expected assist").label, "Extract into function");
225-
assert_eq!(assists.next().expect("expected assist").label, "Extract into variable");
226-
assert_eq!(assists.next().expect("expected assist").label, "Replace with match");
245+
expect![[r#"
246+
Convert integer base
247+
Extract into variable
248+
Extract into function
249+
Replace with match
250+
"#]]
251+
.assert_eq(&expected);
227252
}
228253

229254
{
230255
let mut cfg = TEST_CONFIG;
231256
cfg.allowed = Some(vec![AssistKind::RefactorExtract]);
232257
let assists = Assist::get(&db, &cfg, false, frange);
233-
assert_eq!(assists.len(), 2);
258+
let expected = labels(&assists);
234259

235-
let mut assists = assists.iter();
236-
assert_eq!(assists.next().expect("expected assist").label, "Extract into function");
237-
assert_eq!(assists.next().expect("expected assist").label, "Extract into variable");
260+
expect![[r#"
261+
Extract into variable
262+
Extract into function
263+
"#]]
264+
.assert_eq(&expected);
238265
}
239266

240267
{
241268
let mut cfg = TEST_CONFIG;
242269
cfg.allowed = Some(vec![AssistKind::QuickFix]);
243270
let assists = Assist::get(&db, &cfg, false, frange);
244-
assert!(assists.is_empty(), "All asserts but quickfixes should be filtered out");
271+
let expected = labels(&assists);
272+
273+
expect![[r#""#]].assert_eq(&expected);
245274
}
246275
}

crates/base_db/src/fixture.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use test_utils::{
6767
use vfs::{file_set::FileSet, VfsPath};
6868

6969
use crate::{
70-
input::CrateName, Change, CrateGraph, CrateId, Edition, Env, FileId, FilePosition,
70+
input::CrateName, Change, CrateGraph, CrateId, Edition, Env, FileId, FilePosition, FileRange,
7171
SourceDatabaseExt, SourceRoot, SourceRootId,
7272
};
7373

@@ -99,6 +99,15 @@ pub trait WithFixture: Default + SourceDatabaseExt + 'static {
9999
(db, FilePosition { file_id, offset })
100100
}
101101

102+
fn with_range(ra_fixture: &str) -> (Self, FileRange) {
103+
let (db, file_id, range_or_offset) = Self::with_range_or_offset(ra_fixture);
104+
let range = match range_or_offset {
105+
RangeOrOffset::Range(it) => it,
106+
RangeOrOffset::Offset(_) => panic!(),
107+
};
108+
(db, FileRange { file_id, range })
109+
}
110+
102111
fn with_range_or_offset(ra_fixture: &str) -> (Self, FileId, RangeOrOffset) {
103112
let fixture = ChangeFixture::parse(ra_fixture);
104113
let mut db = Self::default();

0 commit comments

Comments
 (0)