aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock19
-rw-r--r--crates/expect/Cargo.toml15
-rw-r--r--crates/expect/src/lib.rs356
-rw-r--r--crates/hir_def/Cargo.toml2
-rw-r--r--crates/hir_def/src/import_map.rs2
-rw-r--r--crates/hir_def/src/item_tree/tests.rs2
-rw-r--r--crates/hir_def/src/nameres/tests.rs2
-rw-r--r--crates/hir_ty/Cargo.toml3
-rw-r--r--crates/hir_ty/src/tests.rs2
-rw-r--r--crates/hir_ty/src/tests/coercion.rs2
-rw-r--r--crates/hir_ty/src/tests/macros.rs2
-rw-r--r--crates/hir_ty/src/tests/method_resolution.rs2
-rw-r--r--crates/hir_ty/src/tests/never_type.rs2
-rw-r--r--crates/hir_ty/src/tests/patterns.rs2
-rw-r--r--crates/hir_ty/src/tests/regression.rs2
-rw-r--r--crates/hir_ty/src/tests/simple.rs2
-rw-r--r--crates/hir_ty/src/tests/traits.rs2
-rw-r--r--crates/ide/Cargo.toml2
-rw-r--r--crates/ide/src/call_info.rs2
-rw-r--r--crates/ide/src/completion/complete_attribute.rs2
-rw-r--r--crates/ide/src/completion/complete_dot.rs2
-rw-r--r--crates/ide/src/completion/complete_fn_param.rs2
-rw-r--r--crates/ide/src/completion/complete_keyword.rs2
-rw-r--r--crates/ide/src/completion/complete_macro_in_item_position.rs2
-rw-r--r--crates/ide/src/completion/complete_pattern.rs2
-rw-r--r--crates/ide/src/completion/complete_postfix.rs2
-rw-r--r--crates/ide/src/completion/complete_qualified_path.rs2
-rw-r--r--crates/ide/src/completion/complete_record.rs2
-rw-r--r--crates/ide/src/completion/complete_snippet.rs2
-rw-r--r--crates/ide/src/completion/complete_trait_impl.rs2
-rw-r--r--crates/ide/src/completion/complete_unqualified_path.rs2
-rw-r--r--crates/ide/src/completion/presentation.rs2
-rw-r--r--crates/ide/src/diagnostics.rs2
-rw-r--r--crates/ide/src/display/navigation_target.rs2
-rw-r--r--crates/ide/src/expand_macro.rs2
-rw-r--r--crates/ide/src/file_structure.rs2
-rw-r--r--crates/ide/src/hover.rs2
-rw-r--r--crates/ide/src/inlay_hints.rs2
-rw-r--r--crates/ide/src/references/rename.rs2
-rw-r--r--crates/ide/src/runnables.rs2
-rw-r--r--crates/ide/src/syntax_highlighting/tests.rs2
-rw-r--r--crates/rust-analyzer/Cargo.toml2
-rw-r--r--crates/rust-analyzer/src/diagnostics/to_proto.rs2
-rw-r--r--crates/ssr/Cargo.toml2
-rw-r--r--crates/ssr/src/tests.rs2
-rw-r--r--crates/syntax/Cargo.toml2
-rw-r--r--crates/syntax/src/tests.rs2
47 files changed, 54 insertions, 425 deletions
diff --git a/Cargo.lock b/Cargo.lock
index bc9a989fe..ad7760d98 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -345,12 +345,13 @@ dependencies = [
345] 345]
346 346
347[[package]] 347[[package]]
348name = "expect" 348name = "expect-test"
349version = "0.0.0" 349version = "0.1.0"
350source = "registry+https://github.com/rust-lang/crates.io-index"
351checksum = "a3e383741ea1982866572109d1a8c807bd36aad91fca701489fdca56ef92b3b8"
350dependencies = [ 352dependencies = [
351 "difference", 353 "difference",
352 "once_cell", 354 "once_cell",
353 "stdx",
354] 355]
355 356
356[[package]] 357[[package]]
@@ -508,7 +509,7 @@ dependencies = [
508 "cfg", 509 "cfg",
509 "drop_bomb", 510 "drop_bomb",
510 "either", 511 "either",
511 "expect", 512 "expect-test",
512 "fst", 513 "fst",
513 "hir_expand", 514 "hir_expand",
514 "indexmap", 515 "indexmap",
@@ -553,7 +554,7 @@ dependencies = [
553 "chalk-recursive", 554 "chalk-recursive",
554 "chalk-solve", 555 "chalk-solve",
555 "ena", 556 "ena",
556 "expect", 557 "expect-test",
557 "hir_def", 558 "hir_def",
558 "hir_expand", 559 "hir_expand",
559 "itertools", 560 "itertools",
@@ -587,7 +588,7 @@ dependencies = [
587 "base_db", 588 "base_db",
588 "cfg", 589 "cfg",
589 "either", 590 "either",
590 "expect", 591 "expect-test",
591 "hir", 592 "hir",
592 "ide_db", 593 "ide_db",
593 "indexmap", 594 "indexmap",
@@ -1225,7 +1226,7 @@ dependencies = [
1225 "cfg", 1226 "cfg",
1226 "crossbeam-channel", 1227 "crossbeam-channel",
1227 "env_logger", 1228 "env_logger",
1228 "expect", 1229 "expect-test",
1229 "flycheck", 1230 "flycheck",
1230 "hir", 1231 "hir",
1231 "hir_def", 1232 "hir_def",
@@ -1452,7 +1453,7 @@ name = "ssr"
1452version = "0.0.0" 1453version = "0.0.0"
1453dependencies = [ 1454dependencies = [
1454 "base_db", 1455 "base_db",
1455 "expect", 1456 "expect-test",
1456 "hir", 1457 "hir",
1457 "ide_db", 1458 "ide_db",
1458 "itertools", 1459 "itertools",
@@ -1494,7 +1495,7 @@ name = "syntax"
1494version = "0.0.0" 1495version = "0.0.0"
1495dependencies = [ 1496dependencies = [
1496 "arrayvec", 1497 "arrayvec",
1497 "expect", 1498 "expect-test",
1498 "itertools", 1499 "itertools",
1499 "once_cell", 1500 "once_cell",
1500 "parser", 1501 "parser",
diff --git a/crates/expect/Cargo.toml b/crates/expect/Cargo.toml
deleted file mode 100644
index b54d3a60e..000000000
--- a/crates/expect/Cargo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
1[package]
2name = "expect"
3version = "0.0.0"
4license = "MIT OR Apache-2.0"
5authors = ["rust-analyzer developers"]
6edition = "2018"
7
8[lib]
9doctest = false
10
11[dependencies]
12once_cell = "1"
13difference = "2"
14
15stdx = { path = "../stdx" }
diff --git a/crates/expect/src/lib.rs b/crates/expect/src/lib.rs
deleted file mode 100644
index bd83895f7..000000000
--- a/crates/expect/src/lib.rs
+++ /dev/null
@@ -1,356 +0,0 @@
1//! Snapshot testing library, see
2//! https://github.com/rust-analyzer/rust-analyzer/pull/5101
3use std::{
4 collections::HashMap,
5 env, fmt, fs, mem,
6 ops::Range,
7 panic,
8 path::{Path, PathBuf},
9 sync::Mutex,
10};
11
12use difference::Changeset;
13use once_cell::sync::Lazy;
14use stdx::{lines_with_ends, trim_indent};
15
16const HELP: &str = "
17You can update all `expect![[]]` tests by running:
18
19 env UPDATE_EXPECT=1 cargo test
20
21To update a single test, place the cursor on `expect` token and use `run` feature of rust-analyzer.
22";
23
24fn update_expect() -> bool {
25 env::var("UPDATE_EXPECT").is_ok()
26}
27
28/// expect![[r#"inline snapshot"#]]
29#[macro_export]
30macro_rules! expect {
31 [[$data:literal]] => {$crate::Expect {
32 position: $crate::Position {
33 file: file!(),
34 line: line!(),
35 column: column!(),
36 },
37 data: $data,
38 }};
39 [[]] => { $crate::expect![[""]] };
40}
41
42/// expect_file!["/crates/foo/test_data/bar.html"]
43#[macro_export]
44macro_rules! expect_file {
45 [$path:expr] => {$crate::ExpectFile {
46 path: std::path::PathBuf::from($path)
47 }};
48}
49
50#[derive(Debug)]
51pub struct Expect {
52 pub position: Position,
53 pub data: &'static str,
54}
55
56#[derive(Debug)]
57pub struct ExpectFile {
58 pub path: PathBuf,
59}
60
61#[derive(Debug)]
62pub struct Position {
63 pub file: &'static str,
64 pub line: u32,
65 pub column: u32,
66}
67
68impl fmt::Display for Position {
69 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
70 write!(f, "{}:{}:{}", self.file, self.line, self.column)
71 }
72}
73
74impl Expect {
75 pub fn assert_eq(&self, actual: &str) {
76 let trimmed = self.trimmed();
77 if trimmed == actual {
78 return;
79 }
80 Runtime::fail_expect(self, &trimmed, actual);
81 }
82 pub fn assert_debug_eq(&self, actual: &impl fmt::Debug) {
83 let actual = format!("{:#?}\n", actual);
84 self.assert_eq(&actual)
85 }
86
87 fn trimmed(&self) -> String {
88 if !self.data.contains('\n') {
89 return self.data.to_string();
90 }
91 trim_indent(self.data)
92 }
93
94 fn locate(&self, file: &str) -> Location {
95 let mut target_line = None;
96 let mut line_start = 0;
97 for (i, line) in lines_with_ends(file).enumerate() {
98 if i == self.position.line as usize - 1 {
99 let pat = "expect![[";
100 let offset = line.find(pat).unwrap();
101 let literal_start = line_start + offset + pat.len();
102 let indent = line.chars().take_while(|&it| it == ' ').count();
103 target_line = Some((literal_start, indent));
104 break;
105 }
106 line_start += line.len();
107 }
108 let (literal_start, line_indent) = target_line.unwrap();
109 let literal_length =
110 file[literal_start..].find("]]").expect("Couldn't find matching `]]` for `expect![[`.");
111 let literal_range = literal_start..literal_start + literal_length;
112 Location { line_indent, literal_range }
113 }
114}
115
116impl ExpectFile {
117 pub fn assert_eq(&self, actual: &str) {
118 let expected = self.read();
119 if actual == expected {
120 return;
121 }
122 Runtime::fail_file(self, &expected, actual);
123 }
124 pub fn assert_debug_eq(&self, actual: &impl fmt::Debug) {
125 let actual = format!("{:#?}\n", actual);
126 self.assert_eq(&actual)
127 }
128 fn read(&self) -> String {
129 fs::read_to_string(self.abs_path()).unwrap_or_default().replace("\r\n", "\n")
130 }
131 fn write(&self, contents: &str) {
132 fs::write(self.abs_path(), contents).unwrap()
133 }
134 fn abs_path(&self) -> PathBuf {
135 WORKSPACE_ROOT.join(&self.path)
136 }
137}
138
139#[derive(Default)]
140struct Runtime {
141 help_printed: bool,
142 per_file: HashMap<&'static str, FileRuntime>,
143}
144static RT: Lazy<Mutex<Runtime>> = Lazy::new(Default::default);
145
146impl Runtime {
147 fn fail_expect(expect: &Expect, expected: &str, actual: &str) {
148 let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner());
149 if update_expect() {
150 println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.position);
151 rt.per_file
152 .entry(expect.position.file)
153 .or_insert_with(|| FileRuntime::new(expect))
154 .update(expect, actual);
155 return;
156 }
157 rt.panic(expect.position.to_string(), expected, actual);
158 }
159
160 fn fail_file(expect: &ExpectFile, expected: &str, actual: &str) {
161 let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner());
162 if update_expect() {
163 println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.path.display());
164 expect.write(actual);
165 return;
166 }
167 rt.panic(expect.path.display().to_string(), expected, actual);
168 }
169
170 fn panic(&mut self, position: String, expected: &str, actual: &str) {
171 let print_help = !mem::replace(&mut self.help_printed, true);
172 let help = if print_help { HELP } else { "" };
173
174 let diff = Changeset::new(actual, expected, "\n");
175
176 println!(
177 "\n
178\x1b[1m\x1b[91merror\x1b[97m: expect test failed\x1b[0m
179 \x1b[1m\x1b[34m-->\x1b[0m {}
180{}
181\x1b[1mExpect\x1b[0m:
182----
183{}
184----
185
186\x1b[1mActual\x1b[0m:
187----
188{}
189----
190
191\x1b[1mDiff\x1b[0m:
192----
193{}
194----
195",
196 position, help, expected, actual, diff
197 );
198 // Use resume_unwind instead of panic!() to prevent a backtrace, which is unnecessary noise.
199 panic::resume_unwind(Box::new(()));
200 }
201}
202
203struct FileRuntime {
204 path: PathBuf,
205 original_text: String,
206 patchwork: Patchwork,
207}
208
209impl FileRuntime {
210 fn new(expect: &Expect) -> FileRuntime {
211 let path = WORKSPACE_ROOT.join(expect.position.file);
212 let original_text = fs::read_to_string(&path).unwrap();
213 let patchwork = Patchwork::new(original_text.clone());
214 FileRuntime { path, original_text, patchwork }
215 }
216 fn update(&mut self, expect: &Expect, actual: &str) {
217 let loc = expect.locate(&self.original_text);
218 let patch = format_patch(loc.line_indent.clone(), actual);
219 self.patchwork.patch(loc.literal_range, &patch);
220 fs::write(&self.path, &self.patchwork.text).unwrap()
221 }
222}
223
224#[derive(Debug)]
225struct Location {
226 line_indent: usize,
227 literal_range: Range<usize>,
228}
229
230#[derive(Debug)]
231struct Patchwork {
232 text: String,
233 indels: Vec<(Range<usize>, usize)>,
234}
235
236impl Patchwork {
237 fn new(text: String) -> Patchwork {
238 Patchwork { text, indels: Vec::new() }
239 }
240 fn patch(&mut self, mut range: Range<usize>, patch: &str) {
241 self.indels.push((range.clone(), patch.len()));
242 self.indels.sort_by_key(|(delete, _insert)| delete.start);
243
244 let (delete, insert) = self
245 .indels
246 .iter()
247 .take_while(|(delete, _)| delete.start < range.start)
248 .map(|(delete, insert)| (delete.end - delete.start, insert))
249 .fold((0usize, 0usize), |(x1, y1), (x2, y2)| (x1 + x2, y1 + y2));
250
251 for pos in &mut [&mut range.start, &mut range.end] {
252 **pos -= delete;
253 **pos += insert;
254 }
255
256 self.text.replace_range(range, &patch);
257 }
258}
259
260fn format_patch(line_indent: usize, patch: &str) -> String {
261 let mut max_hashes = 0;
262 let mut cur_hashes = 0;
263 for byte in patch.bytes() {
264 if byte != b'#' {
265 cur_hashes = 0;
266 continue;
267 }
268 cur_hashes += 1;
269 max_hashes = max_hashes.max(cur_hashes);
270 }
271 let hashes = &"#".repeat(max_hashes + 1);
272 let indent = &" ".repeat(line_indent);
273 let is_multiline = patch.contains('\n');
274
275 let mut buf = String::new();
276 buf.push('r');
277 buf.push_str(hashes);
278 buf.push('"');
279 if is_multiline {
280 buf.push('\n');
281 }
282 let mut final_newline = false;
283 for line in lines_with_ends(patch) {
284 if is_multiline && !line.trim().is_empty() {
285 buf.push_str(indent);
286 buf.push_str(" ");
287 }
288 buf.push_str(line);
289 final_newline = line.ends_with('\n');
290 }
291 if final_newline {
292 buf.push_str(indent);
293 }
294 buf.push('"');
295 buf.push_str(hashes);
296 buf
297}
298
299static WORKSPACE_ROOT: Lazy<PathBuf> = Lazy::new(|| {
300 let my_manifest =
301 env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned());
302 // Heuristic, see https://github.com/rust-lang/cargo/issues/3946
303 Path::new(&my_manifest)
304 .ancestors()
305 .filter(|it| it.join("Cargo.toml").exists())
306 .last()
307 .unwrap()
308 .to_path_buf()
309});
310
311#[cfg(test)]
312mod tests {
313 use super::*;
314
315 #[test]
316 fn test_format_patch() {
317 let patch = format_patch(0, "hello\nworld\n");
318 expect![[r##"
319 r#"
320 hello
321 world
322 "#"##]]
323 .assert_eq(&patch);
324
325 let patch = format_patch(4, "single line");
326 expect![[r##"r#"single line"#"##]].assert_eq(&patch);
327 }
328
329 #[test]
330 fn test_patchwork() {
331 let mut patchwork = Patchwork::new("one two three".to_string());
332 patchwork.patch(4..7, "zwei");
333 patchwork.patch(0..3, "один");
334 patchwork.patch(8..13, "3");
335 expect![[r#"
336 Patchwork {
337 text: "один zwei 3",
338 indels: [
339 (
340 0..3,
341 8,
342 ),
343 (
344 4..7,
345 4,
346 ),
347 (
348 8..13,
349 1,
350 ),
351 ],
352 }
353 "#]]
354 .assert_debug_eq(&patchwork);
355 }
356}
diff --git a/crates/hir_def/Cargo.toml b/crates/hir_def/Cargo.toml
index 403bc2aff..57745322f 100644
--- a/crates/hir_def/Cargo.toml
+++ b/crates/hir_def/Cargo.toml
@@ -32,4 +32,4 @@ cfg = { path = "../cfg" }
32tt = { path = "../tt" } 32tt = { path = "../tt" }
33 33
34[dev-dependencies] 34[dev-dependencies]
35expect = { path = "../expect" } 35expect-test = "0.1"
diff --git a/crates/hir_def/src/import_map.rs b/crates/hir_def/src/import_map.rs
index d32a0bdaf..a442fb63a 100644
--- a/crates/hir_def/src/import_map.rs
+++ b/crates/hir_def/src/import_map.rs
@@ -328,7 +328,7 @@ pub fn search_dependencies<'a>(
328#[cfg(test)] 328#[cfg(test)]
329mod tests { 329mod tests {
330 use base_db::{fixture::WithFixture, SourceDatabase, Upcast}; 330 use base_db::{fixture::WithFixture, SourceDatabase, Upcast};
331 use expect::{expect, Expect}; 331 use expect_test::{expect, Expect};
332 332
333 use crate::{test_db::TestDB, AssocContainerId, Lookup}; 333 use crate::{test_db::TestDB, AssocContainerId, Lookup};
334 334
diff --git a/crates/hir_def/src/item_tree/tests.rs b/crates/hir_def/src/item_tree/tests.rs
index 9c5bf72bd..620e697d4 100644
--- a/crates/hir_def/src/item_tree/tests.rs
+++ b/crates/hir_def/src/item_tree/tests.rs
@@ -1,5 +1,5 @@
1use base_db::fixture::WithFixture; 1use base_db::fixture::WithFixture;
2use expect::{expect, Expect}; 2use expect_test::{expect, Expect};
3use hir_expand::{db::AstDatabase, HirFileId, InFile}; 3use hir_expand::{db::AstDatabase, HirFileId, InFile};
4use rustc_hash::FxHashSet; 4use rustc_hash::FxHashSet;
5use std::sync::Arc; 5use std::sync::Arc;
diff --git a/crates/hir_def/src/nameres/tests.rs b/crates/hir_def/src/nameres/tests.rs
index b105d56b2..8aaf7a158 100644
--- a/crates/hir_def/src/nameres/tests.rs
+++ b/crates/hir_def/src/nameres/tests.rs
@@ -7,7 +7,7 @@ mod primitives;
7use std::sync::Arc; 7use std::sync::Arc;
8 8
9use base_db::{fixture::WithFixture, SourceDatabase}; 9use base_db::{fixture::WithFixture, SourceDatabase};
10use expect::{expect, Expect}; 10use expect_test::{expect, Expect};
11use test_utils::mark; 11use test_utils::mark;
12 12
13use crate::{db::DefDatabase, nameres::*, test_db::TestDB}; 13use crate::{db::DefDatabase, nameres::*, test_db::TestDB};
diff --git a/crates/hir_ty/Cargo.toml b/crates/hir_ty/Cargo.toml
index a319b0ce8..06da0d0ec 100644
--- a/crates/hir_ty/Cargo.toml
+++ b/crates/hir_ty/Cargo.toml
@@ -30,8 +30,7 @@ syntax = { path = "../syntax" }
30test_utils = { path = "../test_utils" } 30test_utils = { path = "../test_utils" }
31 31
32[dev-dependencies] 32[dev-dependencies]
33expect-test = "0.1"
33tracing = "0.1" 34tracing = "0.1"
34tracing-subscriber = { version = "0.2", default-features = false, features = ["env-filter", "registry"] } 35tracing-subscriber = { version = "0.2", default-features = false, features = ["env-filter", "registry"] }
35tracing-tree = { version = "0.1.4" } 36tracing-tree = { version = "0.1.4" }
36
37expect = { path = "../expect" }
diff --git a/crates/hir_ty/src/tests.rs b/crates/hir_ty/src/tests.rs
index 91c9d38c5..0445efc9e 100644
--- a/crates/hir_ty/src/tests.rs
+++ b/crates/hir_ty/src/tests.rs
@@ -11,7 +11,7 @@ mod display_source_code;
11use std::{env, sync::Arc}; 11use std::{env, sync::Arc};
12 12
13use base_db::{fixture::WithFixture, FileRange, SourceDatabase, SourceDatabaseExt}; 13use base_db::{fixture::WithFixture, FileRange, SourceDatabase, SourceDatabaseExt};
14use expect::Expect; 14use expect_test::Expect;
15use hir_def::{ 15use hir_def::{
16 body::{BodySourceMap, SyntheticSyntax}, 16 body::{BodySourceMap, SyntheticSyntax},
17 child_by_source::ChildBySource, 17 child_by_source::ChildBySource,
diff --git a/crates/hir_ty/src/tests/coercion.rs b/crates/hir_ty/src/tests/coercion.rs
index 17efd75cb..7bc6c79f3 100644
--- a/crates/hir_ty/src/tests/coercion.rs
+++ b/crates/hir_ty/src/tests/coercion.rs
@@ -1,4 +1,4 @@
1use expect::expect; 1use expect_test::expect;
2use test_utils::mark; 2use test_utils::mark;
3 3
4use super::{check_infer, check_infer_with_mismatches}; 4use super::{check_infer, check_infer_with_mismatches};
diff --git a/crates/hir_ty/src/tests/macros.rs b/crates/hir_ty/src/tests/macros.rs
index d887c7a79..597a195d0 100644
--- a/crates/hir_ty/src/tests/macros.rs
+++ b/crates/hir_ty/src/tests/macros.rs
@@ -1,6 +1,6 @@
1use std::fs; 1use std::fs;
2 2
3use expect::expect; 3use expect_test::expect;
4use test_utils::project_dir; 4use test_utils::project_dir;
5 5
6use super::{check_infer, check_types}; 6use super::{check_infer, check_types};
diff --git a/crates/hir_ty/src/tests/method_resolution.rs b/crates/hir_ty/src/tests/method_resolution.rs
index fa68355aa..23b2601e6 100644
--- a/crates/hir_ty/src/tests/method_resolution.rs
+++ b/crates/hir_ty/src/tests/method_resolution.rs
@@ -1,4 +1,4 @@
1use expect::expect; 1use expect_test::expect;
2 2
3use super::{check_infer, check_types}; 3use super::{check_infer, check_types};
4 4
diff --git a/crates/hir_ty/src/tests/never_type.rs b/crates/hir_ty/src/tests/never_type.rs
index 49538b572..335c474df 100644
--- a/crates/hir_ty/src/tests/never_type.rs
+++ b/crates/hir_ty/src/tests/never_type.rs
@@ -1,4 +1,4 @@
1use expect::expect; 1use expect_test::expect;
2 2
3use super::{check_infer_with_mismatches, check_types}; 3use super::{check_infer_with_mismatches, check_types};
4 4
diff --git a/crates/hir_ty/src/tests/patterns.rs b/crates/hir_ty/src/tests/patterns.rs
index 39fabf7eb..aeb191c79 100644
--- a/crates/hir_ty/src/tests/patterns.rs
+++ b/crates/hir_ty/src/tests/patterns.rs
@@ -1,4 +1,4 @@
1use expect::expect; 1use expect_test::expect;
2use test_utils::mark; 2use test_utils::mark;
3 3
4use super::{check_infer, check_infer_with_mismatches}; 4use super::{check_infer, check_infer_with_mismatches};
diff --git a/crates/hir_ty/src/tests/regression.rs b/crates/hir_ty/src/tests/regression.rs
index b9ab0f357..94d86b0d1 100644
--- a/crates/hir_ty/src/tests/regression.rs
+++ b/crates/hir_ty/src/tests/regression.rs
@@ -1,4 +1,4 @@
1use expect::expect; 1use expect_test::expect;
2use test_utils::mark; 2use test_utils::mark;
3 3
4use super::{check_infer, check_types}; 4use super::{check_infer, check_types};
diff --git a/crates/hir_ty/src/tests/simple.rs b/crates/hir_ty/src/tests/simple.rs
index 59eb59d5f..48db23a34 100644
--- a/crates/hir_ty/src/tests/simple.rs
+++ b/crates/hir_ty/src/tests/simple.rs
@@ -1,4 +1,4 @@
1use expect::expect; 1use expect_test::expect;
2 2
3use super::{check_infer, check_types}; 3use super::{check_infer, check_types};
4 4
diff --git a/crates/hir_ty/src/tests/traits.rs b/crates/hir_ty/src/tests/traits.rs
index 526e61caf..1f1056962 100644
--- a/crates/hir_ty/src/tests/traits.rs
+++ b/crates/hir_ty/src/tests/traits.rs
@@ -1,4 +1,4 @@
1use expect::expect; 1use expect_test::expect;
2use test_utils::mark; 2use test_utils::mark;
3 3
4use super::{check_infer, check_infer_with_mismatches, check_types}; 4use super::{check_infer, check_infer_with_mismatches, check_types};
diff --git a/crates/ide/Cargo.toml b/crates/ide/Cargo.toml
index e4b970c73..700944430 100644
--- a/crates/ide/Cargo.toml
+++ b/crates/ide/Cargo.toml
@@ -32,4 +32,4 @@ ssr = { path = "../ssr" }
32hir = { path = "../hir" } 32hir = { path = "../hir" }
33 33
34[dev-dependencies] 34[dev-dependencies]
35expect = { path = "../expect" } 35expect-test = "0.1"
diff --git a/crates/ide/src/call_info.rs b/crates/ide/src/call_info.rs
index 86abd2d8c..7e83a2381 100644
--- a/crates/ide/src/call_info.rs
+++ b/crates/ide/src/call_info.rs
@@ -229,7 +229,7 @@ impl FnCallNode {
229 229
230#[cfg(test)] 230#[cfg(test)]
231mod tests { 231mod tests {
232 use expect::{expect, Expect}; 232 use expect_test::{expect, Expect};
233 use test_utils::mark; 233 use test_utils::mark;
234 234
235 use crate::mock_analysis::analysis_and_position; 235 use crate::mock_analysis::analysis_and_position;
diff --git a/crates/ide/src/completion/complete_attribute.rs b/crates/ide/src/completion/complete_attribute.rs
index 042c3ecef..0abfaebcb 100644
--- a/crates/ide/src/completion/complete_attribute.rs
+++ b/crates/ide/src/completion/complete_attribute.rs
@@ -383,7 +383,7 @@ const DEFAULT_LINT_COMPLETIONS: &[LintCompletion] = &[
383 383
384#[cfg(test)] 384#[cfg(test)]
385mod tests { 385mod tests {
386 use expect::{expect, Expect}; 386 use expect_test::{expect, Expect};
387 387
388 use crate::completion::{test_utils::completion_list, CompletionKind}; 388 use crate::completion::{test_utils::completion_list, CompletionKind};
389 389
diff --git a/crates/ide/src/completion/complete_dot.rs b/crates/ide/src/completion/complete_dot.rs
index 5488db43f..0b9f1798a 100644
--- a/crates/ide/src/completion/complete_dot.rs
+++ b/crates/ide/src/completion/complete_dot.rs
@@ -61,7 +61,7 @@ fn complete_methods(acc: &mut Completions, ctx: &CompletionContext, receiver: &T
61 61
62#[cfg(test)] 62#[cfg(test)]
63mod tests { 63mod tests {
64 use expect::{expect, Expect}; 64 use expect_test::{expect, Expect};
65 use test_utils::mark; 65 use test_utils::mark;
66 66
67 use crate::completion::{test_utils::completion_list, CompletionKind}; 67 use crate::completion::{test_utils::completion_list, CompletionKind};
diff --git a/crates/ide/src/completion/complete_fn_param.rs b/crates/ide/src/completion/complete_fn_param.rs
index 7c63ce58f..9efe25461 100644
--- a/crates/ide/src/completion/complete_fn_param.rs
+++ b/crates/ide/src/completion/complete_fn_param.rs
@@ -66,7 +66,7 @@ pub(super) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
66 66
67#[cfg(test)] 67#[cfg(test)]
68mod tests { 68mod tests {
69 use expect::{expect, Expect}; 69 use expect_test::{expect, Expect};
70 70
71 use crate::completion::{test_utils::completion_list, CompletionKind}; 71 use crate::completion::{test_utils::completion_list, CompletionKind};
72 72
diff --git a/crates/ide/src/completion/complete_keyword.rs b/crates/ide/src/completion/complete_keyword.rs
index 22ada3cf2..95e4ff1ac 100644
--- a/crates/ide/src/completion/complete_keyword.rs
+++ b/crates/ide/src/completion/complete_keyword.rs
@@ -174,7 +174,7 @@ fn complete_return(
174 174
175#[cfg(test)] 175#[cfg(test)]
176mod tests { 176mod tests {
177 use expect::{expect, Expect}; 177 use expect_test::{expect, Expect};
178 178
179 use crate::completion::{ 179 use crate::completion::{
180 test_utils::{check_edit, completion_list}, 180 test_utils::{check_edit, completion_list},
diff --git a/crates/ide/src/completion/complete_macro_in_item_position.rs b/crates/ide/src/completion/complete_macro_in_item_position.rs
index 0447f0511..fc8625d8e 100644
--- a/crates/ide/src/completion/complete_macro_in_item_position.rs
+++ b/crates/ide/src/completion/complete_macro_in_item_position.rs
@@ -15,7 +15,7 @@ pub(super) fn complete_macro_in_item_position(acc: &mut Completions, ctx: &Compl
15 15
16#[cfg(test)] 16#[cfg(test)]
17mod tests { 17mod tests {
18 use expect::{expect, Expect}; 18 use expect_test::{expect, Expect};
19 19
20 use crate::completion::{test_utils::completion_list, CompletionKind}; 20 use crate::completion::{test_utils::completion_list, CompletionKind};
21 21
diff --git a/crates/ide/src/completion/complete_pattern.rs b/crates/ide/src/completion/complete_pattern.rs
index aceb77cb5..5a13574d4 100644
--- a/crates/ide/src/completion/complete_pattern.rs
+++ b/crates/ide/src/completion/complete_pattern.rs
@@ -33,7 +33,7 @@ pub(super) fn complete_pattern(acc: &mut Completions, ctx: &CompletionContext) {
33 33
34#[cfg(test)] 34#[cfg(test)]
35mod tests { 35mod tests {
36 use expect::{expect, Expect}; 36 use expect_test::{expect, Expect};
37 37
38 use crate::completion::{test_utils::completion_list, CompletionKind}; 38 use crate::completion::{test_utils::completion_list, CompletionKind};
39 39
diff --git a/crates/ide/src/completion/complete_postfix.rs b/crates/ide/src/completion/complete_postfix.rs
index d50b13c52..84c4e129d 100644
--- a/crates/ide/src/completion/complete_postfix.rs
+++ b/crates/ide/src/completion/complete_postfix.rs
@@ -238,7 +238,7 @@ fn postfix_snippet(
238 238
239#[cfg(test)] 239#[cfg(test)]
240mod tests { 240mod tests {
241 use expect::{expect, Expect}; 241 use expect_test::{expect, Expect};
242 242
243 use crate::completion::{ 243 use crate::completion::{
244 test_utils::{check_edit, completion_list}, 244 test_utils::{check_edit, completion_list},
diff --git a/crates/ide/src/completion/complete_qualified_path.rs b/crates/ide/src/completion/complete_qualified_path.rs
index 74794dc88..accb09f7e 100644
--- a/crates/ide/src/completion/complete_qualified_path.rs
+++ b/crates/ide/src/completion/complete_qualified_path.rs
@@ -146,7 +146,7 @@ pub(super) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
146 146
147#[cfg(test)] 147#[cfg(test)]
148mod tests { 148mod tests {
149 use expect::{expect, Expect}; 149 use expect_test::{expect, Expect};
150 use test_utils::mark; 150 use test_utils::mark;
151 151
152 use crate::completion::{ 152 use crate::completion::{
diff --git a/crates/ide/src/completion/complete_record.rs b/crates/ide/src/completion/complete_record.rs
index 74b94594d..ceb8d16c1 100644
--- a/crates/ide/src/completion/complete_record.rs
+++ b/crates/ide/src/completion/complete_record.rs
@@ -18,7 +18,7 @@ pub(super) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) ->
18 18
19#[cfg(test)] 19#[cfg(test)]
20mod tests { 20mod tests {
21 use expect::{expect, Expect}; 21 use expect_test::{expect, Expect};
22 22
23 use crate::completion::{test_utils::completion_list, CompletionKind}; 23 use crate::completion::{test_utils::completion_list, CompletionKind};
24 24
diff --git a/crates/ide/src/completion/complete_snippet.rs b/crates/ide/src/completion/complete_snippet.rs
index 4368e4eec..c3b03b199 100644
--- a/crates/ide/src/completion/complete_snippet.rs
+++ b/crates/ide/src/completion/complete_snippet.rs
@@ -70,7 +70,7 @@ fn ${1:feature}() {
70 70
71#[cfg(test)] 71#[cfg(test)]
72mod tests { 72mod tests {
73 use expect::{expect, Expect}; 73 use expect_test::{expect, Expect};
74 74
75 use crate::completion::{test_utils::completion_list, CompletionKind}; 75 use crate::completion::{test_utils::completion_list, CompletionKind};
76 76
diff --git a/crates/ide/src/completion/complete_trait_impl.rs b/crates/ide/src/completion/complete_trait_impl.rs
index d0d3a9f34..1a2b1e8a5 100644
--- a/crates/ide/src/completion/complete_trait_impl.rs
+++ b/crates/ide/src/completion/complete_trait_impl.rs
@@ -225,7 +225,7 @@ fn make_const_compl_syntax(const_: &ast::Const) -> String {
225 225
226#[cfg(test)] 226#[cfg(test)]
227mod tests { 227mod tests {
228 use expect::{expect, Expect}; 228 use expect_test::{expect, Expect};
229 229
230 use crate::completion::{ 230 use crate::completion::{
231 test_utils::{check_edit, completion_list}, 231 test_utils::{check_edit, completion_list},
diff --git a/crates/ide/src/completion/complete_unqualified_path.rs b/crates/ide/src/completion/complete_unqualified_path.rs
index 824227f31..1f1b682a7 100644
--- a/crates/ide/src/completion/complete_unqualified_path.rs
+++ b/crates/ide/src/completion/complete_unqualified_path.rs
@@ -64,7 +64,7 @@ fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &T
64 64
65#[cfg(test)] 65#[cfg(test)]
66mod tests { 66mod tests {
67 use expect::{expect, Expect}; 67 use expect_test::{expect, Expect};
68 use test_utils::mark; 68 use test_utils::mark;
69 69
70 use crate::completion::{ 70 use crate::completion::{
diff --git a/crates/ide/src/completion/presentation.rs b/crates/ide/src/completion/presentation.rs
index a73f8ab0b..3371aed2d 100644
--- a/crates/ide/src/completion/presentation.rs
+++ b/crates/ide/src/completion/presentation.rs
@@ -464,7 +464,7 @@ fn guess_macro_braces(macro_name: &str, docs: &str) -> (&'static str, &'static s
464mod tests { 464mod tests {
465 use std::cmp::Reverse; 465 use std::cmp::Reverse;
466 466
467 use expect::{expect, Expect}; 467 use expect_test::{expect, Expect};
468 use test_utils::mark; 468 use test_utils::mark;
469 469
470 use crate::{ 470 use crate::{
diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs
index 92b5adaa2..b2b972b02 100644
--- a/crates/ide/src/diagnostics.rs
+++ b/crates/ide/src/diagnostics.rs
@@ -214,7 +214,7 @@ fn check_struct_shorthand_initialization(
214 214
215#[cfg(test)] 215#[cfg(test)]
216mod tests { 216mod tests {
217 use expect::{expect, Expect}; 217 use expect_test::{expect, Expect};
218 use stdx::trim_indent; 218 use stdx::trim_indent;
219 use test_utils::assert_eq_text; 219 use test_utils::assert_eq_text;
220 220
diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs
index e77106177..1ee80c2dd 100644
--- a/crates/ide/src/display/navigation_target.rs
+++ b/crates/ide/src/display/navigation_target.rs
@@ -421,7 +421,7 @@ pub(crate) fn description_from_symbol(db: &RootDatabase, symbol: &FileSymbol) ->
421 421
422#[cfg(test)] 422#[cfg(test)]
423mod tests { 423mod tests {
424 use expect::expect; 424 use expect_test::expect;
425 425
426 use crate::{mock_analysis::single_file, Query}; 426 use crate::{mock_analysis::single_file, Query};
427 427
diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs
index 31455709d..8a285bcf7 100644
--- a/crates/ide/src/expand_macro.rs
+++ b/crates/ide/src/expand_macro.rs
@@ -120,7 +120,7 @@ fn insert_whitespaces(syn: SyntaxNode) -> String {
120 120
121#[cfg(test)] 121#[cfg(test)]
122mod tests { 122mod tests {
123 use expect::{expect, Expect}; 123 use expect_test::{expect, Expect};
124 124
125 use crate::mock_analysis::analysis_and_position; 125 use crate::mock_analysis::analysis_and_position;
126 126
diff --git a/crates/ide/src/file_structure.rs b/crates/ide/src/file_structure.rs
index c90247ba6..6168fb837 100644
--- a/crates/ide/src/file_structure.rs
+++ b/crates/ide/src/file_structure.rs
@@ -164,7 +164,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
164 164
165#[cfg(test)] 165#[cfg(test)]
166mod tests { 166mod tests {
167 use expect::{expect, Expect}; 167 use expect_test::{expect, Expect};
168 168
169 use super::*; 169 use super::*;
170 170
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index 300c00edc..c75b2a510 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -353,7 +353,7 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
353#[cfg(test)] 353#[cfg(test)]
354mod tests { 354mod tests {
355 use base_db::FileLoader; 355 use base_db::FileLoader;
356 use expect::{expect, Expect}; 356 use expect_test::{expect, Expect};
357 357
358 use crate::mock_analysis::analysis_and_position; 358 use crate::mock_analysis::analysis_and_position;
359 359
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs
index 596bc872d..583f39d85 100644
--- a/crates/ide/src/inlay_hints.rs
+++ b/crates/ide/src/inlay_hints.rs
@@ -336,7 +336,7 @@ fn get_callable(sema: &Semantics<RootDatabase>, expr: &ast::Expr) -> Option<Call
336 336
337#[cfg(test)] 337#[cfg(test)]
338mod tests { 338mod tests {
339 use expect::{expect, Expect}; 339 use expect_test::{expect, Expect};
340 use test_utils::extract_annotations; 340 use test_utils::extract_annotations;
341 341
342 use crate::{inlay_hints::InlayHintsConfig, mock_analysis::single_file}; 342 use crate::{inlay_hints::InlayHintsConfig, mock_analysis::single_file};
diff --git a/crates/ide/src/references/rename.rs b/crates/ide/src/references/rename.rs
index d73dc9cd0..301629763 100644
--- a/crates/ide/src/references/rename.rs
+++ b/crates/ide/src/references/rename.rs
@@ -270,7 +270,7 @@ fn rename_reference(
270 270
271#[cfg(test)] 271#[cfg(test)]
272mod tests { 272mod tests {
273 use expect::{expect, Expect}; 273 use expect_test::{expect, Expect};
274 use stdx::trim_indent; 274 use stdx::trim_indent;
275 use test_utils::{assert_eq_text, mark}; 275 use test_utils::{assert_eq_text, mark};
276 use text_edit::TextEdit; 276 use text_edit::TextEdit;
diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs
index c3e07c8de..4139f329e 100644
--- a/crates/ide/src/runnables.rs
+++ b/crates/ide/src/runnables.rs
@@ -268,7 +268,7 @@ fn has_test_function_or_multiple_test_submodules(module: &ast::Module) -> bool {
268 268
269#[cfg(test)] 269#[cfg(test)]
270mod tests { 270mod tests {
271 use expect::{expect, Expect}; 271 use expect_test::{expect, Expect};
272 272
273 use crate::mock_analysis::analysis_and_position; 273 use crate::mock_analysis::analysis_and_position;
274 274
diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs
index ccb76f552..1c3fea058 100644
--- a/crates/ide/src/syntax_highlighting/tests.rs
+++ b/crates/ide/src/syntax_highlighting/tests.rs
@@ -1,6 +1,6 @@
1use std::fs; 1use std::fs;
2 2
3use expect::{expect_file, ExpectFile}; 3use expect_test::{expect_file, ExpectFile};
4use test_utils::project_dir; 4use test_utils::project_dir;
5 5
6use crate::{mock_analysis::single_file, FileRange, TextRange}; 6use crate::{mock_analysis::single_file, FileRange, TextRange};
diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml
index c7c1eda0f..068a961dc 100644
--- a/crates/rust-analyzer/Cargo.toml
+++ b/crates/rust-analyzer/Cargo.toml
@@ -57,7 +57,7 @@ proc_macro_srv = { path = "../proc_macro_srv" }
57winapi = "0.3.8" 57winapi = "0.3.8"
58 58
59[dev-dependencies] 59[dev-dependencies]
60expect = { path = "../expect" } 60expect-test = "0.1"
61test_utils = { path = "../test_utils" } 61test_utils = { path = "../test_utils" }
62mbe = { path = "../mbe" } 62mbe = { path = "../mbe" }
63tt = { path = "../tt" } 63tt = { path = "../tt" }
diff --git a/crates/rust-analyzer/src/diagnostics/to_proto.rs b/crates/rust-analyzer/src/diagnostics/to_proto.rs
index df5583897..e52b97913 100644
--- a/crates/rust-analyzer/src/diagnostics/to_proto.rs
+++ b/crates/rust-analyzer/src/diagnostics/to_proto.rs
@@ -256,7 +256,7 @@ pub(crate) fn map_rust_diagnostic_to_lsp(
256mod tests { 256mod tests {
257 use super::*; 257 use super::*;
258 258
259 use expect::{expect_file, ExpectFile}; 259 use expect_test::{expect_file, ExpectFile};
260 260
261 fn check(diagnostics_json: &str, expect: ExpectFile) { 261 fn check(diagnostics_json: &str, expect: ExpectFile) {
262 check_with_config(DiagnosticsMapConfig::default(), diagnostics_json, expect) 262 check_with_config(DiagnosticsMapConfig::default(), diagnostics_json, expect)
diff --git a/crates/ssr/Cargo.toml b/crates/ssr/Cargo.toml
index 7c2090de3..22b6af0fa 100644
--- a/crates/ssr/Cargo.toml
+++ b/crates/ssr/Cargo.toml
@@ -22,4 +22,4 @@ hir = { path = "../hir" }
22test_utils = { path = "../test_utils" } 22test_utils = { path = "../test_utils" }
23 23
24[dev-dependencies] 24[dev-dependencies]
25expect = { path = "../expect" } 25expect-test = "0.1"
diff --git a/crates/ssr/src/tests.rs b/crates/ssr/src/tests.rs
index e45c88864..20231a9bc 100644
--- a/crates/ssr/src/tests.rs
+++ b/crates/ssr/src/tests.rs
@@ -1,6 +1,6 @@
1use crate::{MatchFinder, SsrRule}; 1use crate::{MatchFinder, SsrRule};
2use base_db::{salsa::Durability, FileId, FilePosition, FileRange, SourceDatabaseExt}; 2use base_db::{salsa::Durability, FileId, FilePosition, FileRange, SourceDatabaseExt};
3use expect::{expect, Expect}; 3use expect_test::{expect, Expect};
4use rustc_hash::FxHashSet; 4use rustc_hash::FxHashSet;
5use std::sync::Arc; 5use std::sync::Arc;
6use test_utils::{mark, RangeOrOffset}; 6use test_utils::{mark, RangeOrOffset};
diff --git a/crates/syntax/Cargo.toml b/crates/syntax/Cargo.toml
index ec3132da8..6818f3ad8 100644
--- a/crates/syntax/Cargo.toml
+++ b/crates/syntax/Cargo.toml
@@ -30,6 +30,6 @@ parser = { path = "../parser" }
30[dev-dependencies] 30[dev-dependencies]
31walkdir = "2.3.1" 31walkdir = "2.3.1"
32rayon = "1" 32rayon = "1"
33expect-test = "0.1"
33 34
34test_utils = { path = "../test_utils" } 35test_utils = { path = "../test_utils" }
35expect = { path = "../expect" }
diff --git a/crates/syntax/src/tests.rs b/crates/syntax/src/tests.rs
index ddc718369..8c217dfe0 100644
--- a/crates/syntax/src/tests.rs
+++ b/crates/syntax/src/tests.rs
@@ -4,7 +4,7 @@ use std::{
4 path::{Path, PathBuf}, 4 path::{Path, PathBuf},
5}; 5};
6 6
7use expect::expect_file; 7use expect_test::expect_file;
8use rayon::prelude::*; 8use rayon::prelude::*;
9use test_utils::project_dir; 9use test_utils::project_dir;
10 10