diff options
Diffstat (limited to 'crates/ra_ide/src/completion.rs')
-rw-r--r-- | crates/ra_ide/src/completion.rs | 91 |
1 files changed, 85 insertions, 6 deletions
diff --git a/crates/ra_ide/src/completion.rs b/crates/ra_ide/src/completion.rs index d890b69d2..f3a5e9573 100644 --- a/crates/ra_ide/src/completion.rs +++ b/crates/ra_ide/src/completion.rs | |||
@@ -2,6 +2,9 @@ mod completion_config; | |||
2 | mod completion_item; | 2 | mod completion_item; |
3 | mod completion_context; | 3 | mod completion_context; |
4 | mod presentation; | 4 | mod presentation; |
5 | mod patterns; | ||
6 | #[cfg(test)] | ||
7 | mod test_utils; | ||
5 | 8 | ||
6 | mod complete_attribute; | 9 | mod complete_attribute; |
7 | mod complete_dot; | 10 | mod complete_dot; |
@@ -15,8 +18,6 @@ mod complete_unqualified_path; | |||
15 | mod complete_postfix; | 18 | mod complete_postfix; |
16 | mod complete_macro_in_item_position; | 19 | mod complete_macro_in_item_position; |
17 | mod complete_trait_impl; | 20 | mod complete_trait_impl; |
18 | #[cfg(test)] | ||
19 | mod test_utils; | ||
20 | 21 | ||
21 | use ra_ide_db::RootDatabase; | 22 | use ra_ide_db::RootDatabase; |
22 | 23 | ||
@@ -62,11 +63,11 @@ pub use crate::completion::{ | |||
62 | // There also snippet completions: | 63 | // There also snippet completions: |
63 | // | 64 | // |
64 | // .Expressions | 65 | // .Expressions |
65 | // - `pd` -> `println!("{:?}")` | 66 | // - `pd` -> `eprintln!(" = {:?}", );")` |
66 | // - `ppd` -> `println!("{:#?}")` | 67 | // - `ppd` -> `eprintln!(" = {:#?}", );` |
67 | // | 68 | // |
68 | // .Items | 69 | // .Items |
69 | // - `tfn` -> `#[test] fn f(){}` | 70 | // - `tfn` -> `#[test] fn feature(){}` |
70 | // - `tmod` -> | 71 | // - `tmod` -> |
71 | // ```rust | 72 | // ```rust |
72 | // #[cfg(test)] | 73 | // #[cfg(test)] |
@@ -74,7 +75,7 @@ pub use crate::completion::{ | |||
74 | // use super::*; | 75 | // use super::*; |
75 | // | 76 | // |
76 | // #[test] | 77 | // #[test] |
77 | // fn test_fn() {} | 78 | // fn test_name() {} |
78 | // } | 79 | // } |
79 | // ``` | 80 | // ``` |
80 | 81 | ||
@@ -125,3 +126,81 @@ pub(crate) fn completions( | |||
125 | 126 | ||
126 | Some(acc) | 127 | Some(acc) |
127 | } | 128 | } |
129 | |||
130 | #[cfg(test)] | ||
131 | mod tests { | ||
132 | use crate::completion::completion_config::CompletionConfig; | ||
133 | use crate::mock_analysis::analysis_and_position; | ||
134 | |||
135 | struct DetailAndDocumentation<'a> { | ||
136 | detail: &'a str, | ||
137 | documentation: &'a str, | ||
138 | } | ||
139 | |||
140 | fn check_detail_and_documentation(ra_fixture: &str, expected: DetailAndDocumentation) { | ||
141 | let (analysis, position) = analysis_and_position(ra_fixture); | ||
142 | let config = CompletionConfig::default(); | ||
143 | let completions = analysis.completions(&config, position).unwrap().unwrap(); | ||
144 | for item in completions { | ||
145 | if item.detail() == Some(expected.detail) { | ||
146 | let opt = item.documentation(); | ||
147 | let doc = opt.as_ref().map(|it| it.as_str()); | ||
148 | assert_eq!(doc, Some(expected.documentation)); | ||
149 | return; | ||
150 | } | ||
151 | } | ||
152 | panic!("completion detail not found: {}", expected.detail) | ||
153 | } | ||
154 | |||
155 | #[test] | ||
156 | fn test_completion_detail_from_macro_generated_struct_fn_doc_attr() { | ||
157 | check_detail_and_documentation( | ||
158 | r#" | ||
159 | //- /lib.rs | ||
160 | macro_rules! bar { | ||
161 | () => { | ||
162 | struct Bar; | ||
163 | impl Bar { | ||
164 | #[doc = "Do the foo"] | ||
165 | fn foo(&self) {} | ||
166 | } | ||
167 | } | ||
168 | } | ||
169 | |||
170 | bar!(); | ||
171 | |||
172 | fn foo() { | ||
173 | let bar = Bar; | ||
174 | bar.fo<|>; | ||
175 | } | ||
176 | "#, | ||
177 | DetailAndDocumentation { detail: "fn foo(&self)", documentation: "Do the foo" }, | ||
178 | ); | ||
179 | } | ||
180 | |||
181 | #[test] | ||
182 | fn test_completion_detail_from_macro_generated_struct_fn_doc_comment() { | ||
183 | check_detail_and_documentation( | ||
184 | r#" | ||
185 | //- /lib.rs | ||
186 | macro_rules! bar { | ||
187 | () => { | ||
188 | struct Bar; | ||
189 | impl Bar { | ||
190 | /// Do the foo | ||
191 | fn foo(&self) {} | ||
192 | } | ||
193 | } | ||
194 | } | ||
195 | |||
196 | bar!(); | ||
197 | |||
198 | fn foo() { | ||
199 | let bar = Bar; | ||
200 | bar.fo<|>; | ||
201 | } | ||
202 | "#, | ||
203 | DetailAndDocumentation { detail: "fn foo(&self)", documentation: " Do the foo" }, | ||
204 | ); | ||
205 | } | ||
206 | } | ||