diff options
author | Kirill Bulatov <[email protected]> | 2020-01-26 22:16:18 +0000 |
---|---|---|
committer | Kirill Bulatov <[email protected]> | 2020-01-26 22:57:24 +0000 |
commit | 1a78991df69630b581b4210083c9e94157bab0e1 (patch) | |
tree | b139503ade9771b6135c5c578aabc1c77a1bb4a4 /crates/ra_assists/src/lib.rs | |
parent | d0a782ef1c53ef5c5d3b49b02c498f7a688c3a4d (diff) |
Adjust the tests
Diffstat (limited to 'crates/ra_assists/src/lib.rs')
-rw-r--r-- | crates/ra_assists/src/lib.rs | 66 |
1 files changed, 60 insertions, 6 deletions
diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index 9e4ebec47..724bce191 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs | |||
@@ -226,11 +226,59 @@ mod assists { | |||
226 | 226 | ||
227 | #[cfg(test)] | 227 | #[cfg(test)] |
228 | mod helpers { | 228 | mod helpers { |
229 | use ra_db::{fixture::WithFixture, FileRange}; | 229 | use hir::db::DefDatabase; |
230 | use ra_db::{fixture::WithFixture, FileId, FileRange}; | ||
230 | use ra_syntax::TextRange; | 231 | use ra_syntax::TextRange; |
231 | use test_utils::{add_cursor, assert_eq_text, extract_offset, extract_range}; | 232 | use test_utils::{add_cursor, assert_eq_text, extract_offset, extract_range}; |
232 | 233 | ||
233 | use crate::{test_db::TestDB, Assist, AssistCtx, ImportsLocator}; | 234 | use crate::{test_db::TestDB, Assist, AssistCtx, ImportsLocator}; |
235 | use std::sync::Arc; | ||
236 | |||
237 | pub(crate) struct TestImportsLocator { | ||
238 | db: Arc<TestDB>, | ||
239 | test_file_id: FileId, | ||
240 | } | ||
241 | |||
242 | impl TestImportsLocator { | ||
243 | pub(crate) fn new(db: Arc<TestDB>, test_file_id: FileId) -> Self { | ||
244 | TestImportsLocator { db, test_file_id } | ||
245 | } | ||
246 | } | ||
247 | |||
248 | impl ImportsLocator for TestImportsLocator { | ||
249 | fn find_imports(&mut self, name_to_import: &str) -> Vec<hir::ModuleDef> { | ||
250 | let crate_def_map = self.db.crate_def_map(self.db.test_crate()); | ||
251 | let mut findings = vec![]; | ||
252 | |||
253 | let mut module_ids_to_process = | ||
254 | crate_def_map.modules_for_file(self.test_file_id).collect::<Vec<_>>(); | ||
255 | |||
256 | while !module_ids_to_process.is_empty() { | ||
257 | let mut more_ids_to_process = vec![]; | ||
258 | for local_module_id in module_ids_to_process.drain(..) { | ||
259 | for (name, namespace_data) in | ||
260 | crate_def_map[local_module_id].scope.entries_without_primitives() | ||
261 | { | ||
262 | let found_a_match = &name.to_string() == name_to_import; | ||
263 | vec![namespace_data.types, namespace_data.values] | ||
264 | .into_iter() | ||
265 | .filter_map(std::convert::identity) | ||
266 | .for_each(|(module_def_id, _)| { | ||
267 | if found_a_match { | ||
268 | findings.push(module_def_id.into()); | ||
269 | } | ||
270 | if let hir::ModuleDefId::ModuleId(module_id) = module_def_id { | ||
271 | more_ids_to_process.push(module_id.local_id); | ||
272 | } | ||
273 | }); | ||
274 | } | ||
275 | } | ||
276 | module_ids_to_process = more_ids_to_process; | ||
277 | } | ||
278 | |||
279 | findings | ||
280 | } | ||
281 | } | ||
234 | 282 | ||
235 | pub(crate) fn check_assist( | 283 | pub(crate) fn check_assist( |
236 | assist: fn(AssistCtx<TestDB>) -> Option<Assist>, | 284 | assist: fn(AssistCtx<TestDB>) -> Option<Assist>, |
@@ -262,16 +310,19 @@ mod helpers { | |||
262 | 310 | ||
263 | pub(crate) fn check_assist_with_imports_locator<F: ImportsLocator>( | 311 | pub(crate) fn check_assist_with_imports_locator<F: ImportsLocator>( |
264 | assist: fn(AssistCtx<TestDB>, &mut F) -> Option<Assist>, | 312 | assist: fn(AssistCtx<TestDB>, &mut F) -> Option<Assist>, |
265 | imports_locator: &mut F, | 313 | imports_locator_provider: fn(db: Arc<TestDB>, file_id: FileId) -> F, |
266 | before: &str, | 314 | before: &str, |
267 | after: &str, | 315 | after: &str, |
268 | ) { | 316 | ) { |
269 | let (before_cursor_pos, before) = extract_offset(before); | 317 | let (before_cursor_pos, before) = extract_offset(before); |
270 | let (db, file_id) = TestDB::with_single_file(&before); | 318 | let (db, file_id) = TestDB::with_single_file(&before); |
319 | let db = Arc::new(db); | ||
320 | let mut imports_locator = imports_locator_provider(Arc::clone(&db), file_id); | ||
271 | let frange = | 321 | let frange = |
272 | FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; | 322 | FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; |
273 | let assist = AssistCtx::with_ctx(&db, frange, true, |ctx| assist(ctx, imports_locator)) | 323 | let assist = |
274 | .expect("code action is not applicable"); | 324 | AssistCtx::with_ctx(db.as_ref(), frange, true, |ctx| assist(ctx, &mut imports_locator)) |
325 | .expect("code action is not applicable"); | ||
275 | let action = match assist { | 326 | let action = match assist { |
276 | Assist::Unresolved { .. } => unreachable!(), | 327 | Assist::Unresolved { .. } => unreachable!(), |
277 | Assist::Resolved { assist } => assist.get_first_action(), | 328 | Assist::Resolved { assist } => assist.get_first_action(), |
@@ -364,14 +415,17 @@ mod helpers { | |||
364 | 415 | ||
365 | pub(crate) fn check_assist_with_imports_locator_not_applicable<F: ImportsLocator>( | 416 | pub(crate) fn check_assist_with_imports_locator_not_applicable<F: ImportsLocator>( |
366 | assist: fn(AssistCtx<TestDB>, &mut F) -> Option<Assist>, | 417 | assist: fn(AssistCtx<TestDB>, &mut F) -> Option<Assist>, |
367 | imports_locator: &mut F, | 418 | imports_locator_provider: fn(db: Arc<TestDB>, file_id: FileId) -> F, |
368 | before: &str, | 419 | before: &str, |
369 | ) { | 420 | ) { |
370 | let (before_cursor_pos, before) = extract_offset(before); | 421 | let (before_cursor_pos, before) = extract_offset(before); |
371 | let (db, file_id) = TestDB::with_single_file(&before); | 422 | let (db, file_id) = TestDB::with_single_file(&before); |
423 | let db = Arc::new(db); | ||
424 | let mut imports_locator = imports_locator_provider(Arc::clone(&db), file_id); | ||
372 | let frange = | 425 | let frange = |
373 | FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; | 426 | FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; |
374 | let assist = AssistCtx::with_ctx(&db, frange, true, |ctx| assist(ctx, imports_locator)); | 427 | let assist = |
428 | AssistCtx::with_ctx(db.as_ref(), frange, true, |ctx| assist(ctx, &mut imports_locator)); | ||
375 | assert!(assist.is_none()); | 429 | assert!(assist.is_none()); |
376 | } | 430 | } |
377 | 431 | ||