Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/runnables.rs')
-rw-r--r--crates/ide/src/runnables.rs79
1 files changed, 41 insertions, 38 deletions
diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs
index 21130e0607..f03bc1427c 100644
--- a/crates/ide/src/runnables.rs
+++ b/crates/ide/src/runnables.rs
@@ -209,7 +209,7 @@ pub(crate) fn related_tests(
find_related_tests(&sema, position, search_scope, &mut res);
- res.into_iter().collect_vec()
+ res.into_iter().collect()
}
fn find_related_tests(
@@ -218,56 +218,59 @@ fn find_related_tests(
search_scope: Option<SearchScope>,
tests: &mut FxHashSet<Runnable>,
) {
- if let Some(refs) = references::find_all_refs(sema, position, search_scope) {
- for (file_id, refs) in refs.into_iter().flat_map(|refs| refs.references) {
- let file = sema.parse(file_id);
- let file = file.syntax();
-
- // create flattened vec of tokens
- let tokens = refs.iter().flat_map(|(range, _)| {
- match file.token_at_offset(range.start()).next() {
- Some(token) => sema.descend_into_macros(token),
- None => Default::default(),
- }
+ let refs = match references::find_all_refs(sema, position, search_scope) {
+ Some(it) => it,
+ _ => return,
+ };
+ for (file_id, refs) in refs.into_iter().flat_map(|refs| refs.references) {
+ let file = sema.parse(file_id);
+ let file = file.syntax();
+
+ // create flattened vec of tokens
+ let tokens =
+ refs.iter().flat_map(|(range, _)| match file.token_at_offset(range.start()).next() {
+ Some(token) => sema.descend_into_macros(token),
+ None => Default::default(),
});
- // find first suitable ancestor
- let functions = tokens
- .filter_map(|token| token.ancestors().find_map(ast::Fn::cast))
- .map(|f| hir::InFile::new(sema.hir_file_for(f.syntax()), f));
-
- for fn_def in functions {
- let InFile { value: fn_def, .. } = &fn_def;
- if let Some(runnable) = as_test_runnable(sema, fn_def) {
- // direct test
- tests.insert(runnable);
- } else if let Some(module) = parent_test_module(sema, fn_def) {
- // indirect test
- find_related_tests_in_module(sema, fn_def, &module, tests);
- }
+ // find first suitable ancestor
+ let functions = tokens
+ .filter_map(|token| token.ancestors().find_map(ast::Fn::cast))
+ .map(|f| hir::InFile::new(sema.hir_file_for(f.syntax()), f));
+
+ for InFile { value: fn_def, .. } in functions {
+ if let Some(runnable) = as_test_runnable(sema, &fn_def) {
+ // direct test
+ tests.insert(runnable);
+ } else if let Some(module) = parent_test_module(sema, &fn_def) {
+ // indirect test
+ find_related_tests_in_module(sema, &fn_def, &module, tests);
}
}
}
}
+
fn find_related_tests_in_module(
sema: &Semantics<RootDatabase>,
fn_def: &ast::Fn,
parent_module: &hir::Module,
tests: &mut FxHashSet<Runnable>,
) {
- if let Some(fn_name) = fn_def.name() {
- let mod_source = parent_module.definition_source(sema.db);
- let range = match mod_source.value {
- hir::ModuleSource::Module(m) => m.syntax().text_range(),
- hir::ModuleSource::BlockExpr(b) => b.syntax().text_range(),
- hir::ModuleSource::SourceFile(f) => f.syntax().text_range(),
- };
+ let fn_name = match fn_def.name() {
+ Some(it) => it,
+ _ => return,
+ };
+ let mod_source = parent_module.definition_source(sema.db);
+ let range = match &mod_source.value {
+ hir::ModuleSource::Module(m) => m.syntax().text_range(),
+ hir::ModuleSource::BlockExpr(b) => b.syntax().text_range(),
+ hir::ModuleSource::SourceFile(f) => f.syntax().text_range(),
+ };
- let file_id = mod_source.file_id.original_file(sema.db);
- let mod_scope = SearchScope::file_range(FileRange { file_id, range });
- let fn_pos = FilePosition { file_id, offset: fn_name.syntax().text_range().start() };
- find_related_tests(sema, fn_pos, Some(mod_scope), tests)
- }
+ let file_id = mod_source.file_id.original_file(sema.db);
+ let mod_scope = SearchScope::file_range(FileRange { file_id, range });
+ let fn_pos = FilePosition { file_id, offset: fn_name.syntax().text_range().start() };
+ find_related_tests(sema, fn_pos, Some(mod_scope), tests)
}
fn as_test_runnable(sema: &Semantics<RootDatabase>, fn_def: &ast::Fn) -> Option<Runnable> {