diff options
Diffstat (limited to 'crates/ra_hir_def/src/traits.rs')
-rw-r--r-- | crates/ra_hir_def/src/traits.rs | 45 |
1 files changed, 8 insertions, 37 deletions
diff --git a/crates/ra_hir_def/src/traits.rs b/crates/ra_hir_def/src/traits.rs index bb61e852a..877d73d66 100644 --- a/crates/ra_hir_def/src/traits.rs +++ b/crates/ra_hir_def/src/traits.rs | |||
@@ -8,11 +8,10 @@ use hir_expand::{ | |||
8 | }; | 8 | }; |
9 | 9 | ||
10 | use ra_syntax::ast::{self, NameOwner}; | 10 | use ra_syntax::ast::{self, NameOwner}; |
11 | use rustc_hash::FxHashMap; | ||
12 | 11 | ||
13 | use crate::{ | 12 | use crate::{ |
14 | db::DefDatabase2, AssocItemId, AstItemDef, ConstId, ContainerId, FunctionLoc, Intern, | 13 | db::DefDatabase2, AssocItemId, AstItemDef, ConstLoc, ContainerId, FunctionLoc, Intern, TraitId, |
15 | LocationCtx, ModuleDefId, ModuleId, TraitId, TypeAliasLoc, | 14 | TypeAliasLoc, |
16 | }; | 15 | }; |
17 | 16 | ||
18 | #[derive(Debug, Clone, PartialEq, Eq)] | 17 | #[derive(Debug, Clone, PartialEq, Eq)] |
@@ -26,8 +25,6 @@ impl TraitData { | |||
26 | pub(crate) fn trait_data_query(db: &impl DefDatabase2, tr: TraitId) -> Arc<TraitData> { | 25 | pub(crate) fn trait_data_query(db: &impl DefDatabase2, tr: TraitId) -> Arc<TraitData> { |
27 | let src = tr.source(db); | 26 | let src = tr.source(db); |
28 | let name = src.value.name().map(|n| n.as_name()); | 27 | let name = src.value.name().map(|n| n.as_name()); |
29 | let module = tr.module(db); | ||
30 | let ctx = LocationCtx::new(db, module, src.file_id); | ||
31 | let auto = src.value.is_auto(); | 28 | let auto = src.value.is_auto(); |
32 | let ast_id_map = db.ast_id_map(src.file_id); | 29 | let ast_id_map = db.ast_id_map(src.file_id); |
33 | let items = if let Some(item_list) = src.value.item_list() { | 30 | let items = if let Some(item_list) = src.value.item_list() { |
@@ -40,7 +37,12 @@ impl TraitData { | |||
40 | } | 37 | } |
41 | .intern(db) | 38 | .intern(db) |
42 | .into(), | 39 | .into(), |
43 | ast::ImplItem::ConstDef(it) => ConstId::from_ast(ctx, &it).into(), | 40 | ast::ImplItem::ConstDef(it) => ConstLoc { |
41 | container: ContainerId::TraitId(tr), | ||
42 | ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), | ||
43 | } | ||
44 | .intern(db) | ||
45 | .into(), | ||
44 | ast::ImplItem::TypeAliasDef(it) => TypeAliasLoc { | 46 | ast::ImplItem::TypeAliasDef(it) => TypeAliasLoc { |
45 | container: ContainerId::TraitId(tr), | 47 | container: ContainerId::TraitId(tr), |
46 | ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), | 48 | ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), |
@@ -55,34 +57,3 @@ impl TraitData { | |||
55 | Arc::new(TraitData { name, items, auto }) | 57 | Arc::new(TraitData { name, items, auto }) |
56 | } | 58 | } |
57 | } | 59 | } |
58 | |||
59 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
60 | pub struct TraitItemsIndex { | ||
61 | traits_by_def: FxHashMap<AssocItemId, TraitId>, | ||
62 | } | ||
63 | |||
64 | impl TraitItemsIndex { | ||
65 | pub fn trait_items_index(db: &impl DefDatabase2, module: ModuleId) -> TraitItemsIndex { | ||
66 | let mut index = TraitItemsIndex { traits_by_def: FxHashMap::default() }; | ||
67 | let crate_def_map = db.crate_def_map(module.krate); | ||
68 | for decl in crate_def_map[module.module_id].scope.declarations() { | ||
69 | if let ModuleDefId::TraitId(tr) = decl { | ||
70 | for item in db.trait_data(tr).items.iter() { | ||
71 | match item { | ||
72 | AssocItemId::FunctionId(_) => (), | ||
73 | AssocItemId::TypeAliasId(_) => (), | ||
74 | _ => { | ||
75 | let prev = index.traits_by_def.insert(*item, tr); | ||
76 | assert!(prev.is_none()); | ||
77 | } | ||
78 | } | ||
79 | } | ||
80 | } | ||
81 | } | ||
82 | index | ||
83 | } | ||
84 | |||
85 | pub fn get_parent_trait(&self, item: AssocItemId) -> Option<TraitId> { | ||
86 | self.traits_by_def.get(&item).cloned() | ||
87 | } | ||
88 | } | ||