From 4092b8d0b58598d0b4b820fff37b1d8c741c47b9 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 21 Dec 2018 15:19:46 +0300 Subject: make compleion item details private --- crates/ra_analysis/src/completion.rs | 13 +++++++-- .../ra_analysis/src/completion/completion_item.rs | 34 ++++++++++++++++++---- .../src/completion/reference_completion.rs | 30 ++++++++----------- crates/ra_analysis/src/lib.rs | 2 +- crates/ra_lsp_server/src/main_loop/handlers.rs | 22 +++++++++----- 5 files changed, 65 insertions(+), 36 deletions(-) (limited to 'crates') diff --git a/crates/ra_analysis/src/completion.rs b/crates/ra_analysis/src/completion.rs index fd7b78c2a..222b6854c 100644 --- a/crates/ra_analysis/src/completion.rs +++ b/crates/ra_analysis/src/completion.rs @@ -18,7 +18,7 @@ use crate::{ Cancelable, FilePosition }; -pub use crate::completion::completion_item::CompletionItem; +pub use crate::completion::completion_item::{CompletionItem, InsertText}; pub(crate) fn completions( db: &db::RootDatabase, @@ -109,13 +109,20 @@ mod tests { use super::*; + fn is_snippet(completion_item: &CompletionItem) -> bool { + match completion_item.insert_text() { + InsertText::Snippet { .. } => true, + _ => false, + } + } + fn check_scope_completion(code: &str, expected_completions: &str) { let (analysis, position) = single_file_with_position(code); let completions = completions(&analysis.imp.db, position) .unwrap() .unwrap() .into_iter() - .filter(|c| c.snippet.is_none()) + .filter(|c| !is_snippet(c)) .collect::>(); assert_eq_dbg(expected_completions, &completions); } @@ -126,7 +133,7 @@ mod tests { .unwrap() .unwrap() .into_iter() - .filter(|c| c.snippet.is_some()) + .filter(is_snippet) .collect::>(); assert_eq_dbg(expected_completions, &completions); } diff --git a/crates/ra_analysis/src/completion/completion_item.rs b/crates/ra_analysis/src/completion/completion_item.rs index 7edb86436..4280976e7 100644 --- a/crates/ra_analysis/src/completion/completion_item.rs +++ b/crates/ra_analysis/src/completion/completion_item.rs @@ -1,11 +1,13 @@ #[derive(Debug)] pub struct CompletionItem { - /// What user sees in pop-up in the UI. - pub label: String, - /// What string is used for filtering, defaults to label. - pub lookup: Option, - /// What is inserted, defaults to label. - pub snippet: Option, + label: String, + lookup: Option, + snippet: Option, +} + +pub enum InsertText { + PlainText { text: String }, + Snippet { text: String }, } impl CompletionItem { @@ -17,6 +19,26 @@ impl CompletionItem { snippet: None, } } + /// What user sees in pop-up in the UI. + pub fn label(&self) -> &str { + &self.label + } + /// What string is used for filtering. + pub fn lookup(&self) -> &str { + self.lookup + .as_ref() + .map(|it| it.as_str()) + .unwrap_or(self.label()) + } + /// What is inserted. + pub fn insert_text(&self) -> InsertText { + match &self.snippet { + None => InsertText::PlainText { + text: self.label.clone(), + }, + Some(it) => InsertText::Snippet { text: it.clone() }, + } + } } #[must_use] diff --git a/crates/ra_analysis/src/completion/reference_completion.rs b/crates/ra_analysis/src/completion/reference_completion.rs index 23052295c..f9f01a642 100644 --- a/crates/ra_analysis/src/completion/reference_completion.rs +++ b/crates/ra_analysis/src/completion/reference_completion.rs @@ -39,25 +39,19 @@ pub(super) fn completions( } let module_scope = module.scope(db)?; - acc.extend( - module_scope - .entries() - .filter(|(_name, res)| { - // Don't expose this item - match res.import { - None => true, - Some(import) => { - let range = import.range(db, module.source().file_id()); - !range.is_subrange(&name_ref.syntax().range()) - } + module_scope + .entries() + .filter(|(_name, res)| { + // Don't expose this item + match res.import { + None => true, + Some(import) => { + let range = import.range(db, module.source().file_id()); + !range.is_subrange(&name_ref.syntax().range()) } - }) - .map(|(name, _res)| CompletionItem { - label: name.to_string(), - lookup: None, - snippet: None, - }), - ); + } + }) + .for_each(|(name, _res)| CompletionItem::new(name.to_string()).add_to(acc)); } NameRefKind::Path(path) => complete_path(acc, db, module, path)?, NameRefKind::BareIdentInMod => { diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index c7e7dc1c0..1c8aa308b 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs @@ -30,7 +30,7 @@ use crate::{ }; pub use crate::{ - completion::CompletionItem, + completion::{CompletionItem, InsertText}, }; pub use ra_editor::{ FileSymbol, Fold, FoldKind, HighlightedRange, LineIndex, Runnable, RunnableKind, StructureNode, diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index 1751d7fa8..2dfeb061a 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs @@ -8,7 +8,7 @@ use languageserver_types::{ PrepareRenameResponse, RenameParams, SymbolInformation, TextDocumentIdentifier, TextEdit, WorkspaceEdit, ParameterInformation, ParameterLabel, SignatureInformation, Hover, HoverContents, }; -use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FilePosition}; +use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FilePosition, InsertText}; use ra_syntax::{TextUnit, text_utils::intersect}; use ra_text_edit::text_utils::contains_offset_nonstrict; use rustc_hash::FxHashMap; @@ -423,15 +423,21 @@ pub fn handle_completion( .into_iter() .map(|item| { let mut res = CompletionItem { - label: item.label, - filter_text: item.lookup, + label: item.label().to_string(), + filter_text: Some(item.lookup().to_string()), ..Default::default() }; - if let Some(snip) = item.snippet { - res.insert_text = Some(snip); - res.insert_text_format = Some(InsertTextFormat::Snippet); - res.kind = Some(CompletionItemKind::Keyword); - }; + match item.insert_text() { + InsertText::PlainText { text } => { + res.insert_text = Some(text); + res.insert_text_format = Some(InsertTextFormat::PlainText); + } + InsertText::Snippet { text } => { + res.insert_text = Some(text); + res.insert_text_format = Some(InsertTextFormat::Snippet); + res.kind = Some(CompletionItemKind::Keyword); + } + } res }) .collect(); -- cgit v1.2.3