From a5b0bc04ebeb700900b9e11dc5550edb67271cba Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Tue, 27 Aug 2024 15:33:31 -0500 Subject: [PATCH] fixed variable shadowing --- kabel/src/name_resolution.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/kabel/src/name_resolution.rs b/kabel/src/name_resolution.rs index 8444dd537b6b9923cbc1b6ab069400dc571e0331..aef3a592e173b104222958c5694477375a9f6787 100644 --- a/kabel/src/name_resolution.rs +++ b/kabel/src/name_resolution.rs @@ -165,7 +165,8 @@ impl Resolver { Decl(name, expr) => { let expr = self.visit(*expr); self.locals.last_mut().expect("locals last in decl push").push(self.scope); - if self.resolve_var(&name.name).0 { + let resolution = self.resolve_var(&name.name); + if resolution.0 && resolution.2 == self.scope { self.errors.push(out_of_scope_var!(self, ErrorKind::VariableAlreadyDeclaredVariable, ast, "Variable \"{}\" already declared", name ; @@ -304,13 +305,13 @@ impl Resolver { self.visit(left); self.visit(right); }*/ - fn resolve_var(&self, name: &String) -> (bool, usize) { - for scope in self.symbol_table.iter().rev() { + fn resolve_var(&self, name: &String) -> (bool, usize, usize) { + for (scope_num, scope) in self.symbol_table.iter().enumerate().rev() { if let Some((Symbol::Var, place)) | Some((Symbol::Function(_), place)) = scope.get(name) { - return (true, *place); + return (true, *place, scope_num); } } - (false, 0) + (false, 0, 0) } fn resolve_function(&mut self, name: &String, arity: usize) -> Result, Option)>{ for scope in self.symbol_table.iter().rev() {