Skip to content

Commit 95d8533

Browse files
bors[bot]Veykril
andauthored
Merge #9595
9595: Show test mod runnable in outline modules r=Veykril a=Veykril This shows a runnable inside outline test modules at the top of its file: ![image](https://user-images.githubusercontent.com/3757771/125494747-169c9238-3faa-4eed-9700-90bd730b4e3c.png) Co-authored-by: Lukas Wirth <[email protected]>
2 parents ade9115 + d837a5d commit 95d8533

File tree

2 files changed

+155
-6
lines changed

2 files changed

+155
-6
lines changed

crates/ide/src/runnables.rs

Lines changed: 112 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ use rustc_hash::{FxHashMap, FxHashSet};
1616
use stdx::{always, format_to};
1717
use syntax::ast::{self, AstNode, AttrsOwner};
1818

19-
use crate::{display::TryToNav, references, FileId, NavigationTarget};
19+
use crate::{
20+
display::{ToNav, TryToNav},
21+
references, FileId, NavigationTarget,
22+
};
2023

2124
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
2225
pub struct Runnable {
@@ -176,6 +179,10 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
176179
}
177180
});
178181

182+
sema.to_module_defs(file_id)
183+
.map(|it| runnable_mod_outline_definition(&sema, it))
184+
.for_each(|it| add_opt(it, None));
185+
179186
res.extend(in_macro_expansion.into_iter().flat_map(|(_, runnables)| {
180187
let use_name_in_title = runnables.len() != 1;
181188
runnables.into_iter().map(move |mut r| {
@@ -351,6 +358,30 @@ pub(crate) fn runnable_impl(sema: &Semantics<RootDatabase>, def: &hir::Impl) ->
351358
Some(Runnable { use_name_in_title: false, nav, kind: RunnableKind::DocTest { test_id }, cfg })
352359
}
353360

361+
/// Creates a test mod runnable for outline modules at the top of their definition.
362+
fn runnable_mod_outline_definition(
363+
sema: &Semantics<RootDatabase>,
364+
def: hir::Module,
365+
) -> Option<Runnable> {
366+
if !has_test_function_or_multiple_test_submodules(sema, &def) {
367+
return None;
368+
}
369+
let path =
370+
def.path_to_root(sema.db).into_iter().rev().filter_map(|it| it.name(sema.db)).join("::");
371+
372+
let attrs = def.attrs(sema.db);
373+
let cfg = attrs.cfg();
374+
match def.definition_source(sema.db).value {
375+
hir::ModuleSource::SourceFile(_) => Some(Runnable {
376+
use_name_in_title: false,
377+
nav: def.to_nav(sema.db),
378+
kind: RunnableKind::TestMod { path },
379+
cfg,
380+
}),
381+
_ => None,
382+
}
383+
}
384+
354385
fn module_def_doctest(sema: &Semantics<RootDatabase>, def: hir::ModuleDef) -> Option<Runnable> {
355386
let attrs = match def {
356387
hir::ModuleDef::Module(it) => it.attrs(sema.db),
@@ -541,7 +572,7 @@ mod not_a_root {
541572
fn main() {}
542573
}
543574
"#,
544-
&[Bin, Test, Test, Bench],
575+
&[Bin, Test, Test, Bench, TestMod],
545576
expect![[r#"
546577
[
547578
Runnable {
@@ -618,6 +649,21 @@ mod not_a_root {
618649
},
619650
cfg: None,
620651
},
652+
Runnable {
653+
use_name_in_title: false,
654+
nav: NavigationTarget {
655+
file_id: FileId(
656+
0,
657+
),
658+
full_range: 0..137,
659+
name: "",
660+
kind: Module,
661+
},
662+
kind: TestMod {
663+
path: "",
664+
},
665+
cfg: None,
666+
},
621667
]
622668
"#]],
623669
);
@@ -1143,7 +1189,7 @@ $0
11431189
#[cfg(feature = "foo")]
11441190
fn test_foo1() {}
11451191
"#,
1146-
&[Test],
1192+
&[Test, TestMod],
11471193
expect![[r#"
11481194
[
11491195
Runnable {
@@ -1174,6 +1220,21 @@ fn test_foo1() {}
11741220
),
11751221
),
11761222
},
1223+
Runnable {
1224+
use_name_in_title: false,
1225+
nav: NavigationTarget {
1226+
file_id: FileId(
1227+
0,
1228+
),
1229+
full_range: 0..51,
1230+
name: "",
1231+
kind: Module,
1232+
},
1233+
kind: TestMod {
1234+
path: "",
1235+
},
1236+
cfg: None,
1237+
},
11771238
]
11781239
"#]],
11791240
);
@@ -1189,7 +1250,7 @@ $0
11891250
#[cfg(all(feature = "foo", feature = "bar"))]
11901251
fn test_foo1() {}
11911252
"#,
1192-
&[Test],
1253+
&[Test, TestMod],
11931254
expect![[r#"
11941255
[
11951256
Runnable {
@@ -1230,6 +1291,21 @@ fn test_foo1() {}
12301291
),
12311292
),
12321293
},
1294+
Runnable {
1295+
use_name_in_title: false,
1296+
nav: NavigationTarget {
1297+
file_id: FileId(
1298+
0,
1299+
),
1300+
full_range: 0..73,
1301+
name: "",
1302+
kind: Module,
1303+
},
1304+
kind: TestMod {
1305+
path: "",
1306+
},
1307+
cfg: None,
1308+
},
12331309
]
12341310
"#]],
12351311
);
@@ -1316,7 +1392,7 @@ mod tests {
13161392
}
13171393
gen2!();
13181394
"#,
1319-
&[TestMod, TestMod, Test, Test],
1395+
&[TestMod, TestMod, TestMod, Test, Test],
13201396
expect![[r#"
13211397
[
13221398
Runnable {
@@ -1336,6 +1412,21 @@ gen2!();
13361412
},
13371413
cfg: None,
13381414
},
1415+
Runnable {
1416+
use_name_in_title: false,
1417+
nav: NavigationTarget {
1418+
file_id: FileId(
1419+
0,
1420+
),
1421+
full_range: 0..237,
1422+
name: "",
1423+
kind: Module,
1424+
},
1425+
kind: TestMod {
1426+
path: "",
1427+
},
1428+
cfg: None,
1429+
},
13391430
Runnable {
13401431
use_name_in_title: true,
13411432
nav: NavigationTarget {
@@ -1579,7 +1670,7 @@ fn t0() {}
15791670
#[test]
15801671
fn t1() {}
15811672
"#,
1582-
&[Test, Test],
1673+
&[Test, Test, TestMod],
15831674
expect![[r#"
15841675
[
15851676
Runnable {
@@ -1624,6 +1715,21 @@ fn t1() {}
16241715
},
16251716
cfg: None,
16261717
},
1718+
Runnable {
1719+
use_name_in_title: false,
1720+
nav: NavigationTarget {
1721+
file_id: FileId(
1722+
1,
1723+
),
1724+
full_range: 0..39,
1725+
name: "m",
1726+
kind: Module,
1727+
},
1728+
kind: TestMod {
1729+
path: "m",
1730+
},
1731+
cfg: None,
1732+
},
16271733
]
16281734
"#]],
16291735
);

crates/rust-analyzer/tests/slow-tests/main.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,49 @@ fn main() {}
133133
"targetUri": "file:///[..]/tests/spam.rs"
134134
}
135135
},
136+
{
137+
"args": {
138+
"overrideCargo": null,
139+
"workspaceRoot": server.path().join("foo"),
140+
"cargoArgs": [
141+
"test",
142+
"--package",
143+
"foo",
144+
"--test",
145+
"spam"
146+
],
147+
"cargoExtraArgs": [],
148+
"executableArgs": [
149+
"",
150+
"--nocapture"
151+
]
152+
},
153+
"kind": "cargo",
154+
"label": "test-mod ",
155+
"location": {
156+
"targetUri": "file:///[..]/tests/spam.rs",
157+
"targetRange": {
158+
"start": {
159+
"line": 0,
160+
"character": 0
161+
},
162+
"end": {
163+
"line": 3,
164+
"character": 0
165+
}
166+
},
167+
"targetSelectionRange": {
168+
"start": {
169+
"line": 0,
170+
"character": 0
171+
},
172+
"end": {
173+
"line": 3,
174+
"character": 0
175+
}
176+
}
177+
},
178+
},
136179
{
137180
"args": {
138181
"cargoArgs": ["check", "--package", "foo", "--all-targets"],

0 commit comments

Comments
 (0)