minor stuff

This commit is contained in:
Moritz Gmeiner 2024-09-02 01:03:06 +02:00
commit f6dbc17f92
3 changed files with 20 additions and 15 deletions

View file

@ -135,10 +135,6 @@ impl Eval for Expr {
}
Expr::Call { callee, args } => {
let callee = callee.eval(env)?;
/* let args = args
.iter()
.map(|arg| arg.eval(env))
.collect::<EvalResult<Vec<Value>>>()?; */
for arg in args {
let arg = arg.eval(env)?;

View file

@ -106,7 +106,7 @@ impl Resolver {
if let Some(local_scope) = self.local_scopes_mut().last_mut() {
local_scope.insert(name, ResolveStatus::Defined);
} else {
self.global_scope.insert(name, ResolveStatus::Declared);
self.global_scope.insert(name, ResolveStatus::Defined);
}
}
@ -119,8 +119,15 @@ impl Resolver {
}
fn resolve_var(&mut self, name: &str) -> ResolverResult<Expr> {
if name == "this" {
return Err(ResolverError::ThisOutsideMethod);
} else if name == "super" {
return Err(ResolverError::SuperOutsideMethod);
}
let mut level = 0;
// resolve normal local variable
for scope in self.local_scopes().iter().rev() {
if scope.contains_key(name) {
return Ok(Expr::local_variable(name, level));
@ -128,6 +135,7 @@ impl Resolver {
level += 1;
}
// resolve closure variable
for frame in self.frames.iter().rev().skip(1) {
for scope in frame.iter().rev() {
if scope.contains_key(name) {
@ -147,18 +155,14 @@ impl Resolver {
}
}
// resolve global variable
if self.global_scope.contains_key(name) {
return Ok(Expr::global_variable(name));
}
if name == "this" {
Err(ResolverError::ThisOutsideMethod)
} else if name == "super" {
Err(ResolverError::SuperOutsideMethod)
} else {
let name = name.into();
Err(ResolverError::UnresolvableVariable { name })
}
let name = name.into();
Err(ResolverError::UnresolvableVariable { name })
}
fn resolve_stmt(&mut self, stmt: &mut Stmt) -> ResolverResult<()> {
@ -234,6 +238,7 @@ impl Resolver {
Expr::Variable { name } => {
if let Some(ResolveStatus::Declared) = self.check(name) {
let name = name.clone();
return Err(ResolverError::VarInOwnInitializer { name });
}
@ -241,7 +246,7 @@ impl Resolver {
Ok(())
}
Expr::LocalVariable { name, level: _ } => {
Expr::LocalVariable { name, .. } => {
panic!("Tried to resolve variable {name} twice")
}
Expr::GlobalVariable { name } => {
@ -302,6 +307,7 @@ impl Resolver {
for param_name in param_names.iter() {
self.declare(param_name.clone())?;
self.define(param_name.clone());
}