diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2021-08-18 16:30:09 +0200 |
|---|---|---|
| committer | Lukas Wirth <lukastw97@gmail.com> | 2021-08-20 13:50:06 +0200 |
| commit | 7342dcf0b0e4ff24a683424b1308b062d062dfe0 (patch) | |
| tree | c7b88840698cac5334d760b861348d35706b4e34 /crates/ide/src | |
| parent | 351cec0cb41ab9eba9e4085ba49dc70a9542eadf (diff) | |
| download | rust-7342dcf0b0e4ff24a683424b1308b062d062dfe0.tar.gz rust-7342dcf0b0e4ff24a683424b1308b062d062dfe0.zip | |
Fix runnables not seeing test and bench attributes
Diffstat (limited to 'crates/ide/src')
| -rw-r--r-- | crates/ide/src/runnables.rs | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs index 42f6ec5d9cf..ed220c9080c 100644 --- a/crates/ide/src/runnables.rs +++ b/crates/ide/src/runnables.rs @@ -232,22 +232,27 @@ fn find_related_tests( let functions = refs.iter().filter_map(|(range, _)| { let token = file.token_at_offset(range.start()).next()?; let token = sema.descend_into_macros(token); - token.ancestors().find_map(ast::Fn::cast) + // FIXME: This is the wrong file_id + token + .ancestors() + .find_map(ast::Fn::cast) + .map(|f| hir::InFile::new(file_id.into(), f)) }); for fn_def in functions { - if let Some(runnable) = as_test_runnable(sema, &fn_def) { + // #[test/bench] expands to just the item causing us to lose the attribute, so recover them by going out of the attribute + let fn_def = fn_def.node_with_attributes(sema.db); + if let Some(runnable) = as_test_runnable(sema, &fn_def.value) { // direct test tests.insert(runnable); - } else if let Some(module) = parent_test_module(sema, &fn_def) { + } else if let Some(module) = parent_test_module(sema, &fn_def.value) { // indirect test - find_related_tests_in_module(sema, &fn_def, &module, tests); + find_related_tests_in_module(sema, &fn_def.value, &module, tests); } } } } } - fn find_related_tests_in_module( sema: &Semantics<RootDatabase>, fn_def: &ast::Fn, @@ -292,7 +297,8 @@ fn parent_test_module(sema: &Semantics<RootDatabase>, fn_def: &ast::Fn) -> Optio } pub(crate) fn runnable_fn(sema: &Semantics<RootDatabase>, def: hir::Function) -> Option<Runnable> { - let func = def.source(sema.db)?; + // #[test/bench] expands to just the item causing us to lose the attribute, so recover them by going out of the attribute + let func = def.source(sema.db)?.node_with_attributes(sema.db); let name_string = def.name(sema.db).to_string(); let root = def.module(sema.db).krate().root_module(sema.db); @@ -499,6 +505,8 @@ fn has_test_function_or_multiple_test_submodules( match item { hir::ModuleDef::Function(f) => { if let Some(it) = f.source(sema.db) { + // #[test/bench] expands to just the item causing us to lose the attribute, so recover them by going out of the attribute + let it = it.node_with_attributes(sema.db); if test_related_attribute(&it.value).is_some() { return true; } |
