From 005bc49d744f6a7c2ef38a4abd3327b0804709d1 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sat, 20 Feb 2021 23:32:21 +0200 Subject: Test and initial refactoring --- crates/ide_completion/src/completions/flyimport.rs | 37 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index f34764b61..16384551c 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -168,15 +168,15 @@ fn import_assets(ctx: &CompletionContext, fuzzy_name: String) -> Option Date: Wed, 24 Feb 2021 01:20:00 +0200 Subject: Draft the qualifier import resolution --- crates/ide_completion/src/completions/flyimport.rs | 84 +++++++++++++++++++++- 1 file changed, 81 insertions(+), 3 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 16384551c..64b60bbdd 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -775,18 +775,92 @@ fn main() { } #[test] - fn unresolved_qualifiers() { + fn unresolved_qualifier() { + check_edit( + "Item", + r#" +mod foo { + pub mod bar { + pub mod baz { + pub struct Item; + } + } +} + +fn main() { + bar::baz::Ite$0 +} +"#, + r#" +use foo::bar; + +mod foo { + pub mod bar { + pub mod baz { + pub struct Item; + } + } +} + +fn main() { + bar::baz::Item +} +"#, + ); + } + + #[test] + fn unresolved_assoc_item_container() { + check_edit( + "Item", + r#" +mod foo { + pub struct Item; + + impl Item { + pub const TEST_ASSOC: usize = 3; + } +} + +fn main() { + Item::TEST_A$0; +} +"#, + r#" +use foo::Item; + +mod foo { + pub struct Item; + + impl Item { + pub const TEST_ASSOC: usize = 3; + } +} + +fn main() { + Item::TEST_ASSOC +} +"#, + ); + } + + #[test] + fn unresolved_assoc_item_container_with_path() { check_edit( "Item", r#" mod foo { pub mod bar { pub struct Item; + + impl Item { + pub const TEST_ASSOC: usize = 3; + } } } fn main() { - bar::Ite$0 + bar::Item::TEST_A$0; } "#, r#" @@ -795,11 +869,15 @@ use foo::bar; mod foo { pub mod bar { pub struct Item; + + impl Item { + pub const TEST_ASSOC: usize = 3; + } } } fn main() { - bar::Item + bar::Item::TEST_ASSOC } "#, ); -- cgit v1.2.3 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/completions/flyimport.rs | 23 ++++++++++------------ 1 file changed, 10 insertions(+), 13 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 64b60bbdd..8ff76688e 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -96,21 +96,21 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) let mut all_mod_paths = import_assets .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind) .into_iter() - .map(|(mod_path, item_in_ns)| { - let scope_item = match item_in_ns { + .map(|import| { + let proposed_def = match import.item_to_import() { hir::ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), hir::ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), hir::ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), }; - (mod_path, scope_item) + (import, proposed_def) }) .filter(|(_, proposed_def)| !scope_definitions.contains(proposed_def)) .collect::>(); - all_mod_paths.sort_by_cached_key(|(mod_path, _)| { - compute_fuzzy_completion_order_key(mod_path, &user_input_lowercased) + all_mod_paths.sort_by_cached_key(|(import, _)| { + compute_fuzzy_completion_order_key(import.display_path(), &user_input_lowercased) }); - acc.add_all(all_mod_paths.into_iter().filter_map(|(import_path, definition)| { + acc.add_all(all_mod_paths.into_iter().filter_map(|(import, definition)| { let import_for_trait_assoc_item = match definition { ScopeDef::ModuleDef(module_def) => module_def .as_assoc_item(ctx.db) @@ -118,11 +118,8 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) .is_some(), _ => false, }; - let import_edit = ImportEdit { - import_path, - import_scope: import_scope.clone(), - import_for_trait_assoc_item, - }; + let import_edit = + ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item }; render_resolution_with_import(RenderContext::new(ctx), import_edit, &definition) })); Some(()) @@ -186,11 +183,11 @@ fn compute_fuzzy_completion_order_key( user_input_lowercased: &str, ) -> usize { cov_mark::hit!(certain_fuzzy_order_test); - let proposed_import_name = match proposed_mod_path.segments().last() { + let import_name = match proposed_mod_path.segments().last() { Some(name) => name.to_string().to_lowercase(), None => return usize::MAX, }; - match proposed_import_name.match_indices(user_input_lowercased).next() { + match import_name.match_indices(user_input_lowercased).next() { Some((first_matching_index, _)) => first_matching_index, None => usize::MAX, } -- cgit v1.2.3 From d386481fac65e988fa4d13c1bc8d4ddb2bc490c6 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 25 Feb 2021 01:53:59 +0200 Subject: Fix some tests --- crates/ide_completion/src/completions/flyimport.rs | 65 ++++++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 8ff76688e..e33fc4b78 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -97,7 +97,7 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind) .into_iter() .map(|import| { - let proposed_def = match import.item_to_import() { + let proposed_def = match import.item_to_display() { hir::ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), hir::ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), hir::ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), @@ -809,7 +809,7 @@ fn main() { #[test] fn unresolved_assoc_item_container() { check_edit( - "Item", + "TEST_ASSOC", r#" mod foo { pub struct Item; @@ -820,7 +820,7 @@ mod foo { } fn main() { - Item::TEST_A$0; + Item::TEST_A$0 } "#, r#" @@ -844,7 +844,7 @@ fn main() { #[test] fn unresolved_assoc_item_container_with_path() { check_edit( - "Item", + "TEST_ASSOC", r#" mod foo { pub mod bar { @@ -857,7 +857,7 @@ mod foo { } fn main() { - bar::Item::TEST_A$0; + bar::Item::TEST_A$0 } "#, r#" @@ -876,6 +876,61 @@ mod foo { fn main() { bar::Item::TEST_ASSOC } +"#, + ); + } + + #[test] + fn unresolved_assoc_item_container_and_trait_with_path() { + check_edit( + "TEST_ASSOC", + r#" +mod foo { + pub mod bar { + pub trait SomeTrait { + const TEST_ASSOC: usize; + } + } + + pub mod baz { + use super::bar::SomeTrait; + + pub struct Item; + + impl SomeTrait for Item { + const TEST_ASSOC: usize = 3; + } + } +} + +fn main() { + baz::Item::TEST_A$0 +} +"#, + r#" +use foo::{bar::SomeTrait, baz}; + +mod foo { + pub mod bar { + pub trait SomeTrait { + const TEST_ASSOC: usize; + } + } + + pub mod baz { + use super::bar::SomeTrait; + + pub struct Item; + + impl SomeTrait for Item { + const TEST_ASSOC: usize = 3; + } + } +} + +fn main() { + baz::Item::TEST_ASSOC +} "#, ); } -- cgit v1.2.3 From 9482353fa8e1e88cb720a029b9bb6304819c7399 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sun, 28 Feb 2021 09:57:54 +0200 Subject: Properly handle turbofishes in qualifiers --- crates/ide_completion/src/completions/flyimport.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index e33fc4b78..af49fdd26 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -669,8 +669,8 @@ fn main() { } "#, expect![[r#" - ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED fn weird_function() (dep::test_mod::TestTrait) -> () DEPRECATED + ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED "#]], ); } -- cgit v1.2.3 From 89d410cef571f5fa7631b17e2fbe52a8f8f03990 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sun, 28 Feb 2021 10:32:15 +0200 Subject: Do not propose already imported imports --- crates/ide_completion/src/completions/flyimport.rs | 23 +++++++--------------- 1 file changed, 7 insertions(+), 16 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index af49fdd26..d6adf70b1 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -48,12 +48,11 @@ //! Note that having this flag set to `true` does not guarantee that the feature is enabled: your client needs to have the corredponding //! capability enabled. -use hir::{AsAssocItem, ModPath, ScopeDef}; +use hir::{AsAssocItem, ItemInNs, ModPath, ScopeDef}; use ide_db::helpers::{ import_assets::{ImportAssets, ImportCandidate}, insert_use::ImportScope, }; -use rustc_hash::FxHashSet; use syntax::{AstNode, SyntaxNode, T}; use crate::{ @@ -92,19 +91,17 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) &ctx.sema, )?; - let scope_definitions = scope_definitions(ctx); let mut all_mod_paths = import_assets .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind) .into_iter() .map(|import| { let proposed_def = match import.item_to_display() { - hir::ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), - hir::ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), - hir::ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), + ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), + ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), + ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), }; (import, proposed_def) }) - .filter(|(_, proposed_def)| !scope_definitions.contains(proposed_def)) .collect::>(); all_mod_paths.sort_by_cached_key(|(import, _)| { compute_fuzzy_completion_order_key(import.display_path(), &user_input_lowercased) @@ -125,14 +122,6 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) Some(()) } -fn scope_definitions(ctx: &CompletionContext) -> FxHashSet { - let mut scope_definitions = FxHashSet::default(); - ctx.scope.process_all_names(&mut |_, scope_def| { - scope_definitions.insert(scope_def); - }); - scope_definitions -} - pub(crate) fn position_for_import<'a>( ctx: &'a CompletionContext, import_candidate: Option<&ImportCandidate>, @@ -150,13 +139,14 @@ pub(crate) fn position_for_import<'a>( }) } -fn import_assets(ctx: &CompletionContext, fuzzy_name: String) -> Option { +fn import_assets<'a>(ctx: &'a CompletionContext, fuzzy_name: String) -> Option> { let current_module = ctx.scope.module()?; if let Some(dot_receiver) = &ctx.dot_receiver { ImportAssets::for_fuzzy_method_call( current_module, ctx.sema.type_of_expr(dot_receiver)?, fuzzy_name, + ctx.scope.clone(), ) } else { let fuzzy_name_length = fuzzy_name.len(); @@ -165,6 +155,7 @@ fn import_assets(ctx: &CompletionContext, fuzzy_name: String) -> Option Date: Mon, 1 Mar 2021 00:05:22 +0200 Subject: Refactor the import location --- crates/ide_completion/src/completions/flyimport.rs | 65 ++-------------------- 1 file changed, 5 insertions(+), 60 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index d6adf70b1..55439d0e5 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -95,20 +95,20 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind) .into_iter() .map(|import| { - let proposed_def = match import.item_to_display() { + let def_to_display = match import.item_to_display() { ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), }; - (import, proposed_def) + (import, def_to_display) }) .collect::>(); all_mod_paths.sort_by_cached_key(|(import, _)| { compute_fuzzy_completion_order_key(import.display_path(), &user_input_lowercased) }); - acc.add_all(all_mod_paths.into_iter().filter_map(|(import, definition)| { - let import_for_trait_assoc_item = match definition { + acc.add_all(all_mod_paths.into_iter().filter_map(|(import, def_to_display)| { + let import_for_trait_assoc_item = match def_to_display { ScopeDef::ModuleDef(module_def) => module_def .as_assoc_item(ctx.db) .and_then(|assoc| assoc.containing_trait(ctx.db)) @@ -117,7 +117,7 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) }; let import_edit = ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item }; - render_resolution_with_import(RenderContext::new(ctx), import_edit, &definition) + render_resolution_with_import(RenderContext::new(ctx), import_edit, &def_to_display) })); Some(()) } @@ -867,61 +867,6 @@ mod foo { fn main() { bar::Item::TEST_ASSOC } -"#, - ); - } - - #[test] - fn unresolved_assoc_item_container_and_trait_with_path() { - check_edit( - "TEST_ASSOC", - r#" -mod foo { - pub mod bar { - pub trait SomeTrait { - const TEST_ASSOC: usize; - } - } - - pub mod baz { - use super::bar::SomeTrait; - - pub struct Item; - - impl SomeTrait for Item { - const TEST_ASSOC: usize = 3; - } - } -} - -fn main() { - baz::Item::TEST_A$0 -} -"#, - r#" -use foo::{bar::SomeTrait, baz}; - -mod foo { - pub mod bar { - pub trait SomeTrait { - const TEST_ASSOC: usize; - } - } - - pub mod baz { - use super::bar::SomeTrait; - - pub struct Item; - - impl SomeTrait for Item { - const TEST_ASSOC: usize = 3; - } - } -} - -fn main() { - baz::Item::TEST_ASSOC -} "#, ); } -- cgit v1.2.3 From e214c3a6bd7f74b42d38663b959fc4f0d113c90c Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Mon, 1 Mar 2021 13:55:47 +0200 Subject: Simplify --- crates/ide_completion/src/completions/flyimport.rs | 43 +++++++++------------- 1 file changed, 18 insertions(+), 25 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 55439d0e5..c6b83da3d 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -48,7 +48,7 @@ //! Note that having this flag set to `true` does not guarantee that the feature is enabled: your client needs to have the corredponding //! capability enabled. -use hir::{AsAssocItem, ItemInNs, ModPath, ScopeDef}; +use hir::{AsAssocItem, ModPath, ModuleDef, ScopeDef}; use ide_db::helpers::{ import_assets::{ImportAssets, ImportCandidate}, insert_use::ImportScope, @@ -91,33 +91,26 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) &ctx.sema, )?; - let mut all_mod_paths = import_assets - .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind) - .into_iter() - .map(|import| { - let def_to_display = match import.item_to_display() { - ItemInNs::Types(id) => ScopeDef::ModuleDef(id.into()), - ItemInNs::Values(id) => ScopeDef::ModuleDef(id.into()), - ItemInNs::Macros(id) => ScopeDef::MacroDef(id.into()), - }; - (import, def_to_display) - }) - .collect::>(); - all_mod_paths.sort_by_cached_key(|(import, _)| { + let mut all_imports = + import_assets.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind); + all_imports.sort_by_cached_key(|import| { compute_fuzzy_completion_order_key(import.display_path(), &user_input_lowercased) }); - acc.add_all(all_mod_paths.into_iter().filter_map(|(import, def_to_display)| { - let import_for_trait_assoc_item = match def_to_display { - ScopeDef::ModuleDef(module_def) => module_def - .as_assoc_item(ctx.db) - .and_then(|assoc| assoc.containing_trait(ctx.db)) - .is_some(), - _ => false, - }; - let import_edit = - ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item }; - render_resolution_with_import(RenderContext::new(ctx), import_edit, &def_to_display) + acc.add_all(all_imports.into_iter().filter_map(|import| { + let import_for_trait_assoc_item = import + .item_to_display() + .as_module_def_id() + .and_then(|module_def_id| { + ModuleDef::from(module_def_id).as_assoc_item(ctx.db)?.containing_trait(ctx.db) + }) + .is_some(); + let def_to_display = ScopeDef::from(import.item_to_display()); + render_resolution_with_import( + RenderContext::new(ctx), + ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item }, + &def_to_display, + ) })); Some(()) } -- cgit v1.2.3 From 821e8369d994ebca39ccbf9b449c604d0c910efc Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Mon, 1 Mar 2021 14:14:24 +0200 Subject: Update the docs --- crates/ide_completion/src/completions/flyimport.rs | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index c6b83da3d..1ef6f8afb 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -21,6 +21,45 @@ //! ``` //! //! Also completes associated items, that require trait imports. +//! If any unresolved and/or partially-qualified path predeces the input, it will be taken into account: only the items with import string +//! containing this whole path will be considered and the corresponding path import will be added: +//! +//! ``` +//! mod foo { +//! pub mod bar { +//! pub struct Item; +//! +//! impl Item { +//! pub const TEST_ASSOC: usize = 3; +//! } +//! } +//! } +//! +//! fn main() { +//! bar::Item::TEST_A$0 +//! } +//! ``` +//! -> +//! ``` +//! use foo::bar; +//! +//! mod foo { +//! pub mod bar { +//! pub struct Item; +//! +//! impl Item { +//! pub const TEST_ASSOC: usize = 3; +//! } +//! } +//! } +//! +//! fn main() { +//! bar::Item::TEST_ASSOC +//! } +//! ``` +//! +//! NOTE: currently, if an assoc item comes from a trait that's not currently imported and it also has an unresolved and/or partially-qualified path, +//! no imports will be proposed. //! //! .Fuzzy search details //! -- 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/completions/flyimport.rs | 101 +++++++++++---------- 1 file changed, 54 insertions(+), 47 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 1ef6f8afb..c1e3f091f 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -87,11 +87,12 @@ //! Note that having this flag set to `true` does not guarantee that the feature is enabled: your client needs to have the corredponding //! capability enabled. -use hir::{AsAssocItem, ModPath, ModuleDef, ScopeDef}; +use hir::ModPath; use ide_db::helpers::{ import_assets::{ImportAssets, ImportCandidate}, insert_use::ImportScope, }; +use itertools::Itertools; use syntax::{AstNode, SyntaxNode, T}; use crate::{ @@ -130,27 +131,23 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) &ctx.sema, )?; - let mut all_imports = - import_assets.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind); - all_imports.sort_by_cached_key(|import| { - compute_fuzzy_completion_order_key(import.display_path(), &user_input_lowercased) - }); - - acc.add_all(all_imports.into_iter().filter_map(|import| { - let import_for_trait_assoc_item = import - .item_to_display() - .as_module_def_id() - .and_then(|module_def_id| { - ModuleDef::from(module_def_id).as_assoc_item(ctx.db)?.containing_trait(ctx.db) + acc.add_all( + import_assets + .search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind) + .into_iter() + .sorted_by_key(|located_import| { + compute_fuzzy_completion_order_key( + &located_import.import_path, + &user_input_lowercased, + ) }) - .is_some(); - let def_to_display = ScopeDef::from(import.item_to_display()); - render_resolution_with_import( - RenderContext::new(ctx), - ImportEdit { import, import_scope: import_scope.clone(), import_for_trait_assoc_item }, - &def_to_display, - ) - })); + .filter_map(|import| { + render_resolution_with_import( + RenderContext::new(ctx), + ImportEdit { import, import_scope: import_scope.clone() }, + ) + }), + ); Some(()) } @@ -190,6 +187,7 @@ fn import_assets<'a>(ctx: &'a CompletionContext, fuzzy_name: String) -> Option Date: Wed, 3 Mar 2021 23:55:21 +0200 Subject: Fix the completion labels and tests --- crates/ide_completion/src/completions/flyimport.rs | 34 +++++++++++++++------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index c1e3f091f..c5b3c9e27 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -144,7 +144,7 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext) .filter_map(|import| { render_resolution_with_import( RenderContext::new(ctx), - ImportEdit { import, import_scope: import_scope.clone() }, + ImportEdit { import, scope: import_scope.clone() }, ) }), ); @@ -690,8 +690,8 @@ fn main() { } "#, expect![[r#" - fn weird_function() (dep::test_mod::TestTrait) -> () DEPRECATED ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED + fn weird_function() (dep::test_mod::TestTrait) -> () DEPRECATED "#]], ); } @@ -807,7 +807,12 @@ fn main() { bar::baz::Ite$0 }"#; - check(fixture, expect![["st Item (foo::bar::baz::Item)"]]); + check( + fixture, + expect![[r#" + st foo::bar::baz::Item + "#]], + ); check_edit( "Item", @@ -825,8 +830,7 @@ fn main() { fn main() { bar::baz::Item - } - "#, + }"#, ); } @@ -845,7 +849,12 @@ fn main() { Item::TEST_A$0 }"#; - check(fixture, expect![["ct TEST_ASSOC (foo::bar::baz::Item)"]]); + check( + fixture, + expect![[r#" + ct TEST_ASSOC (foo::Item) + "#]], + ); check_edit( "TEST_ASSOC", @@ -863,8 +872,7 @@ mod foo { fn main() { Item::TEST_ASSOC -} -"#, +}"#, ); } @@ -885,7 +893,12 @@ fn main() { bar::Item::TEST_A$0 }"#; - check(fixture, expect![["ct TEST_ASSOC (foo::bar::baz::Item)"]]); + check( + fixture, + expect![[r#" + ct TEST_ASSOC (foo::bar::Item) + "#]], + ); check_edit( "TEST_ASSOC", @@ -905,8 +918,7 @@ mod foo { fn main() { bar::Item::TEST_ASSOC -} -"#, +}"#, ); } } -- cgit v1.2.3 From 6ca6f101c1b3a795ff6578bae6e01cb4b818e14c Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 4 Mar 2021 00:10:20 +0200 Subject: Test for fuzzy unresolved path maatch --- crates/ide_completion/src/completions/flyimport.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index c5b3c9e27..efb91fe0e 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -921,4 +921,26 @@ fn main() { }"#, ); } + + #[test] + fn fuzzy_unresolved_path() { + check( + r#" +mod foo { + pub mod bar { + pub struct Item; + + impl Item { + pub const TEST_ASSOC: usize = 3; + } + } +} + +fn main() { + let zz = "sdsd"; + bar::Ass$0 +}"#, + expect![[]], + ) + } } -- cgit v1.2.3 From 84c575a21201cdbeb391ff2cfae2fbbccaa76f8a Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Fri, 5 Mar 2021 00:11:07 +0200 Subject: Restrict fuzzy qualifiers for now --- crates/ide_completion/src/completions/flyimport.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index efb91fe0e..8a11cba41 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -21,8 +21,9 @@ //! ``` //! //! Also completes associated items, that require trait imports. -//! If any unresolved and/or partially-qualified path predeces the input, it will be taken into account: only the items with import string -//! containing this whole path will be considered and the corresponding path import will be added: +//! If any unresolved and/or partially-qualified path predeces the input, it will be taken into account. +//! Currently, only the imports with their import path ending with the whole qialifier will be proposed +//! (no fuzzy matching for qualifier). //! //! ``` //! mod foo { @@ -187,7 +188,6 @@ fn import_assets<'a>(ctx: &'a CompletionContext, fuzzy_name: String) -> Option Date: Mon, 8 Mar 2021 00:25:45 +0200 Subject: Less lifetines: derive SemanticsScope in place --- crates/ide_completion/src/completions/flyimport.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'crates/ide_completion/src/completions/flyimport.rs') diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 8a11cba41..391a11c91 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -169,23 +169,28 @@ pub(crate) fn position_for_import<'a>( }) } -fn import_assets<'a>(ctx: &'a CompletionContext, fuzzy_name: String) -> Option> { +fn import_assets(ctx: &CompletionContext, fuzzy_name: String) -> Option { let current_module = ctx.scope.module()?; if let Some(dot_receiver) = &ctx.dot_receiver { ImportAssets::for_fuzzy_method_call( current_module, ctx.sema.type_of_expr(dot_receiver)?, fuzzy_name, - ctx.scope.clone(), + dot_receiver.syntax().clone(), ) } else { let fuzzy_name_length = fuzzy_name.len(); + let approximate_node = match current_module.definition_source(ctx.db).value { + hir::ModuleSource::SourceFile(s) => s.syntax().clone(), + hir::ModuleSource::Module(m) => m.syntax().clone(), + hir::ModuleSource::BlockExpr(b) => b.syntax().clone(), + }; let assets_for_path = ImportAssets::for_fuzzy_path( current_module, ctx.path_qual.clone(), fuzzy_name, &ctx.sema, - ctx.scope.clone(), + approximate_node, )?; if matches!(assets_for_path.import_candidate(), ImportCandidate::Path(_)) -- cgit v1.2.3