From 582cee2cdf5355b681f14bbb33bd5c431c284d87 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 25 Feb 2021 01:06:31 +0200 Subject: Return more data about located imports --- crates/ide_completion/src/item.rs | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'crates/ide_completion/src/item.rs') diff --git a/crates/ide_completion/src/item.rs b/crates/ide_completion/src/item.rs index 9b2435c4b..0390fe226 100644 --- a/crates/ide_completion/src/item.rs +++ b/crates/ide_completion/src/item.rs @@ -2,9 +2,10 @@ use std::fmt; -use hir::{Documentation, ModPath, Mutability}; +use hir::{Documentation, Mutability}; use ide_db::{ helpers::{ + import_assets::LocatedImport, insert_use::{self, ImportScope, InsertUseConfig}, mod_path_to_ast, SnippetCap, }, @@ -272,7 +273,7 @@ impl CompletionItem { /// An extra import to add after the completion is applied. #[derive(Debug, Clone)] pub struct ImportEdit { - pub import_path: ModPath, + pub import: LocatedImport, pub import_scope: ImportScope, pub import_for_trait_assoc_item: bool, } @@ -283,8 +284,11 @@ impl ImportEdit { pub fn to_text_edit(&self, cfg: InsertUseConfig) -> Option { let _p = profile::span("ImportEdit::to_text_edit"); - let rewriter = - insert_use::insert_use(&self.import_scope, mod_path_to_ast(&self.import_path), cfg); + let rewriter = insert_use::insert_use( + &self.import_scope, + mod_path_to_ast(self.import.import_path()), + cfg, + ); let old_ast = rewriter.rewrite_root()?; let mut import_insert = TextEdit::builder(); algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut import_insert); @@ -323,19 +327,13 @@ impl Builder { let mut insert_text = self.insert_text; if let Some(import_to_add) = self.import_to_add.as_ref() { + lookup = lookup.or_else(|| Some(label.clone())); + insert_text = insert_text.or_else(|| Some(label.clone())); + let display_path = import_to_add.import.display_path(); if import_to_add.import_for_trait_assoc_item { - lookup = lookup.or_else(|| Some(label.clone())); - insert_text = insert_text.or_else(|| Some(label.clone())); - label = format!("{} ({})", label, import_to_add.import_path); + label = format!("{} ({})", label, display_path); } else { - let mut import_path_without_last_segment = import_to_add.import_path.to_owned(); - let _ = import_path_without_last_segment.pop_segment(); - - if !import_path_without_last_segment.segments().is_empty() { - lookup = lookup.or_else(|| Some(label.clone())); - insert_text = insert_text.or_else(|| Some(label.clone())); - label = format!("{}::{}", import_path_without_last_segment, label); - } + label = display_path.to_string(); } } -- cgit v1.2.3 From 33c83e72b9b48177a6171fd06a26676679963a4d Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Wed, 3 Mar 2021 01:26:53 +0200 Subject: Work towards better import labels --- crates/ide_completion/src/item.rs | 43 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-) (limited to 'crates/ide_completion/src/item.rs') diff --git a/crates/ide_completion/src/item.rs b/crates/ide_completion/src/item.rs index 0390fe226..d01620500 100644 --- a/crates/ide_completion/src/item.rs +++ b/crates/ide_completion/src/item.rs @@ -275,7 +275,6 @@ impl CompletionItem { pub struct ImportEdit { pub import: LocatedImport, pub import_scope: ImportScope, - pub import_for_trait_assoc_item: bool, } impl ImportEdit { @@ -286,7 +285,7 @@ impl ImportEdit { let rewriter = insert_use::insert_use( &self.import_scope, - mod_path_to_ast(self.import.import_path()), + mod_path_to_ast(&self.import.import_path), cfg, ); let old_ast = rewriter.rewrite_root()?; @@ -303,6 +302,7 @@ impl ImportEdit { pub(crate) struct Builder { source_range: TextRange, completion_kind: CompletionKind, + // TODO kb also add a db here, to resolve the completion label? import_to_add: Option, label: String, insert_text: Option, @@ -322,19 +322,22 @@ impl Builder { pub(crate) fn build(self) -> CompletionItem { let _p = profile::span("item::Builder::build"); - let mut label = self.label; - let mut lookup = self.lookup; - let mut insert_text = self.insert_text; - - if let Some(import_to_add) = self.import_to_add.as_ref() { - lookup = lookup.or_else(|| Some(label.clone())); - insert_text = insert_text.or_else(|| Some(label.clone())); - let display_path = import_to_add.import.display_path(); - if import_to_add.import_for_trait_assoc_item { - label = format!("{} ({})", label, display_path); - } else { - label = display_path.to_string(); - } + let label = self.label; + let lookup = self.lookup; + let insert_text = self.insert_text; + + if let Some(_import_to_add) = self.import_to_add.as_ref() { + todo!("todo kb") + // let import = &import_to_add.import; + // let item_to_import = import.item_to_import(); + // lookup = lookup.or_else(|| Some(label.clone())); + // insert_text = insert_text.or_else(|| Some(label.clone())); + // let display_path = import_to_add.import.display_path(); + // if import_to_add.import { + // label = format!("{} ({})", label, display_path); + // } else { + // label = display_path.to_string(); + // } } let text_edit = match self.text_edit { @@ -438,8 +441,8 @@ impl Builder { } } -impl<'a> Into for Builder { - fn into(self) -> CompletionItem { - self.build() - } -} +// impl<'a> Into for Builder { +// fn into(self) -> CompletionItem { +// self.build() +// } +// } -- cgit v1.2.3 From 24a5d3b19dfa3e076df8b7413d0cc4a547aeb7d7 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Wed, 3 Mar 2021 23:55:21 +0200 Subject: Fix the completion labels and tests --- crates/ide_completion/src/item.rs | 41 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'crates/ide_completion/src/item.rs') diff --git a/crates/ide_completion/src/item.rs b/crates/ide_completion/src/item.rs index d01620500..44e4a6dfd 100644 --- a/crates/ide_completion/src/item.rs +++ b/crates/ide_completion/src/item.rs @@ -11,7 +11,7 @@ use ide_db::{ }, SymbolKind, }; -use stdx::{impl_from, never}; +use stdx::{format_to, impl_from, never}; use syntax::{algo, TextRange}; use text_edit::TextEdit; @@ -274,7 +274,7 @@ impl CompletionItem { #[derive(Debug, Clone)] pub struct ImportEdit { pub import: LocatedImport, - pub import_scope: ImportScope, + pub scope: ImportScope, } impl ImportEdit { @@ -284,7 +284,7 @@ impl ImportEdit { let _p = profile::span("ImportEdit::to_text_edit"); let rewriter = insert_use::insert_use( - &self.import_scope, + &self.scope, mod_path_to_ast(&self.import.import_path), cfg, ); @@ -302,7 +302,6 @@ impl ImportEdit { pub(crate) struct Builder { source_range: TextRange, completion_kind: CompletionKind, - // TODO kb also add a db here, to resolve the completion label? import_to_add: Option, label: String, insert_text: Option, @@ -322,22 +321,24 @@ impl Builder { pub(crate) fn build(self) -> CompletionItem { let _p = profile::span("item::Builder::build"); - let label = self.label; - let lookup = self.lookup; - let insert_text = self.insert_text; - - if let Some(_import_to_add) = self.import_to_add.as_ref() { - todo!("todo kb") - // let import = &import_to_add.import; - // let item_to_import = import.item_to_import(); - // lookup = lookup.or_else(|| Some(label.clone())); - // insert_text = insert_text.or_else(|| Some(label.clone())); - // let display_path = import_to_add.import.display_path(); - // if import_to_add.import { - // label = format!("{} ({})", label, display_path); - // } else { - // label = display_path.to_string(); - // } + let mut label = self.label; + let mut lookup = self.lookup; + let mut insert_text = self.insert_text; + + if let Some(original_path) = self + .import_to_add + .as_ref() + .and_then(|import_edit| import_edit.import.original_path.as_ref()) + { + lookup = lookup.or_else(|| Some(label.clone())); + insert_text = insert_text.or_else(|| Some(label.clone())); + + let original_path_label = original_path.to_string(); + if original_path_label.ends_with(&label) { + label = original_path_label; + } else { + format_to!(label, " ({})", original_path) + } } let text_edit = match self.text_edit { -- cgit v1.2.3 From c56b59d37781f6eb7caee76de2c8a1bbc9d169dc Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Fri, 5 Mar 2021 00:29:39 +0200 Subject: Cleanup --- crates/ide_completion/src/item.rs | 6 ------ 1 file changed, 6 deletions(-) (limited to 'crates/ide_completion/src/item.rs') diff --git a/crates/ide_completion/src/item.rs b/crates/ide_completion/src/item.rs index 44e4a6dfd..06f16a2c7 100644 --- a/crates/ide_completion/src/item.rs +++ b/crates/ide_completion/src/item.rs @@ -441,9 +441,3 @@ impl Builder { self } } - -// impl<'a> Into for Builder { -// fn into(self) -> CompletionItem { -// self.build() -// } -// } -- cgit v1.2.3 From db61d4ea13113cd6c4e0661075ea9b2f739be862 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sun, 7 Mar 2021 11:58:43 +0200 Subject: Rebase leftovers --- crates/ide_completion/src/item.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'crates/ide_completion/src/item.rs') diff --git a/crates/ide_completion/src/item.rs b/crates/ide_completion/src/item.rs index 06f16a2c7..9b039e3e5 100644 --- a/crates/ide_completion/src/item.rs +++ b/crates/ide_completion/src/item.rs @@ -283,11 +283,8 @@ impl ImportEdit { pub fn to_text_edit(&self, cfg: InsertUseConfig) -> Option { let _p = profile::span("ImportEdit::to_text_edit"); - let rewriter = insert_use::insert_use( - &self.scope, - mod_path_to_ast(&self.import.import_path), - cfg, - ); + let rewriter = + insert_use::insert_use(&self.scope, mod_path_to_ast(&self.import.import_path), cfg); let old_ast = rewriter.rewrite_root()?; let mut import_insert = TextEdit::builder(); algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut import_insert); -- cgit v1.2.3