aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_assists/src/doc_tests.rs39
-rw-r--r--crates/ra_assists/src/handlers/add_custom_impl.rs2
-rw-r--r--crates/ra_assists/src/handlers/add_derive.rs2
-rw-r--r--crates/ra_assists/src/handlers/add_explicit_type.rs2
-rw-r--r--crates/ra_assists/src/handlers/add_from_impl_for_enum.rs2
-rw-r--r--crates/ra_assists/src/handlers/add_function.rs2
-rw-r--r--crates/ra_assists/src/handlers/add_impl.rs2
-rw-r--r--crates/ra_assists/src/handlers/add_missing_impl_members.rs2
-rw-r--r--crates/ra_assists/src/handlers/add_new.rs2
-rw-r--r--crates/ra_assists/src/handlers/apply_demorgan.rs2
-rw-r--r--crates/ra_assists/src/handlers/auto_import.rs2
-rw-r--r--crates/ra_assists/src/handlers/change_visibility.rs2
-rw-r--r--crates/ra_assists/src/handlers/early_return.rs2
-rw-r--r--crates/ra_assists/src/handlers/fill_match_arms.rs2
-rw-r--r--crates/ra_assists/src/handlers/flip_binexpr.rs2
-rw-r--r--crates/ra_assists/src/handlers/flip_comma.rs2
-rw-r--r--crates/ra_assists/src/handlers/flip_trait_bound.rs2
-rw-r--r--crates/ra_assists/src/handlers/inline_local_variable.rs2
-rw-r--r--crates/ra_assists/src/handlers/introduce_variable.rs2
-rw-r--r--crates/ra_assists/src/handlers/invert_if.rs2
-rw-r--r--crates/ra_assists/src/handlers/merge_imports.rs2
-rw-r--r--crates/ra_assists/src/handlers/merge_match_arms.rs2
-rw-r--r--crates/ra_assists/src/handlers/move_bounds.rs2
-rw-r--r--crates/ra_assists/src/handlers/move_guard.rs2
-rw-r--r--crates/ra_assists/src/handlers/raw_string.rs2
-rw-r--r--crates/ra_assists/src/handlers/remove_dbg.rs2
-rw-r--r--crates/ra_assists/src/handlers/reorder_fields.rs2
-rw-r--r--crates/ra_assists/src/handlers/replace_if_let_with_match.rs2
-rw-r--r--crates/ra_assists/src/handlers/replace_let_with_if_let.rs2
-rw-r--r--crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs2
-rw-r--r--crates/ra_assists/src/handlers/replace_unwrap_with_match.rs2
-rw-r--r--crates/ra_assists/src/handlers/split_import.rs2
-rw-r--r--crates/ra_assists/src/handlers/unwrap_block.rs2
-rw-r--r--crates/ra_assists/src/lib.rs149
-rw-r--r--crates/ra_assists/src/tests.rs167
-rw-r--r--crates/ra_assists/src/tests/generated.rs (renamed from crates/ra_assists/src/doc_tests/generated.rs)76
-rw-r--r--xtask/src/codegen.rs2
-rw-r--r--xtask/src/codegen/gen_assists_docs.rs4
-rw-r--r--xtask/tests/tidy-tests/main.rs2
39 files changed, 242 insertions, 261 deletions
diff --git a/crates/ra_assists/src/doc_tests.rs b/crates/ra_assists/src/doc_tests.rs
deleted file mode 100644
index f627f31dc..000000000
--- a/crates/ra_assists/src/doc_tests.rs
+++ /dev/null
@@ -1,39 +0,0 @@
1//! Each assist definition has a special comment, which specifies docs and
2//! example.
3//!
4//! We collect all the example and write the as tests in this module.
5
6mod generated;
7
8use ra_db::FileRange;
9use test_utils::{assert_eq_text, extract_range_or_offset};
10
11use crate::resolved_assists;
12
13fn check(assist_id: &str, before: &str, after: &str) {
14 let (selection, before) = extract_range_or_offset(before);
15 let (db, file_id) = crate::helpers::with_single_file(&before);
16 let frange = FileRange { file_id, range: selection.into() };
17
18 let assist = resolved_assists(&db, frange)
19 .into_iter()
20 .find(|assist| assist.label.id.0 == assist_id)
21 .unwrap_or_else(|| {
22 panic!(
23 "\n\nAssist is not applicable: {}\nAvailable assists: {}",
24 assist_id,
25 resolved_assists(&db, frange)
26 .into_iter()
27 .map(|assist| assist.label.id.0)
28 .collect::<Vec<_>>()
29 .join(", ")
30 )
31 });
32
33 let actual = {
34 let mut actual = before.clone();
35 assist.action.edit.apply(&mut actual);
36 actual
37 };
38 assert_eq_text!(after, &actual);
39}
diff --git a/crates/ra_assists/src/handlers/add_custom_impl.rs b/crates/ra_assists/src/handlers/add_custom_impl.rs
index 4ea26a550..b72f7aeac 100644
--- a/crates/ra_assists/src/handlers/add_custom_impl.rs
+++ b/crates/ra_assists/src/handlers/add_custom_impl.rs
@@ -95,7 +95,7 @@ pub(crate) fn add_custom_impl(ctx: AssistCtx) -> Option<Assist> {
95 95
96#[cfg(test)] 96#[cfg(test)]
97mod tests { 97mod tests {
98 use crate::helpers::{check_assist, check_assist_not_applicable}; 98 use crate::tests::{check_assist, check_assist_not_applicable};
99 99
100 use super::*; 100 use super::*;
101 101
diff --git a/crates/ra_assists/src/handlers/add_derive.rs b/crates/ra_assists/src/handlers/add_derive.rs
index 6254eb7c4..3629dac6b 100644
--- a/crates/ra_assists/src/handlers/add_derive.rs
+++ b/crates/ra_assists/src/handlers/add_derive.rs
@@ -58,7 +58,7 @@ fn derive_insertion_offset(nominal: &ast::NominalDef) -> Option<TextSize> {
58#[cfg(test)] 58#[cfg(test)]
59mod tests { 59mod tests {
60 use super::*; 60 use super::*;
61 use crate::helpers::{check_assist, check_assist_target}; 61 use crate::tests::{check_assist, check_assist_target};
62 62
63 #[test] 63 #[test]
64 fn add_derive_new() { 64 fn add_derive_new() {
diff --git a/crates/ra_assists/src/handlers/add_explicit_type.rs b/crates/ra_assists/src/handlers/add_explicit_type.rs
index bc313782b..e39e1f4f3 100644
--- a/crates/ra_assists/src/handlers/add_explicit_type.rs
+++ b/crates/ra_assists/src/handlers/add_explicit_type.rs
@@ -77,7 +77,7 @@ pub(crate) fn add_explicit_type(ctx: AssistCtx) -> Option<Assist> {
77mod tests { 77mod tests {
78 use super::*; 78 use super::*;
79 79
80 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 80 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
81 81
82 #[test] 82 #[test]
83 fn add_explicit_type_target() { 83 fn add_explicit_type_target() {
diff --git a/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs b/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs
index 49deb6701..ee0d5ce98 100644
--- a/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs
+++ b/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs
@@ -97,7 +97,7 @@ fn existing_from_impl(
97mod tests { 97mod tests {
98 use super::*; 98 use super::*;
99 99
100 use crate::helpers::{check_assist, check_assist_not_applicable}; 100 use crate::tests::{check_assist, check_assist_not_applicable};
101 use test_utils::covers; 101 use test_utils::covers;
102 102
103 #[test] 103 #[test]
diff --git a/crates/ra_assists/src/handlers/add_function.rs b/crates/ra_assists/src/handlers/add_function.rs
index 6c7456579..cb2afc863 100644
--- a/crates/ra_assists/src/handlers/add_function.rs
+++ b/crates/ra_assists/src/handlers/add_function.rs
@@ -283,7 +283,7 @@ fn next_space_for_fn_in_module(
283 283
284#[cfg(test)] 284#[cfg(test)]
285mod tests { 285mod tests {
286 use crate::helpers::{check_assist, check_assist_not_applicable}; 286 use crate::tests::{check_assist, check_assist_not_applicable};
287 287
288 use super::*; 288 use super::*;
289 289
diff --git a/crates/ra_assists/src/handlers/add_impl.rs b/crates/ra_assists/src/handlers/add_impl.rs
index d26f8b93d..3d390c20b 100644
--- a/crates/ra_assists/src/handlers/add_impl.rs
+++ b/crates/ra_assists/src/handlers/add_impl.rs
@@ -60,7 +60,7 @@ pub(crate) fn add_impl(ctx: AssistCtx) -> Option<Assist> {
60#[cfg(test)] 60#[cfg(test)]
61mod tests { 61mod tests {
62 use super::*; 62 use super::*;
63 use crate::helpers::{check_assist, check_assist_target}; 63 use crate::tests::{check_assist, check_assist_target};
64 64
65 #[test] 65 #[test]
66 fn test_add_impl() { 66 fn test_add_impl() {
diff --git a/crates/ra_assists/src/handlers/add_missing_impl_members.rs b/crates/ra_assists/src/handlers/add_missing_impl_members.rs
index e47feda71..f7a101503 100644
--- a/crates/ra_assists/src/handlers/add_missing_impl_members.rs
+++ b/crates/ra_assists/src/handlers/add_missing_impl_members.rs
@@ -181,7 +181,7 @@ fn add_body(fn_def: ast::FnDef) -> ast::FnDef {
181 181
182#[cfg(test)] 182#[cfg(test)]
183mod tests { 183mod tests {
184 use crate::helpers::{check_assist, check_assist_not_applicable}; 184 use crate::tests::{check_assist, check_assist_not_applicable};
185 185
186 use super::*; 186 use super::*;
187 187
diff --git a/crates/ra_assists/src/handlers/add_new.rs b/crates/ra_assists/src/handlers/add_new.rs
index e8a36c7de..1b5d604d1 100644
--- a/crates/ra_assists/src/handlers/add_new.rs
+++ b/crates/ra_assists/src/handlers/add_new.rs
@@ -178,7 +178,7 @@ fn has_new_fn(imp: &ast::ImplDef) -> bool {
178 178
179#[cfg(test)] 179#[cfg(test)]
180mod tests { 180mod tests {
181 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 181 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
182 182
183 use super::*; 183 use super::*;
184 184
diff --git a/crates/ra_assists/src/handlers/apply_demorgan.rs b/crates/ra_assists/src/handlers/apply_demorgan.rs
index 260b9e073..a0c48d872 100644
--- a/crates/ra_assists/src/handlers/apply_demorgan.rs
+++ b/crates/ra_assists/src/handlers/apply_demorgan.rs
@@ -60,7 +60,7 @@ fn opposite_logic_op(kind: ast::BinOp) -> Option<&'static str> {
60mod tests { 60mod tests {
61 use super::*; 61 use super::*;
62 62
63 use crate::helpers::{check_assist, check_assist_not_applicable}; 63 use crate::tests::{check_assist, check_assist_not_applicable};
64 64
65 #[test] 65 #[test]
66 fn demorgan_turns_and_into_or() { 66 fn demorgan_turns_and_into_or() {
diff --git a/crates/ra_assists/src/handlers/auto_import.rs b/crates/ra_assists/src/handlers/auto_import.rs
index db6c4d2fa..9e4171ccd 100644
--- a/crates/ra_assists/src/handlers/auto_import.rs
+++ b/crates/ra_assists/src/handlers/auto_import.rs
@@ -277,7 +277,7 @@ impl ImportCandidate {
277#[cfg(test)] 277#[cfg(test)]
278mod tests { 278mod tests {
279 use super::*; 279 use super::*;
280 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 280 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
281 281
282 #[test] 282 #[test]
283 fn applicable_when_found_an_import() { 283 fn applicable_when_found_an_import() {
diff --git a/crates/ra_assists/src/handlers/change_visibility.rs b/crates/ra_assists/src/handlers/change_visibility.rs
index 1cd532e80..6ac1f8e69 100644
--- a/crates/ra_assists/src/handlers/change_visibility.rs
+++ b/crates/ra_assists/src/handlers/change_visibility.rs
@@ -110,7 +110,7 @@ fn change_vis(ctx: AssistCtx, vis: ast::Visibility) -> Option<Assist> {
110mod tests { 110mod tests {
111 use test_utils::covers; 111 use test_utils::covers;
112 112
113 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 113 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
114 114
115 use super::*; 115 use super::*;
116 116
diff --git a/crates/ra_assists/src/handlers/early_return.rs b/crates/ra_assists/src/handlers/early_return.rs
index eede2fe91..55ccc37b0 100644
--- a/crates/ra_assists/src/handlers/early_return.rs
+++ b/crates/ra_assists/src/handlers/early_return.rs
@@ -182,7 +182,7 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx) -> Option<Assist> {
182 182
183#[cfg(test)] 183#[cfg(test)]
184mod tests { 184mod tests {
185 use crate::helpers::{check_assist, check_assist_not_applicable}; 185 use crate::tests::{check_assist, check_assist_not_applicable};
186 186
187 use super::*; 187 use super::*;
188 188
diff --git a/crates/ra_assists/src/handlers/fill_match_arms.rs b/crates/ra_assists/src/handlers/fill_match_arms.rs
index 8d1af9933..1f9cd5585 100644
--- a/crates/ra_assists/src/handlers/fill_match_arms.rs
+++ b/crates/ra_assists/src/handlers/fill_match_arms.rs
@@ -168,7 +168,7 @@ fn build_pat(db: &RootDatabase, module: hir::Module, var: hir::EnumVariant) -> O
168 168
169#[cfg(test)] 169#[cfg(test)]
170mod tests { 170mod tests {
171 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 171 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
172 172
173 use super::fill_match_arms; 173 use super::fill_match_arms;
174 174
diff --git a/crates/ra_assists/src/handlers/flip_binexpr.rs b/crates/ra_assists/src/handlers/flip_binexpr.rs
index 8030efb35..41db963dc 100644
--- a/crates/ra_assists/src/handlers/flip_binexpr.rs
+++ b/crates/ra_assists/src/handlers/flip_binexpr.rs
@@ -69,7 +69,7 @@ impl From<BinOp> for FlipAction {
69mod tests { 69mod tests {
70 use super::*; 70 use super::*;
71 71
72 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 72 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
73 73
74 #[test] 74 #[test]
75 fn flip_binexpr_target_is_the_op() { 75 fn flip_binexpr_target_is_the_op() {
diff --git a/crates/ra_assists/src/handlers/flip_comma.rs b/crates/ra_assists/src/handlers/flip_comma.rs
index 1dacf29f8..e65c9a41d 100644
--- a/crates/ra_assists/src/handlers/flip_comma.rs
+++ b/crates/ra_assists/src/handlers/flip_comma.rs
@@ -39,7 +39,7 @@ pub(crate) fn flip_comma(ctx: AssistCtx) -> Option<Assist> {
39mod tests { 39mod tests {
40 use super::*; 40 use super::*;
41 41
42 use crate::helpers::{check_assist, check_assist_target}; 42 use crate::tests::{check_assist, check_assist_target};
43 43
44 #[test] 44 #[test]
45 fn flip_comma_works_for_function_parameters() { 45 fn flip_comma_works_for_function_parameters() {
diff --git a/crates/ra_assists/src/handlers/flip_trait_bound.rs b/crates/ra_assists/src/handlers/flip_trait_bound.rs
index f56769624..f186da585 100644
--- a/crates/ra_assists/src/handlers/flip_trait_bound.rs
+++ b/crates/ra_assists/src/handlers/flip_trait_bound.rs
@@ -43,7 +43,7 @@ pub(crate) fn flip_trait_bound(ctx: AssistCtx) -> Option<Assist> {
43mod tests { 43mod tests {
44 use super::*; 44 use super::*;
45 45
46 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 46 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
47 47
48 #[test] 48 #[test]
49 fn flip_trait_bound_assist_available() { 49 fn flip_trait_bound_assist_available() {
diff --git a/crates/ra_assists/src/handlers/inline_local_variable.rs b/crates/ra_assists/src/handlers/inline_local_variable.rs
index 60ec536a7..5f3b8dfd1 100644
--- a/crates/ra_assists/src/handlers/inline_local_variable.rs
+++ b/crates/ra_assists/src/handlers/inline_local_variable.rs
@@ -125,7 +125,7 @@ pub(crate) fn inline_local_variable(ctx: AssistCtx) -> Option<Assist> {
125mod tests { 125mod tests {
126 use test_utils::covers; 126 use test_utils::covers;
127 127
128 use crate::helpers::{check_assist, check_assist_not_applicable}; 128 use crate::tests::{check_assist, check_assist_not_applicable};
129 129
130 use super::*; 130 use super::*;
131 131
diff --git a/crates/ra_assists/src/handlers/introduce_variable.rs b/crates/ra_assists/src/handlers/introduce_variable.rs
index 39c656305..9c2c20b22 100644
--- a/crates/ra_assists/src/handlers/introduce_variable.rs
+++ b/crates/ra_assists/src/handlers/introduce_variable.rs
@@ -136,7 +136,7 @@ fn anchor_stmt(expr: ast::Expr) -> Option<(SyntaxNode, bool)> {
136mod tests { 136mod tests {
137 use test_utils::covers; 137 use test_utils::covers;
138 138
139 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 139 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
140 140
141 use super::*; 141 use super::*;
142 142
diff --git a/crates/ra_assists/src/handlers/invert_if.rs b/crates/ra_assists/src/handlers/invert_if.rs
index 682e08512..303c1806d 100644
--- a/crates/ra_assists/src/handlers/invert_if.rs
+++ b/crates/ra_assists/src/handlers/invert_if.rs
@@ -62,7 +62,7 @@ pub(crate) fn invert_if(ctx: AssistCtx) -> Option<Assist> {
62mod tests { 62mod tests {
63 use super::*; 63 use super::*;
64 64
65 use crate::helpers::{check_assist, check_assist_not_applicable}; 65 use crate::tests::{check_assist, check_assist_not_applicable};
66 66
67 #[test] 67 #[test]
68 fn invert_if_remove_inequality() { 68 fn invert_if_remove_inequality() {
diff --git a/crates/ra_assists/src/handlers/merge_imports.rs b/crates/ra_assists/src/handlers/merge_imports.rs
index 4be1238f1..9a2083609 100644
--- a/crates/ra_assists/src/handlers/merge_imports.rs
+++ b/crates/ra_assists/src/handlers/merge_imports.rs
@@ -125,7 +125,7 @@ fn first_path(path: &ast::Path) -> ast::Path {
125 125
126#[cfg(test)] 126#[cfg(test)]
127mod tests { 127mod tests {
128 use crate::helpers::check_assist; 128 use crate::tests::check_assist;
129 129
130 use super::*; 130 use super::*;
131 131
diff --git a/crates/ra_assists/src/handlers/merge_match_arms.rs b/crates/ra_assists/src/handlers/merge_match_arms.rs
index 5a77d3dbc..9ae099b41 100644
--- a/crates/ra_assists/src/handlers/merge_match_arms.rs
+++ b/crates/ra_assists/src/handlers/merge_match_arms.rs
@@ -105,7 +105,7 @@ fn contains_placeholder(a: &ast::MatchArm) -> bool {
105 105
106#[cfg(test)] 106#[cfg(test)]
107mod tests { 107mod tests {
108 use crate::helpers::{check_assist, check_assist_not_applicable}; 108 use crate::tests::{check_assist, check_assist_not_applicable};
109 109
110 use super::*; 110 use super::*;
111 111
diff --git a/crates/ra_assists/src/handlers/move_bounds.rs b/crates/ra_assists/src/handlers/move_bounds.rs
index 0f26884dc..89956aea9 100644
--- a/crates/ra_assists/src/handlers/move_bounds.rs
+++ b/crates/ra_assists/src/handlers/move_bounds.rs
@@ -89,7 +89,7 @@ fn build_predicate(param: ast::TypeParam) -> Option<ast::WherePred> {
89mod tests { 89mod tests {
90 use super::*; 90 use super::*;
91 91
92 use crate::helpers::check_assist; 92 use crate::tests::check_assist;
93 93
94 #[test] 94 #[test]
95 fn move_bounds_to_where_clause_fn() { 95 fn move_bounds_to_where_clause_fn() {
diff --git a/crates/ra_assists/src/handlers/move_guard.rs b/crates/ra_assists/src/handlers/move_guard.rs
index b084dd9ee..f2aa7e594 100644
--- a/crates/ra_assists/src/handlers/move_guard.rs
+++ b/crates/ra_assists/src/handlers/move_guard.rs
@@ -132,7 +132,7 @@ pub(crate) fn move_arm_cond_to_match_guard(ctx: AssistCtx) -> Option<Assist> {
132mod tests { 132mod tests {
133 use super::*; 133 use super::*;
134 134
135 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 135 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
136 136
137 #[test] 137 #[test]
138 fn move_guard_to_arm_body_target() { 138 fn move_guard_to_arm_body_target() {
diff --git a/crates/ra_assists/src/handlers/raw_string.rs b/crates/ra_assists/src/handlers/raw_string.rs
index 567400b9c..542f7a637 100644
--- a/crates/ra_assists/src/handlers/raw_string.rs
+++ b/crates/ra_assists/src/handlers/raw_string.rs
@@ -138,7 +138,7 @@ fn count_hashes(s: &str) -> usize {
138#[cfg(test)] 138#[cfg(test)]
139mod test { 139mod test {
140 use super::*; 140 use super::*;
141 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 141 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
142 142
143 #[test] 143 #[test]
144 fn make_raw_string_target() { 144 fn make_raw_string_target() {
diff --git a/crates/ra_assists/src/handlers/remove_dbg.rs b/crates/ra_assists/src/handlers/remove_dbg.rs
index 4e5eb4350..ddfb21a7e 100644
--- a/crates/ra_assists/src/handlers/remove_dbg.rs
+++ b/crates/ra_assists/src/handlers/remove_dbg.rs
@@ -90,7 +90,7 @@ fn is_valid_macrocall(macro_call: &ast::MacroCall, macro_name: &str) -> Option<b
90#[cfg(test)] 90#[cfg(test)]
91mod tests { 91mod tests {
92 use super::*; 92 use super::*;
93 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 93 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
94 94
95 #[test] 95 #[test]
96 fn test_remove_dbg() { 96 fn test_remove_dbg() {
diff --git a/crates/ra_assists/src/handlers/reorder_fields.rs b/crates/ra_assists/src/handlers/reorder_fields.rs
index 5cbb98d73..a57e327b8 100644
--- a/crates/ra_assists/src/handlers/reorder_fields.rs
+++ b/crates/ra_assists/src/handlers/reorder_fields.rs
@@ -109,7 +109,7 @@ fn compute_fields_ranks(path: &Path, ctx: &AssistCtx) -> Option<HashMap<String,
109 109
110#[cfg(test)] 110#[cfg(test)]
111mod tests { 111mod tests {
112 use crate::helpers::{check_assist, check_assist_not_applicable}; 112 use crate::tests::{check_assist, check_assist_not_applicable};
113 113
114 use super::*; 114 use super::*;
115 115
diff --git a/crates/ra_assists/src/handlers/replace_if_let_with_match.rs b/crates/ra_assists/src/handlers/replace_if_let_with_match.rs
index 9841f6980..d0df3b84e 100644
--- a/crates/ra_assists/src/handlers/replace_if_let_with_match.rs
+++ b/crates/ra_assists/src/handlers/replace_if_let_with_match.rs
@@ -74,7 +74,7 @@ pub(crate) fn replace_if_let_with_match(ctx: AssistCtx) -> Option<Assist> {
74mod tests { 74mod tests {
75 use super::*; 75 use super::*;
76 76
77 use crate::helpers::{check_assist, check_assist_target}; 77 use crate::tests::{check_assist, check_assist_target};
78 78
79 #[test] 79 #[test]
80 fn test_replace_if_let_with_match_unwraps_simple_expressions() { 80 fn test_replace_if_let_with_match_unwraps_simple_expressions() {
diff --git a/crates/ra_assists/src/handlers/replace_let_with_if_let.rs b/crates/ra_assists/src/handlers/replace_let_with_if_let.rs
index 0cf23b754..dc4d16055 100644
--- a/crates/ra_assists/src/handlers/replace_let_with_if_let.rs
+++ b/crates/ra_assists/src/handlers/replace_let_with_if_let.rs
@@ -74,7 +74,7 @@ pub(crate) fn replace_let_with_if_let(ctx: AssistCtx) -> Option<Assist> {
74 74
75#[cfg(test)] 75#[cfg(test)]
76mod tests { 76mod tests {
77 use crate::helpers::check_assist; 77 use crate::tests::check_assist;
78 78
79 use super::*; 79 use super::*;
80 80
diff --git a/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs b/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs
index ff2463c77..624178924 100644
--- a/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs
+++ b/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs
@@ -74,7 +74,7 @@ fn collect_hir_path_segments(path: &hir::Path) -> Option<Vec<SmolStr>> {
74 74
75#[cfg(test)] 75#[cfg(test)]
76mod tests { 76mod tests {
77 use crate::helpers::{check_assist, check_assist_not_applicable}; 77 use crate::tests::{check_assist, check_assist_not_applicable};
78 78
79 use super::*; 79 use super::*;
80 80
diff --git a/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs b/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs
index 62d4ea522..dcb471edb 100644
--- a/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs
+++ b/crates/ra_assists/src/handlers/replace_unwrap_with_match.rs
@@ -63,7 +63,7 @@ pub(crate) fn replace_unwrap_with_match(ctx: AssistCtx) -> Option<Assist> {
63#[cfg(test)] 63#[cfg(test)]
64mod tests { 64mod tests {
65 use super::*; 65 use super::*;
66 use crate::helpers::{check_assist, check_assist_target}; 66 use crate::tests::{check_assist, check_assist_target};
67 67
68 #[test] 68 #[test]
69 fn test_replace_result_unwrap_with_match() { 69 fn test_replace_result_unwrap_with_match() {
diff --git a/crates/ra_assists/src/handlers/split_import.rs b/crates/ra_assists/src/handlers/split_import.rs
index f25826796..a59f2f76f 100644
--- a/crates/ra_assists/src/handlers/split_import.rs
+++ b/crates/ra_assists/src/handlers/split_import.rs
@@ -37,7 +37,7 @@ pub(crate) fn split_import(ctx: AssistCtx) -> Option<Assist> {
37 37
38#[cfg(test)] 38#[cfg(test)]
39mod tests { 39mod tests {
40 use crate::helpers::{check_assist, check_assist_not_applicable, check_assist_target}; 40 use crate::tests::{check_assist, check_assist_not_applicable, check_assist_target};
41 41
42 use super::*; 42 use super::*;
43 43
diff --git a/crates/ra_assists/src/handlers/unwrap_block.rs b/crates/ra_assists/src/handlers/unwrap_block.rs
index 859c70ad8..89992117d 100644
--- a/crates/ra_assists/src/handlers/unwrap_block.rs
+++ b/crates/ra_assists/src/handlers/unwrap_block.rs
@@ -89,7 +89,7 @@ fn extract_expr(cursor_range: TextRange, block: ast::BlockExpr) -> Option<ast::E
89 89
90#[cfg(test)] 90#[cfg(test)]
91mod tests { 91mod tests {
92 use crate::helpers::{check_assist, check_assist_not_applicable}; 92 use crate::tests::{check_assist, check_assist_not_applicable};
93 93
94 use super::*; 94 use super::*;
95 95
diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs
index 0f94f5ee8..b794b021d 100644
--- a/crates/ra_assists/src/lib.rs
+++ b/crates/ra_assists/src/lib.rs
@@ -13,7 +13,7 @@ macro_rules! eprintln {
13mod assist_ctx; 13mod assist_ctx;
14mod marks; 14mod marks;
15#[cfg(test)] 15#[cfg(test)]
16mod doc_tests; 16mod tests;
17pub mod utils; 17pub mod utils;
18pub mod ast_transform; 18pub mod ast_transform;
19 19
@@ -194,150 +194,3 @@ mod handlers {
194 ] 194 ]
195 } 195 }
196} 196}
197
198#[cfg(test)]
199mod helpers {
200 use std::sync::Arc;
201
202 use hir::Semantics;
203 use ra_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt};
204 use ra_ide_db::{symbol_index::SymbolsDatabase, RootDatabase};
205 use test_utils::{add_cursor, assert_eq_text, extract_range_or_offset, RangeOrOffset};
206
207 use crate::{handlers::Handler, AssistCtx, AssistFile};
208
209 pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) {
210 let (mut db, file_id) = RootDatabase::with_single_file(text);
211 // FIXME: ideally, this should be done by the above `RootDatabase::with_single_file`,
212 // but it looks like this might need specialization? :(
213 db.set_local_roots(Arc::new(vec![db.file_source_root(file_id)]));
214 (db, file_id)
215 }
216
217 pub(crate) fn check_assist(assist: Handler, ra_fixture_before: &str, ra_fixture_after: &str) {
218 check(assist, ra_fixture_before, ExpectedResult::After(ra_fixture_after));
219 }
220
221 // FIXME: instead of having a separate function here, maybe use
222 // `extract_ranges` and mark the target as `<target> </target>` in the
223 // fixuture?
224 pub(crate) fn check_assist_target(assist: Handler, ra_fixture: &str, target: &str) {
225 check(assist, ra_fixture, ExpectedResult::Target(target));
226 }
227
228 pub(crate) fn check_assist_not_applicable(assist: Handler, ra_fixture: &str) {
229 check(assist, ra_fixture, ExpectedResult::NotApplicable);
230 }
231
232 enum ExpectedResult<'a> {
233 NotApplicable,
234 After(&'a str),
235 Target(&'a str),
236 }
237
238 fn check(assist: Handler, before: &str, expected: ExpectedResult) {
239 let (text_without_caret, file_with_caret_id, range_or_offset, db) =
240 if before.contains("//-") {
241 let (mut db, position) = RootDatabase::with_position(before);
242 db.set_local_roots(Arc::new(vec![db.file_source_root(position.file_id)]));
243 (
244 db.file_text(position.file_id).as_ref().to_owned(),
245 position.file_id,
246 RangeOrOffset::Offset(position.offset),
247 db,
248 )
249 } else {
250 let (range_or_offset, text_without_caret) = extract_range_or_offset(before);
251 let (db, file_id) = with_single_file(&text_without_caret);
252 (text_without_caret, file_id, range_or_offset, db)
253 };
254
255 let frange = FileRange { file_id: file_with_caret_id, range: range_or_offset.into() };
256
257 let sema = Semantics::new(&db);
258 let assist_ctx = AssistCtx::new(&sema, frange, true);
259
260 match (assist(assist_ctx), expected) {
261 (Some(assist), ExpectedResult::After(after)) => {
262 let action = assist.0[0].action.clone().unwrap();
263
264 let mut actual = if let AssistFile::TargetFile(file_id) = action.file {
265 db.file_text(file_id).as_ref().to_owned()
266 } else {
267 text_without_caret
268 };
269 action.edit.apply(&mut actual);
270
271 match action.cursor_position {
272 None => {
273 if let RangeOrOffset::Offset(before_cursor_pos) = range_or_offset {
274 let off = action
275 .edit
276 .apply_to_offset(before_cursor_pos)
277 .expect("cursor position is affected by the edit");
278 actual = add_cursor(&actual, off)
279 }
280 }
281 Some(off) => actual = add_cursor(&actual, off),
282 };
283
284 assert_eq_text!(after, &actual);
285 }
286 (Some(assist), ExpectedResult::Target(target)) => {
287 let action = assist.0[0].action.clone().unwrap();
288 let range = action.target.expect("expected target on action");
289 assert_eq_text!(&text_without_caret[range], target);
290 }
291 (Some(_), ExpectedResult::NotApplicable) => panic!("assist should not be applicable!"),
292 (None, ExpectedResult::After(_)) | (None, ExpectedResult::Target(_)) => {
293 panic!("code action is not applicable")
294 }
295 (None, ExpectedResult::NotApplicable) => (),
296 };
297 }
298}
299
300#[cfg(test)]
301mod tests {
302 use ra_db::FileRange;
303 use ra_syntax::TextRange;
304 use test_utils::{extract_offset, extract_range};
305
306 use crate::{helpers, resolved_assists};
307
308 #[test]
309 fn assist_order_field_struct() {
310 let before = "struct Foo { <|>bar: u32 }";
311 let (before_cursor_pos, before) = extract_offset(before);
312 let (db, file_id) = helpers::with_single_file(&before);
313 let frange = FileRange { file_id, range: TextRange::empty(before_cursor_pos) };
314 let assists = resolved_assists(&db, frange);
315 let mut assists = assists.iter();
316
317 assert_eq!(
318 assists.next().expect("expected assist").label.label,
319 "Change visibility to pub(crate)"
320 );
321 assert_eq!(assists.next().expect("expected assist").label.label, "Add `#[derive]`");
322 }
323
324 #[test]
325 fn assist_order_if_expr() {
326 let before = "
327 pub fn test_some_range(a: int) -> bool {
328 if let 2..6 = <|>5<|> {
329 true
330 } else {
331 false
332 }
333 }";
334 let (range, before) = extract_range(before);
335 let (db, file_id) = helpers::with_single_file(&before);
336 let frange = FileRange { file_id, range };
337 let assists = resolved_assists(&db, frange);
338 let mut assists = assists.iter();
339
340 assert_eq!(assists.next().expect("expected assist").label.label, "Extract into variable");
341 assert_eq!(assists.next().expect("expected assist").label.label, "Replace with match");
342 }
343}
diff --git a/crates/ra_assists/src/tests.rs b/crates/ra_assists/src/tests.rs
new file mode 100644
index 000000000..483e11931
--- /dev/null
+++ b/crates/ra_assists/src/tests.rs
@@ -0,0 +1,167 @@
1mod generated;
2
3use std::sync::Arc;
4
5use hir::Semantics;
6use ra_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt};
7use ra_ide_db::{symbol_index::SymbolsDatabase, RootDatabase};
8use ra_syntax::TextRange;
9use test_utils::{
10 add_cursor, assert_eq_text, extract_offset, extract_range, extract_range_or_offset,
11 RangeOrOffset,
12};
13
14use crate::{handlers::Handler, resolved_assists, AssistCtx, AssistFile};
15
16pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) {
17 let (mut db, file_id) = RootDatabase::with_single_file(text);
18 // FIXME: ideally, this should be done by the above `RootDatabase::with_single_file`,
19 // but it looks like this might need specialization? :(
20 db.set_local_roots(Arc::new(vec![db.file_source_root(file_id)]));
21 (db, file_id)
22}
23
24pub(crate) fn check_assist(assist: Handler, ra_fixture_before: &str, ra_fixture_after: &str) {
25 check(assist, ra_fixture_before, ExpectedResult::After(ra_fixture_after));
26}
27
28// FIXME: instead of having a separate function here, maybe use
29// `extract_ranges` and mark the target as `<target> </target>` in the
30// fixuture?
31pub(crate) fn check_assist_target(assist: Handler, ra_fixture: &str, target: &str) {
32 check(assist, ra_fixture, ExpectedResult::Target(target));
33}
34
35pub(crate) fn check_assist_not_applicable(assist: Handler, ra_fixture: &str) {
36 check(assist, ra_fixture, ExpectedResult::NotApplicable);
37}
38
39fn check_doc_test(assist_id: &str, before: &str, after: &str) {
40 let (selection, before) = extract_range_or_offset(before);
41 let (db, file_id) = crate::tests::with_single_file(&before);
42 let frange = FileRange { file_id, range: selection.into() };
43
44 let assist = resolved_assists(&db, frange)
45 .into_iter()
46 .find(|assist| assist.label.id.0 == assist_id)
47 .unwrap_or_else(|| {
48 panic!(
49 "\n\nAssist is not applicable: {}\nAvailable assists: {}",
50 assist_id,
51 resolved_assists(&db, frange)
52 .into_iter()
53 .map(|assist| assist.label.id.0)
54 .collect::<Vec<_>>()
55 .join(", ")
56 )
57 });
58
59 let actual = {
60 let mut actual = before.clone();
61 assist.action.edit.apply(&mut actual);
62 actual
63 };
64 assert_eq_text!(after, &actual);
65}
66
67enum ExpectedResult<'a> {
68 NotApplicable,
69 After(&'a str),
70 Target(&'a str),
71}
72
73fn check(assist: Handler, before: &str, expected: ExpectedResult) {
74 let (text_without_caret, file_with_caret_id, range_or_offset, db) = if before.contains("//-") {
75 let (mut db, position) = RootDatabase::with_position(before);
76 db.set_local_roots(Arc::new(vec![db.file_source_root(position.file_id)]));
77 (
78 db.file_text(position.file_id).as_ref().to_owned(),
79 position.file_id,
80 RangeOrOffset::Offset(position.offset),
81 db,
82 )
83 } else {
84 let (range_or_offset, text_without_caret) = extract_range_or_offset(before);
85 let (db, file_id) = with_single_file(&text_without_caret);
86 (text_without_caret, file_id, range_or_offset, db)
87 };
88
89 let frange = FileRange { file_id: file_with_caret_id, range: range_or_offset.into() };
90
91 let sema = Semantics::new(&db);
92 let assist_ctx = AssistCtx::new(&sema, frange, true);
93
94 match (assist(assist_ctx), expected) {
95 (Some(assist), ExpectedResult::After(after)) => {
96 let action = assist.0[0].action.clone().unwrap();
97
98 let mut actual = if let AssistFile::TargetFile(file_id) = action.file {
99 db.file_text(file_id).as_ref().to_owned()
100 } else {
101 text_without_caret
102 };
103 action.edit.apply(&mut actual);
104
105 match action.cursor_position {
106 None => {
107 if let RangeOrOffset::Offset(before_cursor_pos) = range_or_offset {
108 let off = action
109 .edit
110 .apply_to_offset(before_cursor_pos)
111 .expect("cursor position is affected by the edit");
112 actual = add_cursor(&actual, off)
113 }
114 }
115 Some(off) => actual = add_cursor(&actual, off),
116 };
117
118 assert_eq_text!(after, &actual);
119 }
120 (Some(assist), ExpectedResult::Target(target)) => {
121 let action = assist.0[0].action.clone().unwrap();
122 let range = action.target.expect("expected target on action");
123 assert_eq_text!(&text_without_caret[range], target);
124 }
125 (Some(_), ExpectedResult::NotApplicable) => panic!("assist should not be applicable!"),
126 (None, ExpectedResult::After(_)) | (None, ExpectedResult::Target(_)) => {
127 panic!("code action is not applicable")
128 }
129 (None, ExpectedResult::NotApplicable) => (),
130 };
131}
132
133#[test]
134fn assist_order_field_struct() {
135 let before = "struct Foo { <|>bar: u32 }";
136 let (before_cursor_pos, before) = extract_offset(before);
137 let (db, file_id) = with_single_file(&before);
138 let frange = FileRange { file_id, range: TextRange::empty(before_cursor_pos) };
139 let assists = resolved_assists(&db, frange);
140 let mut assists = assists.iter();
141
142 assert_eq!(
143 assists.next().expect("expected assist").label.label,
144 "Change visibility to pub(crate)"
145 );
146 assert_eq!(assists.next().expect("expected assist").label.label, "Add `#[derive]`");
147}
148
149#[test]
150fn assist_order_if_expr() {
151 let before = "
152 pub fn test_some_range(a: int) -> bool {
153 if let 2..6 = <|>5<|> {
154 true
155 } else {
156 false
157 }
158 }";
159 let (range, before) = extract_range(before);
160 let (db, file_id) = with_single_file(&before);
161 let frange = FileRange { file_id, range };
162 let assists = resolved_assists(&db, frange);
163 let mut assists = assists.iter();
164
165 assert_eq!(assists.next().expect("expected assist").label.label, "Extract into variable");
166 assert_eq!(assists.next().expect("expected assist").label.label, "Replace with match");
167}
diff --git a/crates/ra_assists/src/doc_tests/generated.rs b/crates/ra_assists/src/tests/generated.rs
index 6696cc832..7d35fa284 100644
--- a/crates/ra_assists/src/doc_tests/generated.rs
+++ b/crates/ra_assists/src/tests/generated.rs
@@ -1,10 +1,10 @@
1//! Generated file, do not edit by hand, see `xtask/src/codegen` 1//! Generated file, do not edit by hand, see `xtask/src/codegen`
2 2
3use super::check; 3use super::check_doc_test;
4 4
5#[test] 5#[test]
6fn doctest_add_custom_impl() { 6fn doctest_add_custom_impl() {
7 check( 7 check_doc_test(
8 "add_custom_impl", 8 "add_custom_impl",
9 r#####" 9 r#####"
10#[derive(Deb<|>ug, Display)] 10#[derive(Deb<|>ug, Display)]
@@ -23,7 +23,7 @@ impl Debug for S {
23 23
24#[test] 24#[test]
25fn doctest_add_derive() { 25fn doctest_add_derive() {
26 check( 26 check_doc_test(
27 "add_derive", 27 "add_derive",
28 r#####" 28 r#####"
29struct Point { 29struct Point {
@@ -43,7 +43,7 @@ struct Point {
43 43
44#[test] 44#[test]
45fn doctest_add_explicit_type() { 45fn doctest_add_explicit_type() {
46 check( 46 check_doc_test(
47 "add_explicit_type", 47 "add_explicit_type",
48 r#####" 48 r#####"
49fn main() { 49fn main() {
@@ -60,7 +60,7 @@ fn main() {
60 60
61#[test] 61#[test]
62fn doctest_add_function() { 62fn doctest_add_function() {
63 check( 63 check_doc_test(
64 "add_function", 64 "add_function",
65 r#####" 65 r#####"
66struct Baz; 66struct Baz;
@@ -87,7 +87,7 @@ fn bar(arg: &str, baz: Baz) {
87 87
88#[test] 88#[test]
89fn doctest_add_hash() { 89fn doctest_add_hash() {
90 check( 90 check_doc_test(
91 "add_hash", 91 "add_hash",
92 r#####" 92 r#####"
93fn main() { 93fn main() {
@@ -104,7 +104,7 @@ fn main() {
104 104
105#[test] 105#[test]
106fn doctest_add_impl() { 106fn doctest_add_impl() {
107 check( 107 check_doc_test(
108 "add_impl", 108 "add_impl",
109 r#####" 109 r#####"
110struct Ctx<T: Clone> { 110struct Ctx<T: Clone> {
@@ -125,7 +125,7 @@ impl<T: Clone> Ctx<T> {
125 125
126#[test] 126#[test]
127fn doctest_add_impl_default_members() { 127fn doctest_add_impl_default_members() {
128 check( 128 check_doc_test(
129 "add_impl_default_members", 129 "add_impl_default_members",
130 r#####" 130 r#####"
131trait Trait { 131trait Trait {
@@ -159,7 +159,7 @@ impl Trait for () {
159 159
160#[test] 160#[test]
161fn doctest_add_impl_missing_members() { 161fn doctest_add_impl_missing_members() {
162 check( 162 check_doc_test(
163 "add_impl_missing_members", 163 "add_impl_missing_members",
164 r#####" 164 r#####"
165trait Trait<T> { 165trait Trait<T> {
@@ -191,7 +191,7 @@ impl Trait<u32> for () {
191 191
192#[test] 192#[test]
193fn doctest_add_new() { 193fn doctest_add_new() {
194 check( 194 check_doc_test(
195 "add_new", 195 "add_new",
196 r#####" 196 r#####"
197struct Ctx<T: Clone> { 197struct Ctx<T: Clone> {
@@ -213,7 +213,7 @@ impl<T: Clone> Ctx<T> {
213 213
214#[test] 214#[test]
215fn doctest_apply_demorgan() { 215fn doctest_apply_demorgan() {
216 check( 216 check_doc_test(
217 "apply_demorgan", 217 "apply_demorgan",
218 r#####" 218 r#####"
219fn main() { 219fn main() {
@@ -230,7 +230,7 @@ fn main() {
230 230
231#[test] 231#[test]
232fn doctest_auto_import() { 232fn doctest_auto_import() {
233 check( 233 check_doc_test(
234 "auto_import", 234 "auto_import",
235 r#####" 235 r#####"
236fn main() { 236fn main() {
@@ -251,7 +251,7 @@ pub mod std { pub mod collections { pub struct HashMap { } } }
251 251
252#[test] 252#[test]
253fn doctest_change_visibility() { 253fn doctest_change_visibility() {
254 check( 254 check_doc_test(
255 "change_visibility", 255 "change_visibility",
256 r#####" 256 r#####"
257<|>fn frobnicate() {} 257<|>fn frobnicate() {}
@@ -264,7 +264,7 @@ pub(crate) fn frobnicate() {}
264 264
265#[test] 265#[test]
266fn doctest_convert_to_guarded_return() { 266fn doctest_convert_to_guarded_return() {
267 check( 267 check_doc_test(
268 "convert_to_guarded_return", 268 "convert_to_guarded_return",
269 r#####" 269 r#####"
270fn main() { 270fn main() {
@@ -288,7 +288,7 @@ fn main() {
288 288
289#[test] 289#[test]
290fn doctest_fill_match_arms() { 290fn doctest_fill_match_arms() {
291 check( 291 check_doc_test(
292 "fill_match_arms", 292 "fill_match_arms",
293 r#####" 293 r#####"
294enum Action { Move { distance: u32 }, Stop } 294enum Action { Move { distance: u32 }, Stop }
@@ -314,7 +314,7 @@ fn handle(action: Action) {
314 314
315#[test] 315#[test]
316fn doctest_flip_binexpr() { 316fn doctest_flip_binexpr() {
317 check( 317 check_doc_test(
318 "flip_binexpr", 318 "flip_binexpr",
319 r#####" 319 r#####"
320fn main() { 320fn main() {
@@ -331,7 +331,7 @@ fn main() {
331 331
332#[test] 332#[test]
333fn doctest_flip_comma() { 333fn doctest_flip_comma() {
334 check( 334 check_doc_test(
335 "flip_comma", 335 "flip_comma",
336 r#####" 336 r#####"
337fn main() { 337fn main() {
@@ -348,7 +348,7 @@ fn main() {
348 348
349#[test] 349#[test]
350fn doctest_flip_trait_bound() { 350fn doctest_flip_trait_bound() {
351 check( 351 check_doc_test(
352 "flip_trait_bound", 352 "flip_trait_bound",
353 r#####" 353 r#####"
354fn foo<T: Clone +<|> Copy>() { } 354fn foo<T: Clone +<|> Copy>() { }
@@ -361,7 +361,7 @@ fn foo<T: Copy + Clone>() { }
361 361
362#[test] 362#[test]
363fn doctest_inline_local_variable() { 363fn doctest_inline_local_variable() {
364 check( 364 check_doc_test(
365 "inline_local_variable", 365 "inline_local_variable",
366 r#####" 366 r#####"
367fn main() { 367fn main() {
@@ -379,7 +379,7 @@ fn main() {
379 379
380#[test] 380#[test]
381fn doctest_introduce_variable() { 381fn doctest_introduce_variable() {
382 check( 382 check_doc_test(
383 "introduce_variable", 383 "introduce_variable",
384 r#####" 384 r#####"
385fn main() { 385fn main() {
@@ -397,7 +397,7 @@ fn main() {
397 397
398#[test] 398#[test]
399fn doctest_invert_if() { 399fn doctest_invert_if() {
400 check( 400 check_doc_test(
401 "invert_if", 401 "invert_if",
402 r#####" 402 r#####"
403fn main() { 403fn main() {
@@ -414,7 +414,7 @@ fn main() {
414 414
415#[test] 415#[test]
416fn doctest_make_raw_string() { 416fn doctest_make_raw_string() {
417 check( 417 check_doc_test(
418 "make_raw_string", 418 "make_raw_string",
419 r#####" 419 r#####"
420fn main() { 420fn main() {
@@ -431,7 +431,7 @@ fn main() {
431 431
432#[test] 432#[test]
433fn doctest_make_usual_string() { 433fn doctest_make_usual_string() {
434 check( 434 check_doc_test(
435 "make_usual_string", 435 "make_usual_string",
436 r#####" 436 r#####"
437fn main() { 437fn main() {
@@ -448,7 +448,7 @@ fn main() {
448 448
449#[test] 449#[test]
450fn doctest_merge_imports() { 450fn doctest_merge_imports() {
451 check( 451 check_doc_test(
452 "merge_imports", 452 "merge_imports",
453 r#####" 453 r#####"
454use std::<|>fmt::Formatter; 454use std::<|>fmt::Formatter;
@@ -462,7 +462,7 @@ use std::{fmt::Formatter, io};
462 462
463#[test] 463#[test]
464fn doctest_merge_match_arms() { 464fn doctest_merge_match_arms() {
465 check( 465 check_doc_test(
466 "merge_match_arms", 466 "merge_match_arms",
467 r#####" 467 r#####"
468enum Action { Move { distance: u32 }, Stop } 468enum Action { Move { distance: u32 }, Stop }
@@ -488,7 +488,7 @@ fn handle(action: Action) {
488 488
489#[test] 489#[test]
490fn doctest_move_arm_cond_to_match_guard() { 490fn doctest_move_arm_cond_to_match_guard() {
491 check( 491 check_doc_test(
492 "move_arm_cond_to_match_guard", 492 "move_arm_cond_to_match_guard",
493 r#####" 493 r#####"
494enum Action { Move { distance: u32 }, Stop } 494enum Action { Move { distance: u32 }, Stop }
@@ -515,7 +515,7 @@ fn handle(action: Action) {
515 515
516#[test] 516#[test]
517fn doctest_move_bounds_to_where_clause() { 517fn doctest_move_bounds_to_where_clause() {
518 check( 518 check_doc_test(
519 "move_bounds_to_where_clause", 519 "move_bounds_to_where_clause",
520 r#####" 520 r#####"
521fn apply<T, U, <|>F: FnOnce(T) -> U>(f: F, x: T) -> U { 521fn apply<T, U, <|>F: FnOnce(T) -> U>(f: F, x: T) -> U {
@@ -532,7 +532,7 @@ fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
532 532
533#[test] 533#[test]
534fn doctest_move_guard_to_arm_body() { 534fn doctest_move_guard_to_arm_body() {
535 check( 535 check_doc_test(
536 "move_guard_to_arm_body", 536 "move_guard_to_arm_body",
537 r#####" 537 r#####"
538enum Action { Move { distance: u32 }, Stop } 538enum Action { Move { distance: u32 }, Stop }
@@ -559,7 +559,7 @@ fn handle(action: Action) {
559 559
560#[test] 560#[test]
561fn doctest_remove_dbg() { 561fn doctest_remove_dbg() {
562 check( 562 check_doc_test(
563 "remove_dbg", 563 "remove_dbg",
564 r#####" 564 r#####"
565fn main() { 565fn main() {
@@ -576,7 +576,7 @@ fn main() {
576 576
577#[test] 577#[test]
578fn doctest_remove_hash() { 578fn doctest_remove_hash() {
579 check( 579 check_doc_test(
580 "remove_hash", 580 "remove_hash",
581 r#####" 581 r#####"
582fn main() { 582fn main() {
@@ -593,7 +593,7 @@ fn main() {
593 593
594#[test] 594#[test]
595fn doctest_remove_mut() { 595fn doctest_remove_mut() {
596 check( 596 check_doc_test(
597 "remove_mut", 597 "remove_mut",
598 r#####" 598 r#####"
599impl Walrus { 599impl Walrus {
@@ -610,7 +610,7 @@ impl Walrus {
610 610
611#[test] 611#[test]
612fn doctest_reorder_fields() { 612fn doctest_reorder_fields() {
613 check( 613 check_doc_test(
614 "reorder_fields", 614 "reorder_fields",
615 r#####" 615 r#####"
616struct Foo {foo: i32, bar: i32}; 616struct Foo {foo: i32, bar: i32};
@@ -625,7 +625,7 @@ const test: Foo = Foo {foo: 1, bar: 0}
625 625
626#[test] 626#[test]
627fn doctest_replace_if_let_with_match() { 627fn doctest_replace_if_let_with_match() {
628 check( 628 check_doc_test(
629 "replace_if_let_with_match", 629 "replace_if_let_with_match",
630 r#####" 630 r#####"
631enum Action { Move { distance: u32 }, Stop } 631enum Action { Move { distance: u32 }, Stop }
@@ -653,7 +653,7 @@ fn handle(action: Action) {
653 653
654#[test] 654#[test]
655fn doctest_replace_let_with_if_let() { 655fn doctest_replace_let_with_if_let() {
656 check( 656 check_doc_test(
657 "replace_let_with_if_let", 657 "replace_let_with_if_let",
658 r#####" 658 r#####"
659enum Option<T> { Some(T), None } 659enum Option<T> { Some(T), None }
@@ -679,7 +679,7 @@ fn compute() -> Option<i32> { None }
679 679
680#[test] 680#[test]
681fn doctest_replace_qualified_name_with_use() { 681fn doctest_replace_qualified_name_with_use() {
682 check( 682 check_doc_test(
683 "replace_qualified_name_with_use", 683 "replace_qualified_name_with_use",
684 r#####" 684 r#####"
685fn process(map: std::collections::<|>HashMap<String, String>) {} 685fn process(map: std::collections::<|>HashMap<String, String>) {}
@@ -694,7 +694,7 @@ fn process(map: HashMap<String, String>) {}
694 694
695#[test] 695#[test]
696fn doctest_replace_unwrap_with_match() { 696fn doctest_replace_unwrap_with_match() {
697 check( 697 check_doc_test(
698 "replace_unwrap_with_match", 698 "replace_unwrap_with_match",
699 r#####" 699 r#####"
700enum Result<T, E> { Ok(T), Err(E) } 700enum Result<T, E> { Ok(T), Err(E) }
@@ -718,7 +718,7 @@ fn main() {
718 718
719#[test] 719#[test]
720fn doctest_split_import() { 720fn doctest_split_import() {
721 check( 721 check_doc_test(
722 "split_import", 722 "split_import",
723 r#####" 723 r#####"
724use std::<|>collections::HashMap; 724use std::<|>collections::HashMap;
@@ -731,7 +731,7 @@ use std::{collections::HashMap};
731 731
732#[test] 732#[test]
733fn doctest_unwrap_block() { 733fn doctest_unwrap_block() {
734 check( 734 check_doc_test(
735 "unwrap_block", 735 "unwrap_block",
736 r#####" 736 r#####"
737fn foo() { 737fn foo() {
diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs
index 0e4dcb95a..b4907f4b2 100644
--- a/xtask/src/codegen.rs
+++ b/xtask/src/codegen.rs
@@ -27,7 +27,7 @@ const AST_NODES: &str = "crates/ra_syntax/src/ast/generated/nodes.rs";
27const AST_TOKENS: &str = "crates/ra_syntax/src/ast/generated/tokens.rs"; 27const AST_TOKENS: &str = "crates/ra_syntax/src/ast/generated/tokens.rs";
28 28
29const ASSISTS_DIR: &str = "crates/ra_assists/src/handlers"; 29const ASSISTS_DIR: &str = "crates/ra_assists/src/handlers";
30const ASSISTS_TESTS: &str = "crates/ra_assists/src/doc_tests/generated.rs"; 30const ASSISTS_TESTS: &str = "crates/ra_assists/src/tests/generated.rs";
31const ASSISTS_DOCS: &str = "docs/user/assists.md"; 31const ASSISTS_DOCS: &str = "docs/user/assists.md";
32 32
33#[derive(Debug, PartialEq, Eq, Clone, Copy)] 33#[derive(Debug, PartialEq, Eq, Clone, Copy)]
diff --git a/xtask/src/codegen/gen_assists_docs.rs b/xtask/src/codegen/gen_assists_docs.rs
index 31d606535..4bd6b5f0c 100644
--- a/xtask/src/codegen/gen_assists_docs.rs
+++ b/xtask/src/codegen/gen_assists_docs.rs
@@ -101,14 +101,14 @@ fn collect_assists() -> Result<Vec<Assist>> {
101} 101}
102 102
103fn generate_tests(assists: &[Assist], mode: Mode) -> Result<()> { 103fn generate_tests(assists: &[Assist], mode: Mode) -> Result<()> {
104 let mut buf = String::from("use super::check;\n"); 104 let mut buf = String::from("use super::check_doc_test;\n");
105 105
106 for assist in assists.iter() { 106 for assist in assists.iter() {
107 let test = format!( 107 let test = format!(
108 r######" 108 r######"
109#[test] 109#[test]
110fn doctest_{}() {{ 110fn doctest_{}() {{
111 check( 111 check_doc_test(
112 "{}", 112 "{}",
113r#####" 113r#####"
114{}"#####, r#####" 114{}"#####, r#####"
diff --git a/xtask/tests/tidy-tests/main.rs b/xtask/tests/tidy-tests/main.rs
index 3213c4dfa..a3c2e37d1 100644
--- a/xtask/tests/tidy-tests/main.rs
+++ b/xtask/tests/tidy-tests/main.rs
@@ -24,7 +24,7 @@ fn check_todo(path: &Path, text: &str) {
24 // This file itself is whitelisted since this test itself contains matches. 24 // This file itself is whitelisted since this test itself contains matches.
25 "tests/cli.rs", 25 "tests/cli.rs",
26 // Some of our assists generate `todo!()` so those files are whitelisted. 26 // Some of our assists generate `todo!()` so those files are whitelisted.
27 "doc_tests/generated.rs", 27 "tests/generated.rs",
28 "handlers/add_missing_impl_members.rs", 28 "handlers/add_missing_impl_members.rs",
29 "handlers/add_function.rs", 29 "handlers/add_function.rs",
30 // To support generating `todo!()` in assists, we have `expr_todo()` in ast::make. 30 // To support generating `todo!()` in assists, we have `expr_todo()` in ast::make.