]> git.lizzy.rs Git - rust.git/commitdiff
Draft the new lsp handler
authorKirill Bulatov <mail4score@gmail.com>
Sat, 28 Nov 2020 14:26:30 +0000 (16:26 +0200)
committerKirill Bulatov <mail4score@gmail.com>
Mon, 7 Dec 2020 21:41:08 +0000 (23:41 +0200)
crates/completion/src/item.rs
crates/rust-analyzer/src/caps.rs
crates/rust-analyzer/src/handlers.rs
crates/rust-analyzer/src/main_loop.rs
crates/rust-analyzer/src/to_proto.rs

index e85549fef4d45370defc2ea58546fb69e55e5a5e..ce6a44e57dbffac4bdf0a8b3fc2914606136f21e 100644 (file)
@@ -3,11 +3,8 @@
 use std::fmt;
 
 use hir::{Documentation, ModPath, Mutability};
-use ide_db::helpers::{
-    insert_use::{self, ImportScope, MergeBehaviour},
-    mod_path_to_ast,
-};
-use syntax::{algo, TextRange};
+use ide_db::helpers::insert_use::{ImportScope, MergeBehaviour};
+use syntax::TextRange;
 use text_edit::TextEdit;
 
 use crate::config::SnippetCap;
@@ -65,6 +62,10 @@ pub struct CompletionItem {
     /// Indicates that a reference or mutable reference to this variable is a
     /// possible match.
     ref_match: Option<(Mutability, CompletionScore)>,
+
+    /// The data later to be used in the `completionItem/resolve` response
+    /// to add the insert import edit.
+    import_to_add: Option<ImportToAdd>,
 }
 
 // We use custom debug for CompletionItem to make snapshot tests more readable.
@@ -294,11 +295,9 @@ pub(crate) fn build(self) -> CompletionItem {
         let mut label = self.label;
         let mut lookup = self.lookup;
         let mut insert_text = self.insert_text;
-        let mut text_edits = TextEdit::builder();
 
-        if let Some(import_data) = self.import_to_add {
-            let import = mod_path_to_ast(&import_data.import_path);
-            let mut import_path_without_last_segment = import_data.import_path;
+        if let Some(import_to_add) = self.import_to_add.as_ref() {
+            let mut import_path_without_last_segment = import_to_add.import_path.to_owned();
             let _ = import_path_without_last_segment.segments.pop();
 
             if !import_path_without_last_segment.segments.is_empty() {
@@ -310,32 +309,20 @@ pub(crate) fn build(self) -> CompletionItem {
                 }
                 label = format!("{}::{}", import_path_without_last_segment, label);
             }
-
-            let rewriter = insert_use::insert_use(
-                &import_data.import_scope,
-                import,
-                import_data.merge_behaviour,
-            );
-            if let Some(old_ast) = rewriter.rewrite_root() {
-                algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut text_edits);
-            }
         }
 
-        let original_edit = match self.text_edit {
+        let text_edit = match self.text_edit {
             Some(it) => it,
             None => {
                 TextEdit::replace(self.source_range, insert_text.unwrap_or_else(|| label.clone()))
             }
         };
 
-        let mut resulting_edit = text_edits.finish();
-        resulting_edit.union(original_edit).expect("Failed to unite text edits");
-
         CompletionItem {
             source_range: self.source_range,
             label,
             insert_text_format: self.insert_text_format,
-            text_edit: resulting_edit,
+            text_edit,
             detail: self.detail,
             documentation: self.documentation,
             lookup,
@@ -345,6 +332,7 @@ pub(crate) fn build(self) -> CompletionItem {
             trigger_call_info: self.trigger_call_info.unwrap_or(false),
             score: self.score,
             ref_match: self.ref_match,
+            import_to_add: self.import_to_add,
         }
     }
     pub(crate) fn lookup_by(mut self, lookup: impl Into<String>) -> Builder {
index c7203451ca6a700bcd9ce84318e3fb5f6ff1cb95..c559e1a3d6f8aa80ff3d4ce16236ebc20a8e2d60 100644 (file)
@@ -30,7 +30,7 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
         })),
         hover_provider: Some(HoverProviderCapability::Simple(true)),
         completion_provider: Some(CompletionOptions {
-            resolve_provider: None,
+            resolve_provider: Some(true),
             trigger_characters: Some(vec![":".to_string(), ".".to_string()]),
             work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None },
         }),
index 1cf4139d2bb30e1a31525f212518d5fd28c33593..255a6e489c0461f9e39bc0216c82cbaea3c52124 100644 (file)
@@ -577,6 +577,16 @@ pub(crate) fn handle_completion(
     Ok(Some(completion_list.into()))
 }
 
+pub(crate) fn handle_resolve_completion(
+    snap: GlobalStateSnapshot,
+    original_completion: CompletionItem,
+) -> Result<CompletionItem> {
+    let _p = profile::span("handle_resolve_completion");
+    // TODO kb use the field to detect it's for autocompletion and do the insert logic
+    let _data = dbg!(original_completion).data;
+    Ok(original_completion)
+}
+
 pub(crate) fn handle_folding_range(
     snap: GlobalStateSnapshot,
     params: FoldingRangeParams,
index 55d46b09e78c7ffedc96b27a7321bc40ddec28ae..12b0946ac6d16ecdaf83e88ff9a6b9f23f7952ec 100644 (file)
@@ -454,6 +454,7 @@ fn on_request(&mut self, request_received: Instant, req: Request) -> Result<()>
             .on::<lsp_types::request::GotoImplementation>(handlers::handle_goto_implementation)
             .on::<lsp_types::request::GotoTypeDefinition>(handlers::handle_goto_type_definition)
             .on::<lsp_types::request::Completion>(handlers::handle_completion)
+            .on::<lsp_types::request::ResolveCompletionItem>(handlers::handle_resolve_completion)
             .on::<lsp_types::request::CodeLensRequest>(handlers::handle_code_lens)
             .on::<lsp_types::request::CodeLensResolve>(handlers::handle_code_lens_resolve)
             .on::<lsp_types::request::FoldingRangeRequest>(handlers::handle_folding_range)
index 01eabe8526a561e279a41be34635e1c49ce46f09..db9ed08f6f2f88cab362271b1757a9d96b40fdc7 100644 (file)
@@ -231,6 +231,35 @@ fn set_score(res: &mut lsp_types::CompletionItem, label: &str) {
         None => vec![res],
     };
 
+    // TODO kb need to get this logic away and store for the later resolve request
+    /*
+    let mut label = self.label;
+    let mut lookup = self.lookup;
+    let mut insert_text = self.insert_text;
+    let mut text_edits = TextEdit::builder();
+
+    if let Some((import_path, import_scope, merge_behaviour)) = completion_item.import_data.as_ref() {
+        let import = mod_path_to_ast(&import_path);
+            let mut import_path_without_last_segment = import_path;
+            let _ = import_path_without_last_segment.segments.pop();
+
+            if !import_path_without_last_segment.segments.is_empty() {
+                if lookup.is_none() {
+                    lookup = Some(label.clone());
+                }
+                if insert_text.is_none() {
+                    insert_text = Some(label.clone());
+                }
+                label = format!("{}::{}", import_path_without_last_segment, label);
+            }
+
+            let rewriter = insert_use(&import_scope, import, merge_behaviour);
+            if let Some(old_ast) = rewriter.rewrite_root() {
+                algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut text_edits);
+            }
+    }
+    */
+
     for mut r in all_results.iter_mut() {
         r.insert_text_format = Some(insert_text_format(completion_item.insert_text_format()));
     }