mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 03:38:29 +00:00
Emit test name in Run test runnables if it comes from a macro expansion
This commit is contained in:
parent
dd69d4a97c
commit
f1b3446844
@ -1634,6 +1634,16 @@ impl HasVisibility for AssocItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<AssocItem> for ModuleDef {
|
||||||
|
fn from(assoc: AssocItem) -> Self {
|
||||||
|
match assoc {
|
||||||
|
AssocItem::Function(it) => ModuleDef::Function(it),
|
||||||
|
AssocItem::Const(it) => ModuleDef::Const(it),
|
||||||
|
AssocItem::TypeAlias(it) => ModuleDef::TypeAlias(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
|
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
|
||||||
pub enum GenericDef {
|
pub enum GenericDef {
|
||||||
Function(Function),
|
Function(Function),
|
||||||
|
@ -57,24 +57,22 @@ pub(crate) fn annotations(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let action = runnable.action();
|
|
||||||
let range = runnable.nav.focus_or_full_range();
|
let range = runnable.nav.focus_or_full_range();
|
||||||
|
|
||||||
|
// dbg_runnable should go after the run annotation, to prevent a clone we do it this way
|
||||||
|
let dbg_runnable = (runnable.debugee() && config.debug).then(|| Annotation {
|
||||||
|
range,
|
||||||
|
kind: AnnotationKind::Runnable { debug: true, runnable: runnable.clone() },
|
||||||
|
});
|
||||||
|
|
||||||
if config.run {
|
if config.run {
|
||||||
annotations.push(Annotation {
|
annotations.push(Annotation {
|
||||||
range,
|
range,
|
||||||
|
kind: AnnotationKind::Runnable { debug: false, runnable },
|
||||||
// FIXME: This one allocates without reason if run is enabled, but debug is disabled
|
|
||||||
kind: AnnotationKind::Runnable { debug: false, runnable: runnable.clone() },
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if action.debugee && config.debug {
|
annotations.extend(dbg_runnable);
|
||||||
annotations.push(Annotation {
|
|
||||||
range,
|
|
||||||
kind: AnnotationKind::Runnable { debug: true, runnable },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,6 +226,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -247,6 +246,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -332,6 +332,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -351,6 +352,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -440,6 +442,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -459,6 +462,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -601,6 +605,7 @@ fn main() {}
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -620,6 +625,7 @@ fn main() {}
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -674,6 +680,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -693,6 +700,7 @@ fn main() {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -816,6 +824,7 @@ mod tests {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -835,6 +844,7 @@ mod tests {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -854,6 +864,7 @@ mod tests {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -876,6 +887,7 @@ mod tests {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -898,6 +910,7 @@ mod tests {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: false,
|
debug: false,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -924,6 +937,7 @@ mod tests {
|
|||||||
kind: Runnable {
|
kind: Runnable {
|
||||||
debug: true,
|
debug: true,
|
||||||
runnable: Runnable {
|
runnable: Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
|
@ -2463,6 +2463,7 @@ fn foo_$0test() {}
|
|||||||
),
|
),
|
||||||
Runnable(
|
Runnable(
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -2501,6 +2502,7 @@ mod tests$0 {
|
|||||||
[
|
[
|
||||||
Runnable(
|
Runnable(
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
|
@ -12,14 +12,15 @@ use ide_db::{
|
|||||||
RootDatabase, SymbolKind,
|
RootDatabase, SymbolKind,
|
||||||
};
|
};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use rustc_hash::FxHashSet;
|
use rustc_hash::{FxHashMap, FxHashSet};
|
||||||
use stdx::always;
|
use stdx::{always, format_to};
|
||||||
use syntax::ast::{self, AstNode, AttrsOwner};
|
use syntax::ast::{self, AstNode, AttrsOwner};
|
||||||
|
|
||||||
use crate::{display::TryToNav, references, FileId, NavigationTarget};
|
use crate::{display::TryToNav, references, FileId, NavigationTarget};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
|
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
|
||||||
pub struct Runnable {
|
pub struct Runnable {
|
||||||
|
pub use_name_in_title: bool,
|
||||||
pub nav: NavigationTarget,
|
pub nav: NavigationTarget,
|
||||||
pub kind: RunnableKind,
|
pub kind: RunnableKind,
|
||||||
pub cfg: Option<CfgExpr>,
|
pub cfg: Option<CfgExpr>,
|
||||||
@ -49,20 +50,16 @@ pub enum RunnableKind {
|
|||||||
Bin,
|
Bin,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq)]
|
#[cfg(test)]
|
||||||
pub struct RunnableAction {
|
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
|
||||||
pub run_title: &'static str,
|
enum RunnableTestKind {
|
||||||
pub debugee: bool,
|
Test,
|
||||||
|
TestMod,
|
||||||
|
DocTest,
|
||||||
|
Bench,
|
||||||
|
Bin,
|
||||||
}
|
}
|
||||||
|
|
||||||
const TEST: RunnableAction = RunnableAction { run_title: "▶\u{fe0e} Run Test", debugee: true };
|
|
||||||
const TEST_MOD: RunnableAction =
|
|
||||||
RunnableAction { run_title: "▶\u{fe0e} Run Tests", debugee: true };
|
|
||||||
const DOCTEST: RunnableAction =
|
|
||||||
RunnableAction { run_title: "▶\u{fe0e} Run Doctest", debugee: false };
|
|
||||||
const BENCH: RunnableAction = RunnableAction { run_title: "▶\u{fe0e} Run Bench", debugee: true };
|
|
||||||
const BIN: RunnableAction = RunnableAction { run_title: "▶\u{fe0e} Run", debugee: true };
|
|
||||||
|
|
||||||
impl Runnable {
|
impl Runnable {
|
||||||
// test package::module::testname
|
// test package::module::testname
|
||||||
pub fn label(&self, target: Option<String>) -> String {
|
pub fn label(&self, target: Option<String>) -> String {
|
||||||
@ -77,13 +74,43 @@ impl Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn action(&self) -> &'static RunnableAction {
|
pub fn debugee(&self) -> bool {
|
||||||
|
matches!(
|
||||||
|
&self.kind,
|
||||||
|
RunnableKind::TestMod { .. }
|
||||||
|
| RunnableKind::Test { .. }
|
||||||
|
| RunnableKind::Bench { .. }
|
||||||
|
| RunnableKind::Bin
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn title(&self) -> String {
|
||||||
|
let mut s = String::from("▶\u{fe0e} Run ");
|
||||||
|
if self.use_name_in_title {
|
||||||
|
format_to!(s, "{}", self.nav.name);
|
||||||
|
if !matches!(self.kind, RunnableKind::Bin) {
|
||||||
|
s.push(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let suffix = match &self.kind {
|
||||||
|
RunnableKind::TestMod { .. } => "Tests",
|
||||||
|
RunnableKind::Test { .. } => "Test",
|
||||||
|
RunnableKind::DocTest { .. } => "Doctest",
|
||||||
|
RunnableKind::Bench { .. } => "Bench",
|
||||||
|
RunnableKind::Bin => return s,
|
||||||
|
};
|
||||||
|
s.push_str(suffix);
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
fn test_kind(&self) -> RunnableTestKind {
|
||||||
match &self.kind {
|
match &self.kind {
|
||||||
RunnableKind::TestMod { .. } => &TEST_MOD,
|
RunnableKind::TestMod { .. } => RunnableTestKind::TestMod,
|
||||||
RunnableKind::Test { .. } => &TEST,
|
RunnableKind::Test { .. } => RunnableTestKind::Test,
|
||||||
RunnableKind::DocTest { .. } => &DOCTEST,
|
RunnableKind::DocTest { .. } => RunnableTestKind::DocTest,
|
||||||
RunnableKind::Bench { .. } => &BENCH,
|
RunnableKind::Bench { .. } => RunnableTestKind::Bench,
|
||||||
RunnableKind::Bin => &BIN,
|
RunnableKind::Bin => RunnableTestKind::Bin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,7 +131,10 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
|
|||||||
let sema = Semantics::new(db);
|
let sema = Semantics::new(db);
|
||||||
|
|
||||||
let mut res = Vec::new();
|
let mut res = Vec::new();
|
||||||
let mut add_opt = |runnable: Option<Runnable>| {
|
// Record all runnables that come from macro expansions here instead.
|
||||||
|
// In case an expansion creates multiple runnables we want to name them to avoid emitting a bunch of equally named runnables.
|
||||||
|
let mut in_macro_expansion = FxHashMap::<hir::HirFileId, Vec<Runnable>>::default();
|
||||||
|
let mut add_opt = |runnable: Option<Runnable>, def| {
|
||||||
if let Some(runnable) = runnable.filter(|runnable| {
|
if let Some(runnable) = runnable.filter(|runnable| {
|
||||||
always!(
|
always!(
|
||||||
runnable.nav.file_id == file_id,
|
runnable.nav.file_id == file_id,
|
||||||
@ -113,6 +143,17 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
|
|||||||
file_id
|
file_id
|
||||||
)
|
)
|
||||||
}) {
|
}) {
|
||||||
|
if let Some(def) = def {
|
||||||
|
let file_id = match def {
|
||||||
|
hir::ModuleDef::Module(it) => it.declaration_source(db).map(|src| src.file_id),
|
||||||
|
hir::ModuleDef::Function(it) => it.source(db).map(|src| src.file_id),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
if let Some(file_id) = file_id.filter(|file| file.call_node(db).is_some()) {
|
||||||
|
in_macro_expansion.entry(file_id).or_default().push(runnable);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
res.push(runnable);
|
res.push(runnable);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -123,23 +164,35 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
|
|||||||
hir::ModuleDef::Function(it) => runnable_fn(&sema, it),
|
hir::ModuleDef::Function(it) => runnable_fn(&sema, it),
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
add_opt(runnable.or_else(|| module_def_doctest(&sema, def)));
|
add_opt(runnable.or_else(|| module_def_doctest(&sema, def)), Some(def));
|
||||||
}
|
}
|
||||||
Either::Right(impl_) => {
|
Either::Right(impl_) => {
|
||||||
add_opt(runnable_impl(&sema, &impl_));
|
add_opt(runnable_impl(&sema, &impl_), None);
|
||||||
impl_
|
impl_
|
||||||
.items(db)
|
.items(db)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|assoc| match assoc {
|
.map(|assoc| {
|
||||||
hir::AssocItem::Function(it) => {
|
(
|
||||||
runnable_fn(&sema, it).or_else(|| module_def_doctest(&sema, it.into()))
|
match assoc {
|
||||||
}
|
hir::AssocItem::Function(it) => runnable_fn(&sema, it)
|
||||||
hir::AssocItem::Const(it) => module_def_doctest(&sema, it.into()),
|
.or_else(|| module_def_doctest(&sema, it.into())),
|
||||||
hir::AssocItem::TypeAlias(it) => module_def_doctest(&sema, it.into()),
|
hir::AssocItem::Const(it) => module_def_doctest(&sema, it.into()),
|
||||||
|
hir::AssocItem::TypeAlias(it) => module_def_doctest(&sema, it.into()),
|
||||||
|
},
|
||||||
|
assoc,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.for_each(|r| add_opt(r));
|
.for_each(|(r, assoc)| add_opt(r, Some(assoc.into())));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
res.extend(in_macro_expansion.into_iter().flat_map(|(_, runnables)| {
|
||||||
|
let use_name_in_title = runnables.len() != 1;
|
||||||
|
runnables.into_iter().map(move |mut r| {
|
||||||
|
r.use_name_in_title = use_name_in_title;
|
||||||
|
r
|
||||||
|
})
|
||||||
|
}));
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +325,7 @@ pub(crate) fn runnable_fn(sema: &Semantics<RootDatabase>, def: hir::Function) ->
|
|||||||
SymbolKind::Function,
|
SymbolKind::Function,
|
||||||
);
|
);
|
||||||
let cfg = def.attrs(sema.db).cfg();
|
let cfg = def.attrs(sema.db).cfg();
|
||||||
Some(Runnable { nav, kind, cfg })
|
Some(Runnable { use_name_in_title: false, nav, kind, cfg })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn runnable_mod(sema: &Semantics<RootDatabase>, def: hir::Module) -> Option<Runnable> {
|
pub(crate) fn runnable_mod(sema: &Semantics<RootDatabase>, def: hir::Module) -> Option<Runnable> {
|
||||||
@ -285,7 +338,7 @@ pub(crate) fn runnable_mod(sema: &Semantics<RootDatabase>, def: hir::Module) ->
|
|||||||
let attrs = def.attrs(sema.db);
|
let attrs = def.attrs(sema.db);
|
||||||
let cfg = attrs.cfg();
|
let cfg = attrs.cfg();
|
||||||
let nav = NavigationTarget::from_module_to_decl(sema.db, def);
|
let nav = NavigationTarget::from_module_to_decl(sema.db, def);
|
||||||
Some(Runnable { nav, kind: RunnableKind::TestMod { path }, cfg })
|
Some(Runnable { use_name_in_title: false, nav, kind: RunnableKind::TestMod { path }, cfg })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn runnable_impl(sema: &Semantics<RootDatabase>, def: &hir::Impl) -> Option<Runnable> {
|
pub(crate) fn runnable_impl(sema: &Semantics<RootDatabase>, def: &hir::Impl) -> Option<Runnable> {
|
||||||
@ -305,7 +358,7 @@ pub(crate) fn runnable_impl(sema: &Semantics<RootDatabase>, def: &hir::Impl) ->
|
|||||||
};
|
};
|
||||||
let test_id = TestId::Path(format!("{}{}", adt_name, params));
|
let test_id = TestId::Path(format!("{}{}", adt_name, params));
|
||||||
|
|
||||||
Some(Runnable { nav, kind: RunnableKind::DocTest { test_id }, cfg })
|
Some(Runnable { use_name_in_title: false, nav, kind: RunnableKind::DocTest { test_id }, cfg })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn module_def_doctest(sema: &Semantics<RootDatabase>, def: hir::ModuleDef) -> Option<Runnable> {
|
fn module_def_doctest(sema: &Semantics<RootDatabase>, def: hir::ModuleDef) -> Option<Runnable> {
|
||||||
@ -368,7 +421,12 @@ fn module_def_doctest(sema: &Semantics<RootDatabase>, def: hir::ModuleDef) -> Op
|
|||||||
nav.description = None;
|
nav.description = None;
|
||||||
nav.docs = None;
|
nav.docs = None;
|
||||||
nav.kind = None;
|
nav.kind = None;
|
||||||
let res = Runnable { nav, kind: RunnableKind::DocTest { test_id }, cfg: attrs.cfg() };
|
let res = Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
|
nav,
|
||||||
|
kind: RunnableKind::DocTest { test_id },
|
||||||
|
cfg: attrs.cfg(),
|
||||||
|
};
|
||||||
Some(res)
|
Some(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,12 +506,12 @@ mod tests {
|
|||||||
|
|
||||||
use crate::fixture;
|
use crate::fixture;
|
||||||
|
|
||||||
use super::*;
|
use super::{RunnableTestKind::*, *};
|
||||||
|
|
||||||
fn check(
|
fn check(
|
||||||
ra_fixture: &str,
|
ra_fixture: &str,
|
||||||
// FIXME: fold this into `expect` as well
|
// FIXME: fold this into `expect` as well
|
||||||
actions: &[&RunnableAction],
|
actions: &[RunnableTestKind],
|
||||||
expect: Expect,
|
expect: Expect,
|
||||||
) {
|
) {
|
||||||
let (analysis, position) = fixture::position(ra_fixture);
|
let (analysis, position) = fixture::position(ra_fixture);
|
||||||
@ -461,7 +519,7 @@ mod tests {
|
|||||||
expect.assert_debug_eq(&runnables);
|
expect.assert_debug_eq(&runnables);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
actions,
|
actions,
|
||||||
runnables.into_iter().map(|it| it.action()).collect::<Vec<_>>().as_slice()
|
runnables.into_iter().map(|it| it.test_kind()).collect::<Vec<_>>().as_slice()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -493,10 +551,11 @@ mod not_a_root {
|
|||||||
fn main() {}
|
fn main() {}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
&[&BIN, &TEST, &TEST, &BENCH],
|
&[Bin, Test, Test, Bench],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -510,6 +569,7 @@ mod not_a_root {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -530,6 +590,7 @@ mod not_a_root {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -550,6 +611,7 @@ mod not_a_root {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -667,10 +729,11 @@ trait Test {
|
|||||||
/// ```
|
/// ```
|
||||||
impl Test for StructWithRunnable {}
|
impl Test for StructWithRunnable {}
|
||||||
"#,
|
"#,
|
||||||
&[&BIN, &DOCTEST, &DOCTEST, &DOCTEST, &DOCTEST, &DOCTEST, &DOCTEST, &DOCTEST, &DOCTEST],
|
&[Bin, DocTest, DocTest, DocTest, DocTest, DocTest, DocTest, DocTest, DocTest],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -684,6 +747,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -699,6 +763,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -714,6 +779,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -729,6 +795,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -744,6 +811,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -759,6 +827,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -774,6 +843,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -791,6 +861,7 @@ impl Test for StructWithRunnable {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -828,10 +899,11 @@ impl Data {
|
|||||||
fn foo() {}
|
fn foo() {}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
&[&BIN, &DOCTEST],
|
&[Bin, DocTest],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -845,6 +917,7 @@ impl Data {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -875,10 +948,11 @@ mod test_mod {
|
|||||||
fn test_foo1() {}
|
fn test_foo1() {}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
&[&TEST_MOD, &TEST],
|
&[TestMod, Test],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -895,6 +969,7 @@ mod test_mod {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -946,10 +1021,11 @@ mod root_tests {
|
|||||||
mod nested_tests_4 {}
|
mod nested_tests_4 {}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
&[&TEST_MOD, &TEST_MOD, &TEST_MOD, &TEST, &TEST, &TEST],
|
&[TestMod, TestMod, TestMod, Test, Test, Test],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -966,6 +1042,7 @@ mod root_tests {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -982,6 +1059,7 @@ mod root_tests {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -998,6 +1076,7 @@ mod root_tests {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1018,6 +1097,7 @@ mod root_tests {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1038,6 +1118,7 @@ mod root_tests {
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1072,10 +1153,11 @@ $0
|
|||||||
#[cfg(feature = "foo")]
|
#[cfg(feature = "foo")]
|
||||||
fn test_foo1() {}
|
fn test_foo1() {}
|
||||||
"#,
|
"#,
|
||||||
&[&TEST],
|
&[Test],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1117,10 +1199,11 @@ $0
|
|||||||
#[cfg(all(feature = "foo", feature = "bar"))]
|
#[cfg(all(feature = "foo", feature = "bar"))]
|
||||||
fn test_foo1() {}
|
fn test_foo1() {}
|
||||||
"#,
|
"#,
|
||||||
&[&TEST],
|
&[Test],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1194,10 +1277,11 @@ impl Foo {
|
|||||||
fn foo() {}
|
fn foo() {}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
&[&DOCTEST],
|
&[DocTest],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
1,
|
1,
|
||||||
@ -1231,9 +1315,9 @@ macro_rules! gen {
|
|||||||
}
|
}
|
||||||
macro_rules! gen2 {
|
macro_rules! gen2 {
|
||||||
() => {
|
() => {
|
||||||
mod m_tests {
|
mod tests2 {
|
||||||
#[test]
|
#[test]
|
||||||
fn foo_test() {}
|
fn foo_test2() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1242,10 +1326,11 @@ mod tests {
|
|||||||
}
|
}
|
||||||
gen2!();
|
gen2!();
|
||||||
"#,
|
"#,
|
||||||
&[&TEST_MOD, &TEST_MOD, &TEST, &TEST],
|
&[TestMod, TestMod, Test, Test],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1262,22 +1347,45 @@ gen2!();
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: true,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
),
|
),
|
||||||
full_range: 228..236,
|
full_range: 228..236,
|
||||||
focus_range: 228..236,
|
focus_range: 228..236,
|
||||||
name: "m_tests",
|
name: "tests2",
|
||||||
kind: Module,
|
kind: Module,
|
||||||
description: "mod m_tests",
|
description: "mod tests2",
|
||||||
},
|
},
|
||||||
kind: TestMod {
|
kind: TestMod {
|
||||||
path: "m_tests",
|
path: "tests2",
|
||||||
},
|
},
|
||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: true,
|
||||||
|
nav: NavigationTarget {
|
||||||
|
file_id: FileId(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
full_range: 228..236,
|
||||||
|
focus_range: 228..236,
|
||||||
|
name: "foo_test2",
|
||||||
|
kind: Function,
|
||||||
|
},
|
||||||
|
kind: Test {
|
||||||
|
test_id: Path(
|
||||||
|
"tests2::foo_test2",
|
||||||
|
),
|
||||||
|
attr: TestAttr {
|
||||||
|
ignore: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cfg: None,
|
||||||
|
},
|
||||||
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1297,19 +1405,107 @@ gen2!();
|
|||||||
},
|
},
|
||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
|
]
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn big_mac() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
//- /lib.rs
|
||||||
|
$0
|
||||||
|
macro_rules! foo {
|
||||||
|
() => {
|
||||||
|
mod foo_tests {
|
||||||
|
#[test]
|
||||||
|
fn foo0() {}
|
||||||
|
#[test]
|
||||||
|
fn foo1() {}
|
||||||
|
#[test]
|
||||||
|
fn foo2() {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
foo!();
|
||||||
|
"#,
|
||||||
|
&[TestMod, Test, Test, Test],
|
||||||
|
expect![[r#"
|
||||||
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: true,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
),
|
),
|
||||||
full_range: 228..236,
|
full_range: 210..217,
|
||||||
focus_range: 228..236,
|
focus_range: 210..217,
|
||||||
name: "foo_test",
|
name: "foo_tests",
|
||||||
|
kind: Module,
|
||||||
|
description: "mod foo_tests",
|
||||||
|
},
|
||||||
|
kind: TestMod {
|
||||||
|
path: "foo_tests",
|
||||||
|
},
|
||||||
|
cfg: None,
|
||||||
|
},
|
||||||
|
Runnable {
|
||||||
|
use_name_in_title: true,
|
||||||
|
nav: NavigationTarget {
|
||||||
|
file_id: FileId(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
full_range: 210..217,
|
||||||
|
focus_range: 210..217,
|
||||||
|
name: "foo0",
|
||||||
kind: Function,
|
kind: Function,
|
||||||
},
|
},
|
||||||
kind: Test {
|
kind: Test {
|
||||||
test_id: Path(
|
test_id: Path(
|
||||||
"m_tests::foo_test",
|
"foo_tests::foo0",
|
||||||
|
),
|
||||||
|
attr: TestAttr {
|
||||||
|
ignore: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cfg: None,
|
||||||
|
},
|
||||||
|
Runnable {
|
||||||
|
use_name_in_title: true,
|
||||||
|
nav: NavigationTarget {
|
||||||
|
file_id: FileId(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
full_range: 210..217,
|
||||||
|
focus_range: 210..217,
|
||||||
|
name: "foo1",
|
||||||
|
kind: Function,
|
||||||
|
},
|
||||||
|
kind: Test {
|
||||||
|
test_id: Path(
|
||||||
|
"foo_tests::foo1",
|
||||||
|
),
|
||||||
|
attr: TestAttr {
|
||||||
|
ignore: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cfg: None,
|
||||||
|
},
|
||||||
|
Runnable {
|
||||||
|
use_name_in_title: true,
|
||||||
|
nav: NavigationTarget {
|
||||||
|
file_id: FileId(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
full_range: 210..217,
|
||||||
|
focus_range: 210..217,
|
||||||
|
name: "foo2",
|
||||||
|
kind: Function,
|
||||||
|
},
|
||||||
|
kind: Test {
|
||||||
|
test_id: Path(
|
||||||
|
"foo_tests::foo2",
|
||||||
),
|
),
|
||||||
attr: TestAttr {
|
attr: TestAttr {
|
||||||
ignore: false,
|
ignore: false,
|
||||||
@ -1355,10 +1551,11 @@ fn t0() {}
|
|||||||
#[test]
|
#[test]
|
||||||
fn t1() {}
|
fn t1() {}
|
||||||
"#,
|
"#,
|
||||||
&[&TEST_MOD],
|
&[TestMod],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1392,10 +1589,11 @@ fn t0() {}
|
|||||||
#[test]
|
#[test]
|
||||||
fn t1() {}
|
fn t1() {}
|
||||||
"#,
|
"#,
|
||||||
&[&TEST, &TEST],
|
&[Test, Test],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
1,
|
1,
|
||||||
@ -1416,6 +1614,7 @@ fn t1() {}
|
|||||||
cfg: None,
|
cfg: None,
|
||||||
},
|
},
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
1,
|
1,
|
||||||
@ -1470,6 +1669,7 @@ mod tests {
|
|||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1512,28 +1712,29 @@ mod tests {
|
|||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
nav: NavigationTarget {
|
use_name_in_title: false,
|
||||||
file_id: FileId(
|
nav: NavigationTarget {
|
||||||
0,
|
file_id: FileId(
|
||||||
),
|
0,
|
||||||
full_range: 71..122,
|
),
|
||||||
focus_range: 86..94,
|
full_range: 71..122,
|
||||||
name: "foo_test",
|
focus_range: 86..94,
|
||||||
kind: Function,
|
name: "foo_test",
|
||||||
},
|
kind: Function,
|
||||||
kind: Test {
|
|
||||||
test_id: Path(
|
|
||||||
"tests::foo_test",
|
|
||||||
),
|
|
||||||
attr: TestAttr {
|
|
||||||
ignore: false,
|
|
||||||
},
|
},
|
||||||
|
kind: Test {
|
||||||
|
test_id: Path(
|
||||||
|
"tests::foo_test",
|
||||||
|
),
|
||||||
|
attr: TestAttr {
|
||||||
|
ignore: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cfg: None,
|
||||||
},
|
},
|
||||||
cfg: None,
|
]
|
||||||
},
|
|
||||||
]
|
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1565,6 +1766,7 @@ mod tests {
|
|||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
@ -1614,48 +1816,50 @@ mod tests {
|
|||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
nav: NavigationTarget {
|
use_name_in_title: false,
|
||||||
file_id: FileId(
|
nav: NavigationTarget {
|
||||||
0,
|
file_id: FileId(
|
||||||
),
|
0,
|
||||||
full_range: 52..115,
|
),
|
||||||
focus_range: 67..75,
|
full_range: 52..115,
|
||||||
name: "foo_test",
|
focus_range: 67..75,
|
||||||
kind: Function,
|
name: "foo_test",
|
||||||
},
|
kind: Function,
|
||||||
kind: Test {
|
|
||||||
test_id: Path(
|
|
||||||
"tests::foo_test",
|
|
||||||
),
|
|
||||||
attr: TestAttr {
|
|
||||||
ignore: false,
|
|
||||||
},
|
},
|
||||||
},
|
kind: Test {
|
||||||
cfg: None,
|
test_id: Path(
|
||||||
},
|
"tests::foo_test",
|
||||||
Runnable {
|
),
|
||||||
nav: NavigationTarget {
|
attr: TestAttr {
|
||||||
file_id: FileId(
|
ignore: false,
|
||||||
0,
|
},
|
||||||
),
|
|
||||||
full_range: 121..185,
|
|
||||||
focus_range: 136..145,
|
|
||||||
name: "foo2_test",
|
|
||||||
kind: Function,
|
|
||||||
},
|
|
||||||
kind: Test {
|
|
||||||
test_id: Path(
|
|
||||||
"tests::foo2_test",
|
|
||||||
),
|
|
||||||
attr: TestAttr {
|
|
||||||
ignore: false,
|
|
||||||
},
|
},
|
||||||
|
cfg: None,
|
||||||
},
|
},
|
||||||
cfg: None,
|
Runnable {
|
||||||
},
|
use_name_in_title: false,
|
||||||
]
|
nav: NavigationTarget {
|
||||||
|
file_id: FileId(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
full_range: 121..185,
|
||||||
|
focus_range: 136..145,
|
||||||
|
name: "foo2_test",
|
||||||
|
kind: Function,
|
||||||
|
},
|
||||||
|
kind: Test {
|
||||||
|
test_id: Path(
|
||||||
|
"tests::foo2_test",
|
||||||
|
),
|
||||||
|
attr: TestAttr {
|
||||||
|
ignore: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cfg: None,
|
||||||
|
},
|
||||||
|
]
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1674,10 +1878,11 @@ impl<T, U> Foo<T, U> {
|
|||||||
fn t() {}
|
fn t() {}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
&[&DOCTEST],
|
&[DocTest],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
[
|
[
|
||||||
Runnable {
|
Runnable {
|
||||||
|
use_name_in_title: false,
|
||||||
nav: NavigationTarget {
|
nav: NavigationTarget {
|
||||||
file_id: FileId(
|
file_id: FileId(
|
||||||
0,
|
0,
|
||||||
|
@ -1554,12 +1554,12 @@ fn runnable_action_links(
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let action: &'static _ = runnable.action();
|
let title = runnable.title();
|
||||||
to_proto::runnable(snap, runnable).ok().map(|r| {
|
to_proto::runnable(snap, runnable).ok().map(|r| {
|
||||||
let mut group = lsp_ext::CommandLinkGroup::default();
|
let mut group = lsp_ext::CommandLinkGroup::default();
|
||||||
|
|
||||||
if hover_actions_config.run {
|
if hover_actions_config.run {
|
||||||
let run_command = to_proto::command::run_single(&r, action.run_title);
|
let run_command = to_proto::command::run_single(&r, &title);
|
||||||
group.commands.push(to_command_link(run_command, r.label.clone()));
|
group.commands.push(to_command_link(run_command, r.label.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -958,15 +958,11 @@ pub(crate) fn code_lens(
|
|||||||
let line_index = snap.file_line_index(run.nav.file_id)?;
|
let line_index = snap.file_line_index(run.nav.file_id)?;
|
||||||
let annotation_range = range(&line_index, annotation.range);
|
let annotation_range = range(&line_index, annotation.range);
|
||||||
|
|
||||||
let action = run.action();
|
let title = run.title();
|
||||||
let r = runnable(snap, run)?;
|
let r = runnable(snap, run)?;
|
||||||
|
|
||||||
let command = if debug {
|
let command =
|
||||||
command::debug_single(&r)
|
if debug { command::debug_single(&r) } else { command::run_single(&r, &title) };
|
||||||
} else {
|
|
||||||
let title = action.run_title.to_string();
|
|
||||||
command::run_single(&r, &title)
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(lsp_types::CodeLens { range: annotation_range, command: Some(command), data: None })
|
Ok(lsp_types::CodeLens { range: annotation_range, command: Some(command), data: None })
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user