aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/tests/tests.rs
diff options
context:
space:
mode:
authorJeremy A. Kolb <[email protected]>2018-10-09 15:08:17 +0100
committerJeremy A. Kolb <[email protected]>2018-10-11 21:40:46 +0100
commitf8a2b533045757c42c206b2596448baf4737f1f0 (patch)
tree587e681ec5323d8deabcc6d533de033e7aa79be7 /crates/ra_analysis/tests/tests.rs
parent2ba6f18586d02a6dbc32e0bea88f7b4236277ea1 (diff)
Language Server: textDocument/signatureHelp
Implements a pretty barebones function signature help mechanism in the language server. Users can use `Analysis::resolve_callback()` to get basic information about a call site. Fixes #102
Diffstat (limited to 'crates/ra_analysis/tests/tests.rs')
-rw-r--r--crates/ra_analysis/tests/tests.rs102
1 files changed, 98 insertions, 4 deletions
diff --git a/crates/ra_analysis/tests/tests.rs b/crates/ra_analysis/tests/tests.rs
index a886cd0ff..9417ddc1d 100644
--- a/crates/ra_analysis/tests/tests.rs
+++ b/crates/ra_analysis/tests/tests.rs
@@ -1,6 +1,8 @@
1extern crate relative_path; 1extern crate relative_path;
2extern crate ra_analysis; 2extern crate ra_analysis;
3extern crate rustc_hash; 3extern crate rustc_hash;
4extern crate ra_editor;
5extern crate ra_syntax;
4extern crate test_utils; 6extern crate test_utils;
5 7
6use std::{ 8use std::{
@@ -9,8 +11,8 @@ use std::{
9 11
10use rustc_hash::FxHashMap; 12use rustc_hash::FxHashMap;
11use relative_path::{RelativePath, RelativePathBuf}; 13use relative_path::{RelativePath, RelativePathBuf};
12use ra_analysis::{Analysis, AnalysisHost, FileId, FileResolver, JobHandle, CrateGraph, CrateId}; 14use ra_analysis::{Analysis, AnalysisHost, FileId, FileResolver, JobHandle, CrateGraph, CrateId, FnDescriptor};
13use test_utils::assert_eq_dbg; 15use test_utils::{assert_eq_dbg, extract_offset};
14 16
15#[derive(Debug)] 17#[derive(Debug)]
16struct FileMap(Vec<(FileId, RelativePathBuf)>); 18struct FileMap(Vec<(FileId, RelativePathBuf)>);
@@ -39,7 +41,7 @@ impl FileResolver for FileMap {
39 } 41 }
40} 42}
41 43
42fn analysis_host(files: &'static [(&'static str, &'static str)]) -> AnalysisHost { 44fn analysis_host(files: &[(&str, &str)]) -> AnalysisHost {
43 let mut host = AnalysisHost::new(); 45 let mut host = AnalysisHost::new();
44 let mut file_map = Vec::new(); 46 let mut file_map = Vec::new();
45 for (id, &(path, contents)) in files.iter().enumerate() { 47 for (id, &(path, contents)) in files.iter().enumerate() {
@@ -53,10 +55,20 @@ fn analysis_host(files: &'static [(&'static str, &'static str)]) -> AnalysisHost
53 host 55 host
54} 56}
55 57
56fn analysis(files: &'static [(&'static str, &'static str)]) -> Analysis { 58fn analysis(files: &[(&str, &str)]) -> Analysis {
57 analysis_host(files).analysis() 59 analysis_host(files).analysis()
58} 60}
59 61
62fn get_signature(text: &str) -> (FnDescriptor, Option<usize>) {
63 let (offset, code) = extract_offset(text);
64 let code = code.as_str();
65
66 let (_handle, token) = JobHandle::new();
67 let snap = analysis(&[("/lib.rs", code)]);
68
69 snap.resolve_callable(FileId(1), offset, &token).unwrap()
70}
71
60#[test] 72#[test]
61fn test_resolve_module() { 73fn test_resolve_module() {
62 let snap = analysis(&[ 74 let snap = analysis(&[
@@ -145,3 +157,85 @@ fn test_resolve_crate_root() {
145 vec![CrateId(1)], 157 vec![CrateId(1)],
146 ); 158 );
147} 159}
160
161#[test]
162fn test_fn_signature_two_args_first() {
163 let (desc, param) = get_signature(
164r#"fn foo(x: u32, y: u32) -> u32 {x + y}
165fn bar() { foo(<|>3, ); }"#);
166
167 assert_eq!(desc.name, Some("foo".into()));
168 assert_eq!(desc.params, vec!("x".to_string(),"y".to_string()));
169 assert_eq!(desc.ret_type, Some("-> u32".into()));
170 assert_eq!(param, Some(0));
171}
172
173#[test]
174fn test_fn_signature_two_args_second() {
175 let (desc, param) = get_signature(
176 r#"fn foo(x: u32, y: u32) -> u32 {x + y}
177fn bar() { foo(3, <|>); }"#);
178
179 assert_eq!(desc.name, Some("foo".into()));
180 assert_eq!(desc.params, vec!("x".to_string(),"y".to_string()));
181 assert_eq!(desc.ret_type, Some("-> u32".into()));
182 assert_eq!(param, Some(1));
183}
184
185#[test]
186fn test_fn_signature_for_impl() {
187 let (desc, param) = get_signature(
188r#"struct F; impl F { pub fn new() { F{}} }
189fn bar() {let _ : F = F::new(<|>);}"#);
190
191 assert_eq!(desc.name, Some("new".into()));
192 assert_eq!(desc.params, Vec::<String>::new());
193 assert_eq!(desc.ret_type, None);
194 assert_eq!(param, None);
195}
196
197#[test]
198fn test_fn_signature_for_method_self() {
199 let (desc, param) = get_signature(
200r#"struct F;
201impl F {
202 pub fn new() -> F{
203 F{}
204 }
205
206 pub fn do_it(&self) {}
207}
208
209fn bar() {
210 let f : F = F::new();
211 f.do_it(<|>);
212}"#);
213
214 assert_eq!(desc.name, Some("do_it".into()));
215 assert_eq!(desc.params, vec!["&self".to_string()]);
216 assert_eq!(desc.ret_type, None);
217 assert_eq!(param, None);
218}
219
220#[test]
221fn test_fn_signature_for_method_with_arg() {
222 let (desc, param) = get_signature(
223r#"struct F;
224impl F {
225 pub fn new() -> F{
226 F{}
227 }
228
229 pub fn do_it(&self, x: i32) {}
230}
231
232fn bar() {
233 let f : F = F::new();
234 f.do_it(<|>);
235}"#);
236
237 assert_eq!(desc.name, Some("do_it".into()));
238 assert_eq!(desc.params, vec!["&self".to_string(), "x".to_string()]);
239 assert_eq!(desc.ret_type, None);
240 assert_eq!(param, Some(1));
241} \ No newline at end of file