chore: eliminate unsafe operations

This commit is contained in:
Shunsuke Shibayama 2023-05-28 01:59:53 +09:00
parent 7049faf144
commit 8e481399b4
17 changed files with 196 additions and 118 deletions

View file

@ -1,3 +1,4 @@
use std::cell::Ref;
use std::collections::hash_map::{Iter, Keys, Values};
use std::fmt;
use std::path::Path;
@ -9,6 +10,22 @@ use erg_common::shared::Shared;
use crate::varinfo::{AbsLocation, VarInfo};
pub struct Members<'a>(Ref<'a, Dict<AbsLocation, ModuleIndexValue>>);
impl<'a> Members<'a> {
pub fn iter(&self) -> Iter<AbsLocation, ModuleIndexValue> {
self.0.iter()
}
pub fn keys(&self) -> Keys<AbsLocation, ModuleIndexValue> {
self.0.keys()
}
pub fn values(&self) -> Values<AbsLocation, ModuleIndexValue> {
self.0.values()
}
}
#[derive(Debug, Clone, Default)]
pub struct ModuleIndexValue {
pub vi: VarInfo,
@ -101,20 +118,18 @@ impl SharedModuleIndex {
self.0.borrow_mut().register(vi);
}
pub fn get_refs(&self, referee: &AbsLocation) -> Option<&ModuleIndexValue> {
unsafe { self.0.as_ptr().as_ref().unwrap().get_refs(referee) }
pub fn get_refs(&self, referee: &AbsLocation) -> Option<Ref<ModuleIndexValue>> {
if self.0.borrow().get_refs(referee).is_some() {
Some(Ref::map(self.0.borrow(), |index| {
index.get_refs(referee).unwrap()
}))
} else {
None
}
}
pub fn referees(&self) -> Keys<AbsLocation, ModuleIndexValue> {
unsafe { self.0.as_ptr().as_ref().unwrap().members.keys() }
}
pub fn referrers(&self) -> Values<AbsLocation, ModuleIndexValue> {
unsafe { self.0.as_ptr().as_ref().unwrap().members.values() }
}
pub fn iter(&self) -> Iter<AbsLocation, ModuleIndexValue> {
unsafe { self.0.as_ptr().as_ref().unwrap().members.iter() }
pub fn members(&self) -> Members {
Members(Ref::map(self.0.borrow(), |mi| &mi.members))
}
pub fn initialize(&self) {