diff options
Diffstat (limited to 'src/eval/call.rs')
| -rw-r--r-- | src/eval/call.rs | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/src/eval/call.rs b/src/eval/call.rs index d57ed144..7b45c09a 100644 --- a/src/eval/call.rs +++ b/src/eval/call.rs @@ -1,32 +1,26 @@ use super::*; -use crate::diag::Deco; impl Eval for Spanned<&ExprCall> { type Output = Value; fn eval(self, ctx: &mut EvalContext) -> Self::Output { - let name = &self.v.name.v; - let span = self.v.name.span; - - if let Some(value) = ctx.scopes.get(name) { - if let Value::Func(func) = value { - let func = func.clone(); - ctx.deco(Deco::Resolved.with_span(span)); - - let mut args = self.v.args.as_ref().eval(ctx); - let returned = func(ctx, &mut args); - args.finish(ctx); - - return returned; - } else { - let ty = value.type_name(); - ctx.diag(error!(span, "expected function, found {}", ty)); - } - } else if !name.is_empty() { - ctx.diag(error!(span, "unknown function")); + let callee = self.v.callee.eval(ctx); + + if let Value::Func(func) = callee { + let func = func.clone(); + let mut args = self.v.args.as_ref().eval(ctx); + let returned = func(ctx, &mut args); + args.finish(ctx); + + return returned; + } else if callee != Value::Error { + ctx.diag(error!( + self.v.callee.span, + "expected function, found {}", + callee.type_name(), + )); } - ctx.deco(Deco::Unresolved.with_span(span)); Value::Error } } |
