aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/traits.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-20 15:00:01 +0000
committerAleksey Kladov <[email protected]>2019-11-20 15:41:23 +0000
commit111891dc2dc1d2c7ea87144e8e3ddefe23fc7b6d (patch)
tree7e96d773620a3b03254d00386711cdc7c909e3ee /crates/ra_hir_def/src/traits.rs
parentee95a35664e6fe9153f6324cfc57872ca365887c (diff)
Move constants to new ID
This allows us to get rid of trait item index
Diffstat (limited to 'crates/ra_hir_def/src/traits.rs')
-rw-r--r--crates/ra_hir_def/src/traits.rs45
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
10use ra_syntax::ast::{self, NameOwner}; 10use ra_syntax::ast::{self, NameOwner};
11use rustc_hash::FxHashMap;
12 11
13use crate::{ 12use 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)]
60pub struct TraitItemsIndex {
61 traits_by_def: FxHashMap<AssocItemId, TraitId>,
62}
63
64impl 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}