aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/tests
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2018-10-31 19:41:24 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2018-10-31 19:41:24 +0000
commit55ebe6380aef233fff86b7e6cead361787bf1f65 (patch)
tree9ed060e4738a0504ddfd146649b9cf8a2f2fac40 /crates/ra_analysis/tests
parentdfba29e4fb66457d101db295e3c356a932ac005e (diff)
parent74320945b664916005d263552194201cbe9a52bc (diff)
Merge #167
167: Attempt to extract useful comments from function signatures r=matklad a=kjeremy I'm trying to extract useful function comments for signature info. This will also be useful for hover. This is a WIP (and actually works pretty well!) but I don't think it's the right approach long term so some guidance would be appreciated so that we could also get comments for say types and variable instances etc. Currently `test_fn_signature_with_simple_doc` fails due to a bug in `extend` but we probably shouldn't use this approach anyway. Maybe comments should be attached to nodes somehow? I'm also thinking that maybe the markdown bits should live in the language server. Thoughts? Co-authored-by: Jeremy A. Kolb <[email protected]>
Diffstat (limited to 'crates/ra_analysis/tests')
-rw-r--r--crates/ra_analysis/tests/tests.rs147
1 files changed, 147 insertions, 0 deletions
diff --git a/crates/ra_analysis/tests/tests.rs b/crates/ra_analysis/tests/tests.rs
index 94e025677..9e2478d9e 100644
--- a/crates/ra_analysis/tests/tests.rs
+++ b/crates/ra_analysis/tests/tests.rs
@@ -195,6 +195,153 @@ fn bar() {
195 assert_eq!(param, Some(1)); 195 assert_eq!(param, Some(1));
196} 196}
197 197
198#[test]
199fn test_fn_signature_with_docs_simple() {
200 let (desc, param) = get_signature(
201 r#"
202// test
203fn foo(j: u32) -> u32 {
204 j
205}
206
207fn bar() {
208 let _ = foo(<|>);
209}
210"#,
211 );
212
213 assert_eq!(desc.name, "foo".to_string());
214 assert_eq!(desc.params, vec!["j".to_string()]);
215 assert_eq!(desc.ret_type, Some("-> u32".to_string()));
216 assert_eq!(param, Some(0));
217 assert_eq!(desc.label, "fn foo(j: u32) -> u32".to_string());
218 assert_eq!(desc.doc, Some("test".into()));
219}
220
221#[test]
222fn test_fn_signature_with_docs() {
223 let (desc, param) = get_signature(
224 r#"
225/// Adds one to the number given.
226///
227/// # Examples
228///
229/// ```
230/// let five = 5;
231///
232/// assert_eq!(6, my_crate::add_one(5));
233/// ```
234pub fn add_one(x: i32) -> i32 {
235 x + 1
236}
237
238pub fn do() {
239 add_one(<|>
240}"#,
241 );
242
243 assert_eq!(desc.name, "add_one".to_string());
244 assert_eq!(desc.params, vec!["x".to_string()]);
245 assert_eq!(desc.ret_type, Some("-> i32".to_string()));
246 assert_eq!(param, Some(0));
247 assert_eq!(desc.label, "pub fn add_one(x: i32) -> i32".to_string());
248 assert_eq!(desc.doc, Some(
249r#"Adds one to the number given.
250
251# Examples
252
253```rust
254let five = 5;
255
256assert_eq!(6, my_crate::add_one(5));
257```"#.into()));
258}
259
260#[test]
261fn test_fn_signature_with_docs_impl() {
262 let (desc, param) = get_signature(
263 r#"
264struct addr;
265impl addr {
266 /// Adds one to the number given.
267 ///
268 /// # Examples
269 ///
270 /// ```
271 /// let five = 5;
272 ///
273 /// assert_eq!(6, my_crate::add_one(5));
274 /// ```
275 pub fn add_one(x: i32) -> i32 {
276 x + 1
277 }
278}
279
280pub fn do_it() {
281 addr {};
282 addr::add_one(<|>);
283}"#);
284
285 assert_eq!(desc.name, "add_one".to_string());
286 assert_eq!(desc.params, vec!["x".to_string()]);
287 assert_eq!(desc.ret_type, Some("-> i32".to_string()));
288 assert_eq!(param, Some(0));
289 assert_eq!(desc.label, "pub fn add_one(x: i32) -> i32".to_string());
290 assert_eq!(desc.doc, Some(
291r#"Adds one to the number given.
292
293# Examples
294
295```rust
296let five = 5;
297
298assert_eq!(6, my_crate::add_one(5));
299```"#.into()));
300}
301
302#[test]
303fn test_fn_signature_with_docs_from_actix() {
304 let (desc, param) = get_signature(
305 r#"
306pub trait WriteHandler<E>
307where
308 Self: Actor,
309 Self::Context: ActorContext,
310{
311 /// Method is called when writer emits error.
312 ///
313 /// If this method returns `ErrorAction::Continue` writer processing
314 /// continues otherwise stream processing stops.
315 fn error(&mut self, err: E, ctx: &mut Self::Context) -> Running {
316 Running::Stop
317 }
318
319 /// Method is called when writer finishes.
320 ///
321 /// By default this method stops actor's `Context`.
322 fn finished(&mut self, ctx: &mut Self::Context) {
323 ctx.stop()
324 }
325}
326
327pub fn foo() {
328 WriteHandler r;
329 r.finished(<|>);
330}
331
332"#);
333
334 assert_eq!(desc.name, "finished".to_string());
335 assert_eq!(desc.params, vec!["&mut self".to_string(), "ctx".to_string()]);
336 assert_eq!(desc.ret_type, None);
337 assert_eq!(param, Some(1));
338 assert_eq!(desc.doc, Some(
339r#"Method is called when writer finishes.
340
341By default this method stops actor's `Context`."#.into()));
342}
343
344
198fn get_all_refs(text: &str) -> Vec<(FileId, TextRange)> { 345fn get_all_refs(text: &str) -> Vec<(FileId, TextRange)> {
199 let (analysis, position) = single_file_with_position(text); 346 let (analysis, position) = single_file_with_position(text);
200 analysis.find_all_refs(position.file_id, position.offset).unwrap() 347 analysis.find_all_refs(position.file_id, position.offset).unwrap()