From b2de95879a8d48cc4077895376b0aaed1e972169 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 28 Nov 2018 02:49:28 +0300 Subject: generalize location interner --- crates/ra_analysis/src/loc2id.rs | 98 +++++++++++++++++++++++++++------------- 1 file changed, 66 insertions(+), 32 deletions(-) (limited to 'crates/ra_analysis/src/loc2id.rs') diff --git a/crates/ra_analysis/src/loc2id.rs b/crates/ra_analysis/src/loc2id.rs index 204708942..2aa141130 100644 --- a/crates/ra_analysis/src/loc2id.rs +++ b/crates/ra_analysis/src/loc2id.rs @@ -1,9 +1,6 @@ use parking_lot::Mutex; -use std::{ - hash::Hash, - sync::Arc, -}; +use std::hash::Hash; use rustc_hash::FxHashMap; @@ -23,19 +20,19 @@ use crate::{ /// bidirectional mapping between positional and numeric ids, we can use compact /// representation wich still allows us to get the actual item #[derive(Debug)] -pub(crate) struct Loc2IdMap +struct Loc2IdMap where ID: NumericId, - L: Clone + Eq + Hash, + LOC: Clone + Eq + Hash, { - loc2id: FxHashMap, - id2loc: FxHashMap, + loc2id: FxHashMap, + id2loc: FxHashMap, } -impl Default for Loc2IdMap +impl Default for Loc2IdMap where ID: NumericId, - L: Clone + Eq + Hash, + LOC: Clone + Eq + Hash, { fn default() -> Self { Loc2IdMap { @@ -45,12 +42,12 @@ where } } -impl Loc2IdMap +impl Loc2IdMap where ID: NumericId, - L: Clone + Eq + Hash, + LOC: Clone + Eq + Hash, { - pub fn loc2id(&mut self, loc: &L) -> ID { + pub fn loc2id(&mut self, loc: &LOC) -> ID { match self.loc2id.get(loc) { Some(id) => return id.clone(), None => (), @@ -63,7 +60,7 @@ where id } - pub fn id2loc(&self, id: ID) -> L { + pub fn id2loc(&self, id: ID) -> LOC { self.id2loc[&id].clone() } } @@ -90,6 +87,18 @@ macro_rules! impl_numeric_id { pub(crate) struct FnId(u32); impl_numeric_id!(FnId); +impl FnId { + pub(crate) fn from_loc( + db: &impl AsRef>, + loc: &SourceItemId, + ) -> FnId { + db.as_ref().loc2id(loc) + } + pub(crate) fn loc(self, db: &impl AsRef>) -> SourceItemId { + db.as_ref().id2loc(self) + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub(crate) struct DefId(u32); impl_numeric_id!(DefId); @@ -105,29 +114,54 @@ pub(crate) enum DefLoc { }, } -#[derive(Debug, Default, Clone)] -pub(crate) struct IdMaps { - inner: Arc, +impl DefId { + pub(crate) fn loc(self, db: &impl AsRef>) -> DefLoc { + db.as_ref().id2loc(self) + } } -impl IdMaps { - pub(crate) fn fn_id(&self, item_id: SourceItemId) -> FnId { - self.inner.fns.lock().loc2id(&item_id) - } - pub(crate) fn fn_item_id(&self, fn_id: FnId) -> SourceItemId { - self.inner.fns.lock().id2loc(fn_id) +impl DefLoc { + pub(crate) fn id(&self, db: &impl AsRef>) -> DefId { + db.as_ref().loc2id(&self) } +} - pub(crate) fn def_id(&self, loc: DefLoc) -> DefId { - self.inner.defs.lock().loc2id(&loc) - } - pub(crate) fn def_loc(&self, def_id: DefId) -> DefLoc { - self.inner.defs.lock().id2loc(def_id) +#[derive(Debug, Default)] +pub(crate) struct IdMaps { + pub(crate) fns: LocationIntener, + pub(crate) defs: LocationIntener, +} + +#[derive(Debug)] +pub(crate) struct LocationIntener +where + ID: NumericId, + LOC: Clone + Eq + Hash, +{ + map: Mutex>, +} + +impl Default for LocationIntener +where + ID: NumericId, + LOC: Clone + Eq + Hash, +{ + fn default() -> Self { + LocationIntener { + map: Default::default(), + } } } -#[derive(Debug, Default)] -struct IdMapsInner { - fns: Mutex>, - defs: Mutex>, +impl LocationIntener +where + ID: NumericId, + LOC: Clone + Eq + Hash, +{ + fn loc2id(&self, loc: &LOC) -> ID { + self.map.lock().loc2id(loc) + } + fn id2loc(&self, id: ID) -> LOC { + self.map.lock().id2loc(id) + } } -- cgit v1.2.3