fix: Reimplement mapping out of test/bench attributes for runnables

This commit is contained in:
Lukas Wirth 2021-11-16 11:36:41 +01:00
parent 73668334f0
commit d2513deb62
2 changed files with 17 additions and 2 deletions

View file

@ -701,6 +701,16 @@ impl<N: AstNode> InFile<N> {
} }
} }
impl InFile<ast::Fn> {
pub fn map_out_of_test_attr(self, db: &dyn db::AstDatabase) -> InFile<ast::Fn> {
(|| {
let InFile { file_id, value } = self.file_id.call_node(db)?;
ast::Fn::cast(value).map(|n| InFile::new(file_id, n))
})()
.unwrap_or(self)
}
}
/// In Rust, macros expand token trees to token trees. When we want to turn a /// In Rust, macros expand token trees to token trees. When we want to turn a
/// token tree into an AST node, we need to figure out what kind of AST node we /// token tree into an AST node, we need to figure out what kind of AST node we
/// want: something like `foo` can be a type, an expression, or a pattern. /// want: something like `foo` can be a type, an expression, or a pattern.

View file

@ -236,7 +236,9 @@ fn find_related_tests(
.filter_map(|token| token.ancestors().find_map(ast::Fn::cast)) .filter_map(|token| token.ancestors().find_map(ast::Fn::cast))
.map(|f| hir::InFile::new(sema.hir_file_for(f.syntax()), f)); .map(|f| hir::InFile::new(sema.hir_file_for(f.syntax()), f));
for InFile { value: ref fn_def, .. } in functions { for fn_def in functions {
// #[test/bench] expands to just the item causing us to lose the attribute, so recover them by going out of the attribute
let InFile { value: fn_def, .. } = &fn_def.map_out_of_test_attr(sema.db);
if let Some(runnable) = as_test_runnable(sema, fn_def) { if let Some(runnable) = as_test_runnable(sema, fn_def) {
// direct test // direct test
tests.insert(runnable); tests.insert(runnable);
@ -292,7 +294,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> { 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)?.map_out_of_test_attr(sema.db);
let name_string = def.name(sema.db).to_string(); let name_string = def.name(sema.db).to_string();
let root = def.module(sema.db).krate().root_module(sema.db); let root = def.module(sema.db).krate().root_module(sema.db);
@ -501,6 +504,8 @@ fn has_test_function_or_multiple_test_submodules(
match item { match item {
hir::ModuleDef::Function(f) => { hir::ModuleDef::Function(f) => {
if let Some(it) = f.source(sema.db) { 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.map_out_of_test_attr(sema.db);
if test_related_attribute(&it.value).is_some() { if test_related_attribute(&it.value).is_some() {
return true; return true;
} }