Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_db/src/helpers/import_assets.rs')
| -rw-r--r-- | crates/ide_db/src/helpers/import_assets.rs | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/crates/ide_db/src/helpers/import_assets.rs b/crates/ide_db/src/helpers/import_assets.rs index 9a8adf167c..024e0c9f81 100644 --- a/crates/ide_db/src/helpers/import_assets.rs +++ b/crates/ide_db/src/helpers/import_assets.rs @@ -68,17 +68,23 @@ pub struct FirstSegmentUnresolved { /// A name that will be used during item lookups. #[derive(Debug, Clone)] pub enum NameToImport { - /// Requires items with names that exactly match the given string, case-sensitive. - Exact(String), + /// Requires items with names that exactly match the given string, bool indicatse case-sensitivity. + Exact(String, bool), /// Requires items with names that case-insensitively contain all letters from the string, /// in the same order, but not necessary adjacent. Fuzzy(String), } impl NameToImport { + pub fn exact_case_sensitive(s: String) -> NameToImport { + NameToImport::Exact(s, true) + } +} + +impl NameToImport { pub fn text(&self) -> &str { match self { - NameToImport::Exact(text) => text.as_str(), + NameToImport::Exact(text, _) => text.as_str(), NameToImport::Fuzzy(text) => text.as_str(), } } @@ -140,7 +146,7 @@ impl ImportAssets { if let Some(_) = path.qualifier() { return None; } - let name = NameToImport::Exact(path.segment()?.name_ref()?.to_string()); + let name = NameToImport::exact_case_sensitive(path.segment()?.name_ref()?.to_string()); let candidate_node = attr.syntax().clone(); Some(Self { import_candidate: ImportCandidate::Path(PathImportCandidate { qualifier: None, name }), @@ -230,6 +236,18 @@ impl ImportAssets { self.search_for(sema, None) } + pub fn path_fuzzy_name_to_exact(&mut self, case_sensitive: bool) { + if let ImportCandidate::Path(PathImportCandidate { name: to_import, .. }) = + &mut self.import_candidate + { + let name = match to_import { + NameToImport::Fuzzy(name) => std::mem::take(name), + _ => return, + }; + *to_import = NameToImport::Exact(name, case_sensitive); + } + } + fn search_for( &self, sema: &Semantics<RootDatabase>, @@ -561,7 +579,9 @@ impl ImportCandidate { Some(_) => None, None => Some(Self::TraitMethod(TraitImportCandidate { receiver_ty: sema.type_of_expr(&method_call.receiver()?)?.adjusted(), - assoc_item_name: NameToImport::Exact(method_call.name_ref()?.to_string()), + assoc_item_name: NameToImport::exact_case_sensitive( + method_call.name_ref()?.to_string(), + ), })), } } @@ -573,7 +593,7 @@ impl ImportCandidate { path_import_candidate( sema, path.qualifier(), - NameToImport::Exact(path.segment()?.name_ref()?.to_string()), + NameToImport::exact_case_sensitive(path.segment()?.name_ref()?.to_string()), ) } @@ -587,7 +607,7 @@ impl ImportCandidate { } Some(ImportCandidate::Path(PathImportCandidate { qualifier: None, - name: NameToImport::Exact(name.to_string()), + name: NameToImport::exact_case_sensitive(name.to_string()), })) } |