Change ChildBySource to allow reusing DynMap

This commit is contained in:
Jonas Schievink 2021-03-05 14:06:09 +01:00 committed by Jonas Schievink
parent c45ac6effe
commit 8da50c9077
2 changed files with 18 additions and 32 deletions

View File

@ -17,13 +17,16 @@ use crate::{
}; };
pub trait ChildBySource { pub trait ChildBySource {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap; fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap {
let mut res = DynMap::default();
self.child_by_source_to(db, &mut res);
res
}
fn child_by_source_to(&self, db: &dyn DefDatabase, map: &mut DynMap);
} }
impl ChildBySource for TraitId { impl ChildBySource for TraitId {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let mut res = DynMap::default();
let data = db.trait_data(*self); let data = db.trait_data(*self);
for (_name, item) in data.items.iter() { for (_name, item) in data.items.iter() {
match *item { match *item {
@ -41,15 +44,11 @@ impl ChildBySource for TraitId {
} }
} }
} }
res
} }
} }
impl ChildBySource for ImplId { impl ChildBySource for ImplId {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let mut res = DynMap::default();
let data = db.impl_data(*self); let data = db.impl_data(*self);
for &item in data.items.iter() { for &item in data.items.iter() {
match item { match item {
@ -67,25 +66,21 @@ impl ChildBySource for ImplId {
} }
} }
} }
res
} }
} }
impl ChildBySource for ModuleId { impl ChildBySource for ModuleId {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let def_map = self.def_map(db); let def_map = self.def_map(db);
let module_data = &def_map[self.local_id]; let module_data = &def_map[self.local_id];
module_data.scope.child_by_source(db) module_data.scope.child_by_source_to(db, res);
} }
} }
impl ChildBySource for ItemScope { impl ChildBySource for ItemScope {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let mut res = DynMap::default(); self.declarations().for_each(|item| add_module_def(db, res, item));
self.declarations().for_each(|item| add_module_def(db, &mut res, item)); self.impls().for_each(|imp| add_impl(db, res, imp));
self.impls().for_each(|imp| add_impl(db, &mut res, imp));
return res;
fn add_module_def(db: &dyn DefDatabase, map: &mut DynMap, item: ModuleDefId) { fn add_module_def(db: &dyn DefDatabase, map: &mut DynMap, item: ModuleDefId) {
match item { match item {
@ -134,9 +129,7 @@ impl ChildBySource for ItemScope {
} }
impl ChildBySource for VariantId { impl ChildBySource for VariantId {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let mut res = DynMap::default();
let arena_map = self.child_source(db); let arena_map = self.child_source(db);
let arena_map = arena_map.as_ref(); let arena_map = arena_map.as_ref();
for (local_id, source) in arena_map.value.iter() { for (local_id, source) in arena_map.value.iter() {
@ -150,28 +143,23 @@ impl ChildBySource for VariantId {
} }
} }
} }
res
} }
} }
impl ChildBySource for EnumId { impl ChildBySource for EnumId {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let mut res = DynMap::default();
let arena_map = self.child_source(db); let arena_map = self.child_source(db);
let arena_map = arena_map.as_ref(); let arena_map = arena_map.as_ref();
for (local_id, source) in arena_map.value.iter() { for (local_id, source) in arena_map.value.iter() {
let id = EnumVariantId { parent: *self, local_id }; let id = EnumVariantId { parent: *self, local_id };
res[keys::VARIANT].insert(arena_map.with_value(source.clone()), id) res[keys::VARIANT].insert(arena_map.with_value(source.clone()), id)
} }
res
} }
} }
impl ChildBySource for DefWithBodyId { impl ChildBySource for DefWithBodyId {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let body = db.body(*self); let body = db.body(*self);
body.item_scope.child_by_source(db) body.item_scope.child_by_source_to(db, res);
} }
} }

View File

@ -421,8 +421,7 @@ impl HasChildSource<LocalConstParamId> for GenericDefId {
} }
impl ChildBySource for GenericDefId { impl ChildBySource for GenericDefId {
fn child_by_source(&self, db: &dyn DefDatabase) -> DynMap { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) {
let mut res = DynMap::default();
let (_, sm) = GenericParams::new(db, *self); let (_, sm) = GenericParams::new(db, *self);
let sm = sm.as_ref(); let sm = sm.as_ref();
@ -440,6 +439,5 @@ impl ChildBySource for GenericDefId {
let id = ConstParamId { parent: *self, local_id }; let id = ConstParamId { parent: *self, local_id };
res[keys::CONST_PARAM].insert(sm.with_value(src.clone()), id); res[keys::CONST_PARAM].insert(sm.with_value(src.clone()), id);
} }
res
} }
} }