diff options
-rw-r--r-- | crates/hir_def/src/import_map.rs | 49 | ||||
-rw-r--r-- | crates/hir_def/src/item_scope.rs | 15 |
2 files changed, 37 insertions, 27 deletions
diff --git a/crates/hir_def/src/import_map.rs b/crates/hir_def/src/import_map.rs index 0ba8198b5..a8bffe7ce 100644 --- a/crates/hir_def/src/import_map.rs +++ b/crates/hir_def/src/import_map.rs | |||
@@ -24,7 +24,7 @@ pub struct ImportInfo { | |||
24 | /// The module containing this item. | 24 | /// The module containing this item. |
25 | pub container: ModuleId, | 25 | pub container: ModuleId, |
26 | /// Whether the import is a trait associated item or not. | 26 | /// Whether the import is a trait associated item or not. |
27 | pub is_assoc_item: bool, | 27 | pub is_trait_assoc_item: bool, |
28 | } | 28 | } |
29 | 29 | ||
30 | #[derive(Debug, Clone, Eq, PartialEq)] | 30 | #[derive(Debug, Clone, Eq, PartialEq)] |
@@ -105,11 +105,16 @@ impl ImportMap { | |||
105 | for item in per_ns.iter_items() { | 105 | for item in per_ns.iter_items() { |
106 | let path = mk_path(); | 106 | let path = mk_path(); |
107 | let path_len = path.len(); | 107 | let path_len = path.len(); |
108 | let import_info = ImportInfo { path, container: module, is_assoc_item: false }; | 108 | let import_info = |
109 | ImportInfo { path, container: module, is_trait_assoc_item: false }; | ||
109 | 110 | ||
110 | // If we've added a path to a trait, add the trait's associated items to the assoc map. | ||
111 | if let Some(ModuleDefId::TraitId(tr)) = item.as_module_def_id() { | 111 | if let Some(ModuleDefId::TraitId(tr)) = item.as_module_def_id() { |
112 | import_map.collect_trait_assoc_items(db, tr, &import_info); | 112 | import_map.collect_trait_assoc_items( |
113 | db, | ||
114 | tr, | ||
115 | matches!(item, ItemInNs::Types(_)), | ||
116 | &import_info, | ||
117 | ); | ||
113 | } | 118 | } |
114 | 119 | ||
115 | match import_map.map.entry(item) { | 120 | match import_map.map.entry(item) { |
@@ -177,17 +182,24 @@ impl ImportMap { | |||
177 | &mut self, | 182 | &mut self, |
178 | db: &dyn DefDatabase, | 183 | db: &dyn DefDatabase, |
179 | tr: TraitId, | 184 | tr: TraitId, |
180 | import_info: &ImportInfo, | 185 | is_type_in_ns: bool, |
186 | original_import_info: &ImportInfo, | ||
181 | ) { | 187 | ) { |
182 | for (assoc_item_name, item) in db.trait_data(tr).items.iter() { | 188 | for (assoc_item_name, item) in &db.trait_data(tr).items { |
183 | let assoc_item = ItemInNs::Types(match item.clone() { | 189 | let module_def_id = match *item { |
184 | AssocItemId::FunctionId(f) => f.into(), | 190 | AssocItemId::FunctionId(f) => f.into(), |
185 | AssocItemId::ConstId(c) => c.into(), | 191 | AssocItemId::ConstId(c) => c.into(), |
186 | AssocItemId::TypeAliasId(t) => t.into(), | 192 | AssocItemId::TypeAliasId(t) => t.into(), |
187 | }); | 193 | }; |
188 | let mut assoc_item_info = import_info.to_owned(); | 194 | let assoc_item = if is_type_in_ns { |
195 | ItemInNs::Types(module_def_id) | ||
196 | } else { | ||
197 | ItemInNs::Values(module_def_id) | ||
198 | }; | ||
199 | |||
200 | let mut assoc_item_info = original_import_info.to_owned(); | ||
189 | assoc_item_info.path.segments.push(assoc_item_name.to_owned()); | 201 | assoc_item_info.path.segments.push(assoc_item_name.to_owned()); |
190 | assoc_item_info.is_assoc_item = true; | 202 | assoc_item_info.is_trait_assoc_item = true; |
191 | self.map.insert(assoc_item, assoc_item_info); | 203 | self.map.insert(assoc_item, assoc_item_info); |
192 | } | 204 | } |
193 | } | 205 | } |
@@ -314,7 +326,7 @@ impl Query { | |||
314 | } | 326 | } |
315 | 327 | ||
316 | fn import_matches_query(import: &ImportInfo, query: &Query, enforce_lowercase: bool) -> bool { | 328 | fn import_matches_query(import: &ImportInfo, query: &Query, enforce_lowercase: bool) -> bool { |
317 | let mut input = if import.is_assoc_item || query.name_only { | 329 | let mut input = if import.is_trait_assoc_item || query.name_only { |
318 | import.path.segments.last().unwrap().to_string() | 330 | import.path.segments.last().unwrap().to_string() |
319 | } else { | 331 | } else { |
320 | import.path.to_string() | 332 | import.path.to_string() |
@@ -455,6 +467,8 @@ mod tests { | |||
455 | None => ( | 467 | None => ( |
456 | dependency_imports.path_of(dependency)?.to_string(), | 468 | dependency_imports.path_of(dependency)?.to_string(), |
457 | match dependency { | 469 | match dependency { |
470 | ItemInNs::Types(ModuleDefId::FunctionId(_)) | ||
471 | | ItemInNs::Values(ModuleDefId::FunctionId(_)) => "f", | ||
458 | ItemInNs::Types(_) => "t", | 472 | ItemInNs::Types(_) => "t", |
459 | ItemInNs::Values(_) => "v", | 473 | ItemInNs::Values(_) => "v", |
460 | ItemInNs::Macros(_) => "m", | 474 | ItemInNs::Macros(_) => "m", |
@@ -478,7 +492,16 @@ mod tests { | |||
478 | dependency_imports: &ImportMap, | 492 | dependency_imports: &ImportMap, |
479 | dependency: ItemInNs, | 493 | dependency: ItemInNs, |
480 | ) -> Option<String> { | 494 | ) -> Option<String> { |
481 | let dependency_assoc_item_id = dependency.as_assoc_item_id()?; | 495 | let dependency_assoc_item_id = match dependency { |
496 | ItemInNs::Types(ModuleDefId::FunctionId(id)) | ||
497 | | ItemInNs::Values(ModuleDefId::FunctionId(id)) => AssocItemId::from(id), | ||
498 | ItemInNs::Types(ModuleDefId::ConstId(id)) | ||
499 | | ItemInNs::Values(ModuleDefId::ConstId(id)) => AssocItemId::from(id), | ||
500 | ItemInNs::Types(ModuleDefId::TypeAliasId(id)) | ||
501 | | ItemInNs::Values(ModuleDefId::TypeAliasId(id)) => AssocItemId::from(id), | ||
502 | _ => return None, | ||
503 | }; | ||
504 | |||
482 | let trait_ = assoc_to_trait(db, dependency)?; | 505 | let trait_ = assoc_to_trait(db, dependency)?; |
483 | if let ModuleDefId::TraitId(tr) = trait_.as_module_def_id()? { | 506 | if let ModuleDefId::TraitId(tr) = trait_.as_module_def_id()? { |
484 | let trait_data = db.trait_data(tr); | 507 | let trait_data = db.trait_data(tr); |
@@ -820,7 +843,7 @@ mod tests { | |||
820 | dep::Fmt (m) | 843 | dep::Fmt (m) |
821 | dep::fmt::Display (t) | 844 | dep::fmt::Display (t) |
822 | dep::fmt::Display::fmt (a) | 845 | dep::fmt::Display::fmt (a) |
823 | dep::format (v) | 846 | dep::format (f) |
824 | "#]], | 847 | "#]], |
825 | ); | 848 | ); |
826 | 849 | ||
diff --git a/crates/hir_def/src/item_scope.rs b/crates/hir_def/src/item_scope.rs index 4da1c3ab0..2750e1c91 100644 --- a/crates/hir_def/src/item_scope.rs +++ b/crates/hir_def/src/item_scope.rs | |||
@@ -12,9 +12,8 @@ use test_utils::mark; | |||
12 | 12 | ||
13 | use crate::{ | 13 | use crate::{ |
14 | db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, HasModule, ImplId, | 14 | db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, HasModule, ImplId, |
15 | LocalModuleId, Lookup, MacroDefId, ModuleDefId, TraitId, | 15 | LocalModuleId, Lookup, MacroDefId, ModuleDefId, ModuleId, TraitId, |
16 | }; | 16 | }; |
17 | use crate::{AssocItemId, ModuleId}; | ||
18 | 17 | ||
19 | #[derive(Copy, Clone)] | 18 | #[derive(Copy, Clone)] |
20 | pub(crate) enum ImportType { | 19 | pub(crate) enum ImportType { |
@@ -349,18 +348,6 @@ impl ItemInNs { | |||
349 | } | 348 | } |
350 | } | 349 | } |
351 | 350 | ||
352 | pub fn as_assoc_item_id(self) -> Option<AssocItemId> { | ||
353 | match self { | ||
354 | ItemInNs::Types(ModuleDefId::FunctionId(id)) | ||
355 | | ItemInNs::Values(ModuleDefId::FunctionId(id)) => Some(id.into()), | ||
356 | ItemInNs::Types(ModuleDefId::ConstId(id)) | ||
357 | | ItemInNs::Values(ModuleDefId::ConstId(id)) => Some(id.into()), | ||
358 | ItemInNs::Types(ModuleDefId::TypeAliasId(id)) | ||
359 | | ItemInNs::Values(ModuleDefId::TypeAliasId(id)) => Some(id.into()), | ||
360 | _ => None, | ||
361 | } | ||
362 | } | ||
363 | |||
364 | /// Returns the crate defining this item (or `None` if `self` is built-in). | 351 | /// Returns the crate defining this item (or `None` if `self` is built-in). |
365 | pub fn krate(&self, db: &dyn DefDatabase) -> Option<CrateId> { | 352 | pub fn krate(&self, db: &dyn DefDatabase) -> Option<CrateId> { |
366 | Some(match self { | 353 | Some(match self { |