aboutsummaryrefslogtreecommitdiff
path: root/libeditor
diff options
context:
space:
mode:
Diffstat (limited to 'libeditor')
-rw-r--r--libeditor/src/lib.rs34
-rw-r--r--libeditor/tests/test.rs22
2 files changed, 56 insertions, 0 deletions
diff --git a/libeditor/src/lib.rs b/libeditor/src/lib.rs
index ef31efe35..387859d4a 100644
--- a/libeditor/src/lib.rs
+++ b/libeditor/src/lib.rs
@@ -26,6 +26,18 @@ pub struct Symbol {
26 pub range: TextRange, 26 pub range: TextRange,
27} 27}
28 28
29#[derive(Debug)]
30pub struct Runnable {
31 pub range: TextRange,
32 pub kind: RunnableKind,
33}
34
35#[derive(Debug)]
36pub enum RunnableKind {
37 Test { name: String },
38 Bin,
39}
40
29impl File { 41impl File {
30 pub fn new(text: &str) -> File { 42 pub fn new(text: &str) -> File {
31 File { 43 File {
@@ -78,6 +90,28 @@ impl File {
78 let syntax = self.inner.syntax(); 90 let syntax = self.inner.syntax();
79 extend_selection::extend_selection(syntax.as_ref(), range) 91 extend_selection::extend_selection(syntax.as_ref(), range)
80 } 92 }
93
94 pub fn runnables(&self) -> Vec<Runnable> {
95 self.inner
96 .functions()
97 .filter_map(|f| {
98 let name = f.name()?.text();
99 let kind = if name == "main" {
100 RunnableKind::Bin
101 } else if f.has_atom_attr("test") {
102 RunnableKind::Test {
103 name: name.to_string()
104 }
105 } else {
106 return None;
107 };
108 Some(Runnable {
109 range: f.syntax().range(),
110 kind,
111 })
112 })
113 .collect()
114 }
81} 115}
82 116
83 117
diff --git a/libeditor/tests/test.rs b/libeditor/tests/test.rs
index e1c8aee4b..ab8254d16 100644
--- a/libeditor/tests/test.rs
+++ b/libeditor/tests/test.rs
@@ -37,11 +37,33 @@ fn main() {}
37 ); 37 );
38} 38}
39 39
40#[test]
41fn test_runnables() {
42 let file = file(r#"
43fn main() {}
44
45#[test]
46fn test_foo() {}
47
48#[test]
49#[ignore]
50fn test_foo() {}
51"#);
52 let runnables = file.runnables();
53 dbg_eq(
54 &runnables,
55 r#"[Runnable { range: [1; 13), kind: Bin },
56 Runnable { range: [15; 39), kind: Test { name: "test_foo" } },
57 Runnable { range: [41; 75), kind: Test { name: "test_foo" } }]"#,
58 )
59}
60
40fn file(text: &str) -> File { 61fn file(text: &str) -> File {
41 File::new(text) 62 File::new(text)
42} 63}
43 64
44fn dbg_eq(actual: &impl fmt::Debug, expected: &str) { 65fn dbg_eq(actual: &impl fmt::Debug, expected: &str) {
66 let actual = format!("{:?}", actual);
45 let expected = expected.lines().map(|l| l.trim()).join(" "); 67 let expected = expected.lines().map(|l| l.trim()).join(" ");
46 assert_eq!(actual, expected); 68 assert_eq!(actual, expected);
47} 69}