@@ 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<usize, (ErrorKind, Option<usize>, Option<usize>)>{
for scope in self.symbol_table.iter().rev() {