From 2f2feef9afe8f1c75f743a56f945a1560ca85af4 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 3 Sep 2018 15:46:14 +0300 Subject: completion for trait params --- crates/libeditor/src/completion.rs | 41 ++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'crates/libeditor') diff --git a/crates/libeditor/src/completion.rs b/crates/libeditor/src/completion.rs index 6c3775127..c25b4c217 100644 --- a/crates/libeditor/src/completion.rs +++ b/crates/libeditor/src/completion.rs @@ -35,11 +35,17 @@ pub fn scope_completion(file: &File, offset: TextUnit) -> Option(file.syntax(), offset) { has_completions = true; - complete_name_ref(&file, name_ref, &mut res) + complete_name_ref(&file, name_ref, &mut res); + // special case, `trait T { fn foo(i_am_a_name_ref) {} }` + if is_node::(name_ref.syntax()) { + param_completions(name_ref.syntax(), &mut res); + } } if let Some(name) = find_node_at_offset::(file.syntax(), offset) { - has_completions = true; - complete_name(&file, name, &mut res) + if is_node::(name.syntax()) { + has_completions = true; + param_completions(name.syntax(), &mut res); + } } if has_completions { Some(res) @@ -71,15 +77,12 @@ fn complete_name_ref(file: &File, name_ref: ast::NameRef, acc: &mut Vec) { - if !is_node::(name.syntax()) { - return; - } - +fn param_completions(ctx: SyntaxNodeRef, acc: &mut Vec) { let mut params = HashMap::new(); - for node in ancestors(name.syntax()) { + for node in ancestors(ctx) { let _ = visitor_ctx(&mut params) .visit::(process) + .visit::(process) .accept(node); } params.into_iter() @@ -420,16 +423,34 @@ mod tests { } #[test] - fn test_param_completion() { + fn test_param_completion_last_param() { check_scope_completion(r" fn foo(file_id: FileId) {} fn bar(file_id: FileId) {} fn baz(file<|>) {} ", r#"[CompletionItem { label: "file_id: FileId", lookup: Some("file_id"), snippet: None }]"#); + } + + #[test] + fn test_param_completion_nth_param() { check_scope_completion(r" fn foo(file_id: FileId) {} fn bar(file_id: FileId) {} fn baz(file<|>, x: i32) {} ", r#"[CompletionItem { label: "file_id: FileId", lookup: Some("file_id"), snippet: None }]"#); } + + #[test] + fn test_param_completion_trait_param() { + check_scope_completion(r" + pub(crate) trait SourceRoot { + pub fn contains(&self, file_id: FileId) -> bool; + pub fn module_map(&self) -> &ModuleMap; + pub fn lines(&self, file_id: FileId) -> &LineIndex; + pub fn syntax(&self, file<|>) + } + ", r#"[CompletionItem { label: "self", lookup: None, snippet: None }, + CompletionItem { label: "SourceRoot", lookup: None, snippet: None }, + CompletionItem { label: "file_id: FileId", lookup: Some("file_id"), snippet: None }]"#); + } } -- cgit v1.2.3