mirror of
https://github.com/Dummi26/mers.git
synced 2025-03-10 14:13:52 +01:00
fix variable shadowing not working (how was this not noticed until now??)
This commit is contained in:
parent
4fb84741ef
commit
05c88b7826
@ -11,7 +11,7 @@ repository = "https://github.com/Dummi26/mers"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
mers_lib = "0.6.0"
|
# mers_lib = "0.6.0"
|
||||||
# mers_lib = { path = "../mers_lib" }
|
mers_lib = { path = "../mers_lib" }
|
||||||
clap = { version = "4.3.19", features = ["derive"] }
|
clap = { version = "4.3.19", features = ["derive"] }
|
||||||
colored = "2.1.0"
|
colored = "2.1.0"
|
||||||
|
@ -45,10 +45,10 @@ impl<L: Local> Local for Info<L> {
|
|||||||
self.scopes.last_mut().unwrap().init_var(id, value)
|
self.scopes.last_mut().unwrap().init_var(id, value)
|
||||||
}
|
}
|
||||||
fn get_var(&self, id: &Self::VariableIdentifier) -> Option<&Self::VariableData> {
|
fn get_var(&self, id: &Self::VariableIdentifier) -> Option<&Self::VariableData> {
|
||||||
self.scopes.iter().find_map(|l| l.get_var(id))
|
self.scopes.iter().rev().find_map(|l| l.get_var(id))
|
||||||
}
|
}
|
||||||
fn get_var_mut(&mut self, id: &Self::VariableIdentifier) -> Option<&mut Self::VariableData> {
|
fn get_var_mut(&mut self, id: &Self::VariableIdentifier) -> Option<&mut Self::VariableData> {
|
||||||
self.scopes.iter_mut().find_map(|l| l.get_var_mut(id))
|
self.scopes.iter_mut().rev().find_map(|l| l.get_var_mut(id))
|
||||||
}
|
}
|
||||||
fn duplicate(&self) -> Self {
|
fn duplicate(&self) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
@ -25,9 +25,15 @@ impl MersStatement for AssignTo {
|
|||||||
return Err("can't init to statement type AssignTo".to_string().into());
|
return Err("can't init to statement type AssignTo".to_string().into());
|
||||||
}
|
}
|
||||||
let source = self.source.check(info, None)?;
|
let source = self.source.check(info, None)?;
|
||||||
let target = match self.target.check(info, Some(&source)) {
|
let target = match self
|
||||||
|
.target
|
||||||
|
.check(info, if self.is_init { Some(&source) } else { None })
|
||||||
|
{
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
if !self.is_init {
|
||||||
|
return Err(e);
|
||||||
|
}
|
||||||
return Err(CheckError::new()
|
return Err(CheckError::new()
|
||||||
.src(vec![
|
.src(vec![
|
||||||
(self.pos_in_src.clone(), None),
|
(self.pos_in_src.clone(), None),
|
||||||
@ -35,7 +41,7 @@ impl MersStatement for AssignTo {
|
|||||||
(self.source.source_range(), Some(error_colors::InitFrom)),
|
(self.source.source_range(), Some(error_colors::InitFrom)),
|
||||||
])
|
])
|
||||||
.msg(format!("Cannot initialize:"))
|
.msg(format!("Cannot initialize:"))
|
||||||
.err(e))
|
.err(e));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if !self.is_init {
|
if !self.is_init {
|
||||||
|
@ -44,12 +44,12 @@ pub trait MersStatement: Debug + Send + Sync {
|
|||||||
fn run_custom(&self, info: &mut Info) -> Data;
|
fn run_custom(&self, info: &mut Info) -> Data;
|
||||||
/// if true, local variables etc. will be contained inside their own scope.
|
/// if true, local variables etc. will be contained inside their own scope.
|
||||||
fn has_scope(&self) -> bool;
|
fn has_scope(&self) -> bool;
|
||||||
fn check(&self, info: &mut CheckInfo, assign: Option<&Type>) -> Result<Type, CheckError> {
|
fn check(&self, info: &mut CheckInfo, init_to: Option<&Type>) -> Result<Type, CheckError> {
|
||||||
info.global.depth += 1;
|
info.global.depth += 1;
|
||||||
if self.has_scope() {
|
if self.has_scope() {
|
||||||
info.create_scope();
|
info.create_scope();
|
||||||
}
|
}
|
||||||
let o = self.check_custom(info, assign);
|
let o = self.check_custom(info, init_to);
|
||||||
if info.global.enable_hooks {
|
if info.global.enable_hooks {
|
||||||
// Hooks - keep in sync with run/mod.rs/compile() hooks section
|
// Hooks - keep in sync with run/mod.rs/compile() hooks section
|
||||||
'hook_save_info_at: {
|
'hook_save_info_at: {
|
||||||
|
Loading…
Reference in New Issue
Block a user