Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #16268 - Veykril:method-trait-completion-limit, r=Veykril
Remove completion limit for trait importing method completions Fixes https://github.com/rust-lang/rust-analyzer/issues/16075 The < 3 char limit never applied to methods and the amount of completions generated due this is not absolutely massive as not all traits in a project are ever applicable so there is little reason to employ the limit here. Especially as it limits the number of traits we consider, not items (after my changes yesterday), and the number of traits is not the slowing factor here. Tested this in r-a where we have ~800 traits project wide and even when ~260 are applicable there was no noticable slow down from it.
bors 2024-01-05
parent 11b0126 · parent 4f75e0f · commit dc31cef
-rw-r--r--crates/ide-completion/src/tests/flyimport.rs1
-rw-r--r--crates/ide-db/src/imports/import_assets.rs19
2 files changed, 9 insertions, 11 deletions
diff --git a/crates/ide-completion/src/tests/flyimport.rs b/crates/ide-completion/src/tests/flyimport.rs
index c58374f2e8..1af16ef857 100644
--- a/crates/ide-completion/src/tests/flyimport.rs
+++ b/crates/ide-completion/src/tests/flyimport.rs
@@ -599,6 +599,7 @@ fn main() {
expect![[r#"
fn weird_function() (use dep::test_mod::TestTrait) fn() DEPRECATED
ct SPECIAL_CONST (use dep::test_mod::TestTrait) u8 DEPRECATED
+ me random_method(…) (use dep::test_mod::TestTrait) fn(&self) DEPRECATED
"#]],
);
}
diff --git a/crates/ide-db/src/imports/import_assets.rs b/crates/ide-db/src/imports/import_assets.rs
index 9fc644d0b6..df461b219b 100644
--- a/crates/ide-db/src/imports/import_assets.rs
+++ b/crates/ide-db/src/imports/import_assets.rs
@@ -500,7 +500,7 @@ fn trait_applicable_items(
let related_traits = inherent_traits.chain(env_traits).collect::<FxHashSet<_>>();
let mut required_assoc_items = FxHashSet::default();
- let trait_candidates = items_locator::items_with_name(
+ let trait_candidates: FxHashSet<_> = items_locator::items_with_name(
sema,
current_crate,
trait_candidate.assoc_item_name.clone(),
@@ -508,15 +508,17 @@ fn trait_applicable_items(
)
.filter_map(|input| item_as_assoc(db, input))
.filter_map(|assoc| {
+ if !trait_assoc_item && matches!(assoc, AssocItem::Const(_) | AssocItem::TypeAlias(_)) {
+ return None;
+ }
+
let assoc_item_trait = assoc.containing_trait(db)?;
if related_traits.contains(&assoc_item_trait) {
- None
- } else {
- required_assoc_items.insert(assoc);
- Some(assoc_item_trait.into())
+ return None;
}
+ required_assoc_items.insert(assoc);
+ Some(assoc_item_trait.into())
})
- .take(DEFAULT_QUERY_SEARCH_LIMIT.inner())
.collect();
let mut located_imports = FxHashSet::default();
@@ -531,11 +533,6 @@ fn trait_applicable_items(
None,
|assoc| {
if required_assoc_items.contains(&assoc) {
- if let AssocItem::Function(f) = assoc {
- if f.self_param(db).is_some() {
- return None;
- }
- }
let located_trait = assoc.containing_trait(db)?;
let trait_item = ItemInNs::from(ModuleDef::from(located_trait));
let import_path = trait_import_paths