aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/lib.rs
diff options
context:
space:
mode:
authorKirill Bulatov <[email protected]>2020-01-26 22:16:18 +0000
committerKirill Bulatov <[email protected]>2020-01-26 22:57:24 +0000
commit1a78991df69630b581b4210083c9e94157bab0e1 (patch)
treeb139503ade9771b6135c5c578aabc1c77a1bb4a4 /crates/ra_assists/src/lib.rs
parentd0a782ef1c53ef5c5d3b49b02c498f7a688c3a4d (diff)
Adjust the tests
Diffstat (limited to 'crates/ra_assists/src/lib.rs')
-rw-r--r--crates/ra_assists/src/lib.rs66
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)]
228mod helpers { 228mod 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