5 use hir::{AsAssocItem, HasAttrs, HasSource, HirDisplay, Semantics};
6 use ide_assists::utils::test_related_attribute;
8 base_db::{FilePosition, FileRange},
10 helpers::visit_file_defs,
12 RootDatabase, SymbolKind,
14 use itertools::Itertools;
15 use rustc_hash::{FxHashMap, FxHashSet};
16 use stdx::{always, format_to};
18 ast::{self, AstNode, HasAttrs as _},
22 use crate::{references, FileId, NavigationTarget, ToNav, TryToNav};
24 #[derive(Debug, Clone, Hash, PartialEq, Eq)]
26 pub use_name_in_title: bool,
27 pub nav: NavigationTarget,
28 pub kind: RunnableKind,
29 pub cfg: Option<CfgExpr>,
32 #[derive(Debug, Clone, Hash, PartialEq, Eq)]
38 impl fmt::Display for TestId {
39 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
41 TestId::Name(name) => name.fmt(f),
42 TestId::Path(path) => path.fmt(f),
47 #[derive(Debug, Clone, Hash, PartialEq, Eq)]
48 pub enum RunnableKind {
49 Test { test_id: TestId, attr: TestAttr },
50 TestMod { path: String },
51 Bench { test_id: TestId },
52 DocTest { test_id: TestId },
57 #[derive(Debug, Clone, Hash, PartialEq, Eq)]
58 enum RunnableTestKind {
67 // test package::module::testname
68 pub fn label(&self, target: Option<String>) -> String {
70 RunnableKind::Test { test_id, .. } => format!("test {}", test_id),
71 RunnableKind::TestMod { path } => format!("test-mod {}", path),
72 RunnableKind::Bench { test_id } => format!("bench {}", test_id),
73 RunnableKind::DocTest { test_id, .. } => format!("doctest {}", test_id),
74 RunnableKind::Bin => {
75 target.map_or_else(|| "run binary".to_string(), |t| format!("run {}", t))
80 pub fn title(&self) -> String {
81 let mut s = String::from("▶\u{fe0e} Run ");
82 if self.use_name_in_title {
83 format_to!(s, "{}", self.nav.name);
84 if !matches!(self.kind, RunnableKind::Bin) {
88 let suffix = match &self.kind {
89 RunnableKind::TestMod { .. } => "Tests",
90 RunnableKind::Test { .. } => "Test",
91 RunnableKind::DocTest { .. } => "Doctest",
92 RunnableKind::Bench { .. } => "Bench",
93 RunnableKind::Bin => return s,
100 fn test_kind(&self) -> RunnableTestKind {
102 RunnableKind::TestMod { .. } => RunnableTestKind::TestMod,
103 RunnableKind::Test { .. } => RunnableTestKind::Test,
104 RunnableKind::DocTest { .. } => RunnableTestKind::DocTest,
105 RunnableKind::Bench { .. } => RunnableTestKind::Bench,
106 RunnableKind::Bin => RunnableTestKind::Bin,
113 // Shows a popup suggesting to run a test/benchmark/binary **at the current cursor
114 // location**. Super useful for repeatedly running just a single test. Do bind this
118 // | Editor | Action Name
120 // | VS Code | **Rust Analyzer: Run**
122 // image::https://user-images.githubusercontent.com/48062697/113065583-055aae80-91b1-11eb-958f-d67efcaf6a2f.gif[]
123 pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
124 let sema = Semantics::new(db);
126 let mut res = Vec::new();
127 // Record all runnables that come from macro expansions here instead.
128 // In case an expansion creates multiple runnables we want to name them to avoid emitting a bunch of equally named runnables.
129 let mut in_macro_expansion = FxHashMap::<hir::HirFileId, Vec<Runnable>>::default();
130 let mut add_opt = |runnable: Option<Runnable>, def| {
131 if let Some(runnable) = runnable.filter(|runnable| {
133 runnable.nav.file_id == file_id,
134 "tried adding a runnable pointing to a different file: {:?} for {:?}",
139 if let Some(def) = def {
140 let file_id = match def {
141 Definition::Module(it) => it.declaration_source(db).map(|src| src.file_id),
142 Definition::Function(it) => it.source(db).map(|src| src.file_id),
145 if let Some(file_id) = file_id.filter(|file| file.call_node(db).is_some()) {
146 in_macro_expansion.entry(file_id).or_default().push(runnable);
153 visit_file_defs(&sema, file_id, &mut |def| {
154 let runnable = match def {
155 Definition::Module(it) => runnable_mod(&sema, it),
156 Definition::Function(it) => runnable_fn(&sema, it),
157 Definition::SelfType(impl_) => runnable_impl(&sema, &impl_),
162 .or_else(|| module_def_doctest(sema.db, def))
163 // #[macro_export] mbe macros are declared in the root, while their definition may reside in a different module
164 .filter(|it| it.nav.file_id == file_id),
167 if let Definition::SelfType(impl_) = def {
168 impl_.items(db).into_iter().for_each(|assoc| {
169 let runnable = match assoc {
170 hir::AssocItem::Function(it) => {
171 runnable_fn(&sema, it).or_else(|| module_def_doctest(sema.db, it.into()))
173 hir::AssocItem::Const(it) => module_def_doctest(sema.db, it.into()),
174 hir::AssocItem::TypeAlias(it) => module_def_doctest(sema.db, it.into()),
176 add_opt(runnable, Some(assoc.into()))
181 sema.to_module_defs(file_id)
182 .map(|it| runnable_mod_outline_definition(&sema, it))
183 .for_each(|it| add_opt(it, None));
185 res.extend(in_macro_expansion.into_iter().flat_map(|(_, runnables)| {
186 let use_name_in_title = runnables.len() != 1;
187 runnables.into_iter().map(move |mut r| {
188 r.use_name_in_title = use_name_in_title;
195 // Feature: Related Tests
197 // Provides a sneak peek of all tests where the current item is used.
199 // The simplest way to use this feature is via the context menu:
200 // - Right-click on the selected item. The context menu opens.
201 // - Select **Peek related tests**
204 // | Editor | Action Name
206 // | VS Code | **Rust Analyzer: Peek related tests**
208 pub(crate) fn related_tests(
210 position: FilePosition,
211 search_scope: Option<SearchScope>,
213 let sema = Semantics::new(db);
214 let mut res: FxHashSet<Runnable> = FxHashSet::default();
215 let syntax = sema.parse(position.file_id).syntax().clone();
217 find_related_tests(&sema, &syntax, position, search_scope, &mut res);
219 res.into_iter().collect()
222 fn find_related_tests(
223 sema: &Semantics<RootDatabase>,
225 position: FilePosition,
226 search_scope: Option<SearchScope>,
227 tests: &mut FxHashSet<Runnable>,
229 let defs = references::find_defs(sema, syntax, position.offset);
233 .set_scope(search_scope.clone())
239 let name_ref = match ref_.name {
240 ast::NameLike::NameRef(name_ref) => name_ref,
243 if let Some(fn_def) =
244 sema.ancestors_with_macros(name_ref.syntax().clone()).find_map(ast::Fn::cast)
246 if let Some(runnable) = as_test_runnable(sema, &fn_def) {
248 tests.insert(runnable);
249 } else if let Some(module) = parent_test_module(sema, &fn_def) {
251 find_related_tests_in_module(sema, syntax, &fn_def, &module, tests);
258 fn find_related_tests_in_module(
259 sema: &Semantics<RootDatabase>,
262 parent_module: &hir::Module,
263 tests: &mut FxHashSet<Runnable>,
265 let fn_name = match fn_def.name() {
269 let mod_source = parent_module.definition_source(sema.db);
270 let range = match &mod_source.value {
271 hir::ModuleSource::Module(m) => m.syntax().text_range(),
272 hir::ModuleSource::BlockExpr(b) => b.syntax().text_range(),
273 hir::ModuleSource::SourceFile(f) => f.syntax().text_range(),
276 let file_id = mod_source.file_id.original_file(sema.db);
277 let mod_scope = SearchScope::file_range(FileRange { file_id, range });
278 let fn_pos = FilePosition { file_id, offset: fn_name.syntax().text_range().start() };
279 find_related_tests(sema, syntax, fn_pos, Some(mod_scope), tests)
282 fn as_test_runnable(sema: &Semantics<RootDatabase>, fn_def: &ast::Fn) -> Option<Runnable> {
283 if test_related_attribute(fn_def).is_some() {
284 let function = sema.to_def(fn_def)?;
285 runnable_fn(sema, function)
291 fn parent_test_module(sema: &Semantics<RootDatabase>, fn_def: &ast::Fn) -> Option<hir::Module> {
292 fn_def.syntax().ancestors().find_map(|node| {
293 let module = ast::Module::cast(node)?;
294 let module = sema.to_def(&module)?;
296 if has_test_function_or_multiple_test_submodules(sema, &module) {
304 pub(crate) fn runnable_fn(sema: &Semantics<RootDatabase>, def: hir::Function) -> Option<Runnable> {
305 let func = def.source(sema.db)?;
306 let name = def.name(sema.db).to_smol_str();
308 let root = def.module(sema.db).krate().root_module(sema.db);
310 let kind = if name == "main" && def.module(sema.db) == root {
314 let canonical_path = {
315 let def: hir::ModuleDef = def.into();
316 def.canonical_path(sema.db)
318 canonical_path.map(TestId::Path).unwrap_or(TestId::Name(name))
321 if test_related_attribute(&func.value).is_some() {
322 let attr = TestAttr::from_fn(&func.value);
323 RunnableKind::Test { test_id: test_id(), attr }
324 } else if func.value.has_atom_attr("bench") {
325 RunnableKind::Bench { test_id: test_id() }
331 let nav = NavigationTarget::from_named(
333 func.as_ref().map(|it| it as &dyn ast::HasName),
334 SymbolKind::Function,
336 let cfg = def.attrs(sema.db).cfg();
337 Some(Runnable { use_name_in_title: false, nav, kind, cfg })
340 pub(crate) fn runnable_mod(sema: &Semantics<RootDatabase>, def: hir::Module) -> Option<Runnable> {
341 if !has_test_function_or_multiple_test_submodules(sema, &def) {
345 def.path_to_root(sema.db).into_iter().rev().filter_map(|it| it.name(sema.db)).join("::");
347 let attrs = def.attrs(sema.db);
348 let cfg = attrs.cfg();
349 let nav = NavigationTarget::from_module_to_decl(sema.db, def);
350 Some(Runnable { use_name_in_title: false, nav, kind: RunnableKind::TestMod { path }, cfg })
353 pub(crate) fn runnable_impl(sema: &Semantics<RootDatabase>, def: &hir::Impl) -> Option<Runnable> {
354 let attrs = def.attrs(sema.db);
355 if !has_runnable_doc_test(&attrs) {
358 let cfg = attrs.cfg();
359 let nav = def.try_to_nav(sema.db)?;
360 let ty = def.self_ty(sema.db);
361 let adt_name = ty.as_adt()?.name(sema.db);
362 let mut ty_args = ty.type_arguments().peekable();
363 let params = if ty_args.peek().is_some() {
364 format!("<{}>", ty_args.format_with(", ", |ty, cb| cb(&ty.display(sema.db))))
368 let test_id = TestId::Path(format!("{}{}", adt_name, params));
370 Some(Runnable { use_name_in_title: false, nav, kind: RunnableKind::DocTest { test_id }, cfg })
373 /// Creates a test mod runnable for outline modules at the top of their definition.
374 fn runnable_mod_outline_definition(
375 sema: &Semantics<RootDatabase>,
377 ) -> Option<Runnable> {
378 if !has_test_function_or_multiple_test_submodules(sema, &def) {
382 def.path_to_root(sema.db).into_iter().rev().filter_map(|it| it.name(sema.db)).join("::");
384 let attrs = def.attrs(sema.db);
385 let cfg = attrs.cfg();
386 match def.definition_source(sema.db).value {
387 hir::ModuleSource::SourceFile(_) => Some(Runnable {
388 use_name_in_title: false,
389 nav: def.to_nav(sema.db),
390 kind: RunnableKind::TestMod { path },
397 fn module_def_doctest(db: &RootDatabase, def: Definition) -> Option<Runnable> {
398 let attrs = match def {
399 Definition::Module(it) => it.attrs(db),
400 Definition::Function(it) => it.attrs(db),
401 Definition::Adt(it) => it.attrs(db),
402 Definition::Variant(it) => it.attrs(db),
403 Definition::Const(it) => it.attrs(db),
404 Definition::Static(it) => it.attrs(db),
405 Definition::Trait(it) => it.attrs(db),
406 Definition::TypeAlias(it) => it.attrs(db),
407 Definition::Macro(it) => it.attrs(db),
408 Definition::SelfType(it) => it.attrs(db),
411 if !has_runnable_doc_test(&attrs) {
414 let def_name = def.name(db)?;
416 let mut path = String::new();
417 def.canonical_module_path(db)?
418 .flat_map(|it| it.name(db))
419 .for_each(|name| format_to!(path, "{}::", name));
420 // This probably belongs to canonical_path?
421 if let Some(assoc_item) = def.as_assoc_item(db) {
422 if let hir::AssocItemContainer::Impl(imp) = assoc_item.container(db) {
423 let ty = imp.self_ty(db);
424 if let Some(adt) = ty.as_adt() {
425 let name = adt.name(db);
426 let mut ty_args = ty.type_arguments().peekable();
427 format_to!(path, "{}", name);
428 if ty_args.peek().is_some() {
432 ty_args.format_with(", ", |ty, cb| cb(&ty.display(db)))
435 return Some(format!(r#""{}::{}""#, path, def_name));
439 format_to!(path, "{}", def_name);
443 let test_id = path.map_or_else(|| TestId::Name(def_name.to_smol_str()), TestId::Path);
445 let mut nav = match def {
446 Definition::Module(def) => NavigationTarget::from_module_to_decl(db, def),
447 def => def.try_to_nav(db)?,
449 nav.focus_range = None;
450 nav.description = None;
454 use_name_in_title: false,
456 kind: RunnableKind::DocTest { test_id },
462 #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
463 pub struct TestAttr {
468 fn from_fn(fn_def: &ast::Fn) -> TestAttr {
471 .filter_map(|attr| attr.simple_name())
472 .any(|attribute_text| attribute_text == "ignore");
477 const RUSTDOC_FENCES: [&str; 2] = ["```", "~~~"];
478 const RUSTDOC_CODE_BLOCK_ATTRIBUTES_RUNNABLE: &[&str] =
479 &["", "rust", "should_panic", "edition2015", "edition2018", "edition2021"];
481 fn has_runnable_doc_test(attrs: &hir::Attrs) -> bool {
482 attrs.docs().map_or(false, |doc| {
483 let mut in_code_block = false;
485 for line in String::from(doc).lines() {
486 if let Some(header) =
487 RUSTDOC_FENCES.into_iter().find_map(|fence| line.strip_prefix(fence))
489 in_code_block = !in_code_block;
494 .all(|sub| RUSTDOC_CODE_BLOCK_ATTRIBUTES_RUNNABLE.contains(&sub.trim()))
505 // We could create runnables for modules with number_of_test_submodules > 0,
506 // but that bloats the runnables for no real benefit, since all tests can be run by the submodule already
507 fn has_test_function_or_multiple_test_submodules(
508 sema: &Semantics<RootDatabase>,
509 module: &hir::Module,
511 let mut number_of_test_submodules = 0;
513 for item in module.declarations(sema.db) {
515 hir::ModuleDef::Function(f) => {
516 if let Some(it) = f.source(sema.db) {
517 if test_related_attribute(&it.value).is_some() {
522 hir::ModuleDef::Module(submodule) => {
523 if has_test_function_or_multiple_test_submodules(sema, &submodule) {
524 number_of_test_submodules += 1;
531 number_of_test_submodules > 1
536 use expect_test::{expect, Expect};
540 use super::{RunnableTestKind::*, *};
544 // FIXME: fold this into `expect` as well
545 actions: &[RunnableTestKind],
548 let (analysis, position) = fixture::position(ra_fixture);
549 let mut runnables = analysis.runnables(position.file_id).unwrap();
550 runnables.sort_by_key(|it| (it.nav.full_range.start(), it.nav.name.clone()));
551 expect.assert_debug_eq(&runnables);
554 runnables.into_iter().map(|it| it.test_kind()).collect::<Vec<_>>().as_slice()
558 fn check_tests(ra_fixture: &str, expect: Expect) {
559 let (analysis, position) = fixture::position(ra_fixture);
560 let tests = analysis.related_tests(position, None).unwrap();
561 expect.assert_debug_eq(&tests);
565 fn test_runnables() {
586 &[TestMod, Bin, Test, Test, Bench],
590 use_name_in_title: false,
591 nav: NavigationTarget {
605 use_name_in_title: false,
606 nav: NavigationTarget {
619 use_name_in_title: false,
620 nav: NavigationTarget {
640 use_name_in_title: false,
641 nav: NavigationTarget {
661 use_name_in_title: false,
662 nav: NavigationTarget {
684 fn test_runnables_doc_test() {
694 fn should_have_runnable() {}
699 fn should_have_runnable_1() {}
708 fn should_have_runnable_2() {}
715 fn should_have_no_runnable_3() {}
722 fn should_have_no_runnable_4() {}
727 fn should_have_no_runnable() {}
732 fn should_have_no_runnable_2() {}
737 fn should_have_no_runnable_3() {}
740 /// arbitrary plain text
742 fn should_have_no_runnable_4() {}
745 /// arbitrary plain text
751 fn should_have_no_runnable_5() {}
756 fn should_have_no_runnable_6() {}
761 struct StructWithRunnable(String);
766 impl StructWithRunnable {}
777 impl Test for StructWithRunnable {}
779 &[Bin, DocTest, DocTest, DocTest, DocTest, DocTest, DocTest, DocTest, DocTest],
783 use_name_in_title: false,
784 nav: NavigationTarget {
797 use_name_in_title: false,
798 nav: NavigationTarget {
803 name: "should_have_runnable",
807 "should_have_runnable",
813 use_name_in_title: false,
814 nav: NavigationTarget {
819 name: "should_have_runnable_1",
823 "should_have_runnable_1",
829 use_name_in_title: false,
830 nav: NavigationTarget {
834 full_range: 150..254,
835 name: "should_have_runnable_2",
839 "should_have_runnable_2",
845 use_name_in_title: false,
846 nav: NavigationTarget {
850 full_range: 256..320,
851 name: "should_have_no_runnable_3",
855 "should_have_no_runnable_3",
861 use_name_in_title: false,
862 nav: NavigationTarget {
866 full_range: 322..398,
867 name: "should_have_no_runnable_4",
871 "should_have_no_runnable_4",
877 use_name_in_title: false,
878 nav: NavigationTarget {
882 full_range: 900..965,
883 name: "StructWithRunnable",
887 "StructWithRunnable",
893 use_name_in_title: false,
894 nav: NavigationTarget {
898 full_range: 967..1024,
899 focus_range: 1003..1021,
905 "StructWithRunnable",
911 use_name_in_title: false,
912 nav: NavigationTarget {
916 full_range: 1088..1154,
917 focus_range: 1133..1151,
923 "StructWithRunnable",
934 fn test_runnables_doc_test_in_impl() {
953 use_name_in_title: false,
954 nav: NavigationTarget {
967 use_name_in_title: false,
968 nav: NavigationTarget {
988 fn test_runnables_module() {
1002 use_name_in_title: false,
1003 nav: NavigationTarget {
1011 description: "mod test_mod",
1019 use_name_in_title: false,
1020 nav: NavigationTarget {
1025 focus_range: 35..44,
1031 "test_mod::test_foo1",
1045 fn only_modules_with_test_functions_or_more_than_one_test_submodule_have_runners() {
1051 mod nested_tests_0 {
1052 mod nested_tests_1 {
1054 fn nested_test_11() {}
1057 fn nested_test_12() {}
1060 mod nested_tests_2 {
1062 fn nested_test_2() {}
1065 mod nested_tests_3 {}
1068 mod nested_tests_4 {}
1071 &[TestMod, TestMod, Test, Test, TestMod, Test],
1075 use_name_in_title: false,
1076 nav: NavigationTarget {
1080 full_range: 22..323,
1081 focus_range: 26..40,
1082 name: "nested_tests_0",
1084 description: "mod nested_tests_0",
1087 path: "root_tests::nested_tests_0",
1092 use_name_in_title: false,
1093 nav: NavigationTarget {
1097 full_range: 51..192,
1098 focus_range: 55..69,
1099 name: "nested_tests_1",
1101 description: "mod nested_tests_1",
1104 path: "root_tests::nested_tests_0::nested_tests_1",
1109 use_name_in_title: false,
1110 nav: NavigationTarget {
1114 full_range: 84..126,
1115 focus_range: 107..121,
1116 name: "nested_test_11",
1121 "root_tests::nested_tests_0::nested_tests_1::nested_test_11",
1130 use_name_in_title: false,
1131 nav: NavigationTarget {
1135 full_range: 140..182,
1136 focus_range: 163..177,
1137 name: "nested_test_12",
1142 "root_tests::nested_tests_0::nested_tests_1::nested_test_12",
1151 use_name_in_title: false,
1152 nav: NavigationTarget {
1156 full_range: 202..286,
1157 focus_range: 206..220,
1158 name: "nested_tests_2",
1160 description: "mod nested_tests_2",
1163 path: "root_tests::nested_tests_0::nested_tests_2",
1168 use_name_in_title: false,
1169 nav: NavigationTarget {
1173 full_range: 235..276,
1174 focus_range: 258..271,
1175 name: "nested_test_2",
1180 "root_tests::nested_tests_0::nested_tests_2::nested_test_2",
1194 fn test_runnables_with_feature() {
1197 //- /lib.rs crate:foo cfg:feature=foo
1200 #[cfg(feature = "foo")]
1207 use_name_in_title: false,
1208 nav: NavigationTarget {
1222 use_name_in_title: false,
1223 nav: NavigationTarget {
1228 focus_range: 36..45,
1255 fn test_runnables_with_features() {
1258 //- /lib.rs crate:foo cfg:feature=foo,feature=bar
1261 #[cfg(all(feature = "foo", feature = "bar"))]
1268 use_name_in_title: false,
1269 nav: NavigationTarget {
1283 use_name_in_title: false,
1284 nav: NavigationTarget {
1289 focus_range: 58..67,
1326 fn test_runnables_no_test_function_in_module() {
1343 fn test_doc_runnables_impl_mod() {
1361 use_name_in_title: false,
1362 nav: NavigationTarget {
1371 "\"foo::Foo::foo\"",
1382 fn test_runnables_in_macro() {
1406 &[TestMod, TestMod, Test, Test, TestMod],
1410 use_name_in_title: false,
1411 nav: NavigationTarget {
1425 use_name_in_title: false,
1426 nav: NavigationTarget {
1430 full_range: 202..227,
1431 focus_range: 206..211,
1434 description: "mod tests",
1442 use_name_in_title: false,
1443 nav: NavigationTarget {
1447 full_range: 218..225,
1462 use_name_in_title: true,
1463 nav: NavigationTarget {
1467 full_range: 228..236,
1473 "tests2::foo_test2",
1482 use_name_in_title: true,
1483 nav: NavigationTarget {
1487 full_range: 228..236,
1490 description: "mod tests2",
1522 &[Test, Test, Test, TestMod],
1526 use_name_in_title: true,
1527 nav: NavigationTarget {
1531 full_range: 210..217,
1546 use_name_in_title: true,
1547 nav: NavigationTarget {
1551 full_range: 210..217,
1566 use_name_in_title: true,
1567 nav: NavigationTarget {
1571 full_range: 210..217,
1586 use_name_in_title: true,
1587 nav: NavigationTarget {
1591 full_range: 210..217,
1594 description: "mod foo_tests",
1607 fn dont_recurse_in_outline_submodules() {
1627 fn outline_submodule1() {
1643 use_name_in_title: false,
1644 nav: NavigationTarget {
1652 description: "mod m",
1665 fn outline_submodule2() {
1677 &[TestMod, Test, Test],
1681 use_name_in_title: false,
1682 nav: NavigationTarget {
1696 use_name_in_title: false,
1697 nav: NavigationTarget {
1702 focus_range: 12..14,
1717 use_name_in_title: false,
1718 nav: NavigationTarget {
1723 focus_range: 31..33,
1743 fn attributed_module() {
1746 //- proc_macros: identity
1749 #[proc_macros::identity]
1757 &[TestMod, Test, Test],
1761 use_name_in_title: true,
1762 nav: NavigationTarget {
1767 focus_range: 30..36,
1770 description: "mod module",
1778 use_name_in_title: true,
1779 nav: NavigationTarget {
1784 focus_range: 58..60,
1799 use_name_in_title: true,
1800 nav: NavigationTarget {
1805 focus_range: 85..87,
1825 fn find_no_tests() {
1838 fn find_direct_fn_test() {
1854 use_name_in_title: false,
1855 nav: NavigationTarget {
1860 focus_range: 46..54,
1880 fn find_direct_struct_test() {
1885 fn foo(arg: &Foo) { };
1899 use_name_in_title: false,
1900 nav: NavigationTarget {
1904 full_range: 71..122,
1905 focus_range: 86..94,
1925 fn find_indirect_fn_test() {
1951 use_name_in_title: false,
1952 nav: NavigationTarget {
1956 full_range: 133..183,
1957 focus_range: 148..156,
1977 fn tests_are_unique() {
2003 use_name_in_title: false,
2004 nav: NavigationTarget {
2008 full_range: 52..115,
2009 focus_range: 67..75,
2024 use_name_in_title: false,
2025 nav: NavigationTarget {
2029 full_range: 121..185,
2030 focus_range: 136..145,
2050 fn doc_test_type_params() {
2057 impl<T, U> Foo<T, U> {
2067 use_name_in_title: false,
2068 nav: NavigationTarget {
2088 fn doc_test_macro_export_mbe() {
2131 use_name_in_title: false,
2132 nav: NavigationTarget {