fix: errors in other modules are ignored

This commit is contained in:
Shunsuke Shibayama 2023-06-22 16:32:10 +09:00
parent 7ba874a85c
commit eaeb659a7d
13 changed files with 214 additions and 75 deletions

View file

@ -6,6 +6,7 @@ use erg_common::dict::Dict;
use erg_common::set;
use erg_common::set::Set;
use erg_common::shared::{MappedRwLockReadGuard, RwLockReadGuard, Shared};
use erg_common::Str;
use crate::varinfo::{AbsLocation, VarInfo};
@ -25,8 +26,9 @@ impl<'a> Members<'a> {
}
}
#[derive(Debug, Clone, Default)]
#[derive(Debug, Clone)]
pub struct ModuleIndexValue {
pub name: Str,
pub vi: VarInfo,
pub referrers: Set<AbsLocation>,
}
@ -38,8 +40,12 @@ impl fmt::Display for ModuleIndexValue {
}
impl ModuleIndexValue {
pub const fn new(vi: VarInfo, referrers: Set<AbsLocation>) -> Self {
Self { vi, referrers }
pub const fn new(name: Str, vi: VarInfo, referrers: Set<AbsLocation>) -> Self {
Self {
name,
vi,
referrers,
}
}
pub fn push_ref(&mut self, referrer: AbsLocation) {
@ -65,19 +71,19 @@ impl ModuleIndex {
}
}
pub fn inc_ref(&mut self, vi: &VarInfo, referrer: AbsLocation) {
pub fn inc_ref(&mut self, name: &Str, vi: &VarInfo, referrer: AbsLocation) {
let referee = vi.def_loc.clone();
if let Some(referrers) = self.members.get_mut(&referee) {
referrers.push_ref(referrer);
} else {
let value = ModuleIndexValue::new(vi.clone(), set! {referrer});
let value = ModuleIndexValue::new(name.clone(), vi.clone(), set! {referrer});
self.members.insert(referee, value);
}
}
pub fn register(&mut self, vi: &VarInfo) {
pub fn register(&mut self, name: Str, vi: &VarInfo) {
let referee = vi.def_loc.clone();
let value = ModuleIndexValue::new(vi.clone(), set! {});
let value = ModuleIndexValue::new(name, vi.clone(), set! {});
self.members.insert(referee, value);
}
@ -90,8 +96,12 @@ impl ModuleIndex {
}
pub fn remove_path(&mut self, path: &Path) {
self.members
.retain(|loc, _| loc.module.as_deref() != Some(path));
self.members.retain(|loc, value| {
value
.referrers
.retain(|ref_loc| ref_loc.module.as_deref() != Some(path));
loc.module.as_deref() != Some(path)
});
}
}
@ -109,12 +119,12 @@ impl SharedModuleIndex {
Self(Shared::new(ModuleIndex::new()))
}
pub fn inc_ref(&self, vi: &VarInfo, referrer: AbsLocation) {
self.0.borrow_mut().inc_ref(vi, referrer);
pub fn inc_ref(&self, name: &Str, vi: &VarInfo, referrer: AbsLocation) {
self.0.borrow_mut().inc_ref(name, vi, referrer);
}
pub fn register(&self, vi: &VarInfo) {
self.0.borrow_mut().register(vi);
pub fn register(&self, name: Str, vi: &VarInfo) {
self.0.borrow_mut().register(name, vi);
}
pub fn get_refs(