diff options
author | Vincent Ambo <mail@tazj.in> | 2022-09-20T22·10+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-20T23·48+0000 |
commit | 489395448f0fbe268c6503018012992e1e6cfc22 (patch) | |
tree | 4e08eb86c77b63e7a0b49f47ee820a3d29876e86 /tvix/eval/src | |
parent | 8f2004d360dde108f90d2b49b0609bd43b7b6d7d (diff) |
feat(tvix/eval): track other type in NotCallable error kind r/4944
This makes for slightly nicer error messages if something isn't, well, callable. Change-Id: I821c8d7447b93aea9ccaaa52ed329de0cca4b18e Reviewed-on: https://cl.tvl.fyi/c/depot/+/6718 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
Diffstat (limited to 'tvix/eval/src')
-rw-r--r-- | tvix/eval/src/errors.rs | 11 | ||||
-rw-r--r-- | tvix/eval/src/vm.rs | 4 |
2 files changed, 9 insertions, 6 deletions
diff --git a/tvix/eval/src/errors.rs b/tvix/eval/src/errors.rs index 17b236d0385f..83496b59df33 100644 --- a/tvix/eval/src/errors.rs +++ b/tvix/eval/src/errors.rs @@ -60,7 +60,7 @@ pub enum ErrorKind { VariableAlreadyDefined(Span), /// Attempt to call something that is not callable. - NotCallable, + NotCallable(&'static str), /// Infinite recursion encountered while forcing thunks. InfiniteRecursion, @@ -191,8 +191,11 @@ to a missing value in the attribute set(s) included via `with`."#, ErrorKind::VariableAlreadyDefined(_) => "variable has already been defined".to_string(), - ErrorKind::NotCallable => { - "this value is not callable (i.e. not a function or builtin)".to_string() + ErrorKind::NotCallable(other_type) => { + format!( + "only functions and builtins can be called, but this is a '{}'", + other_type + ) } ErrorKind::InfiniteRecursion => "infinite recursion encountered".to_string(), @@ -261,7 +264,7 @@ to a missing value in the attribute set(s) included via `with`."#, ErrorKind::UnknownStaticVariable => "E010", ErrorKind::UnknownDynamicVariable(_) => "E011", ErrorKind::VariableAlreadyDefined(_) => "E012", - ErrorKind::NotCallable => "E013", + ErrorKind::NotCallable(_) => "E013", ErrorKind::InfiniteRecursion => "E014", ErrorKind::ParseErrors(_) => "E015", ErrorKind::DuplicateAttrsKey { .. } => "E016", diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 69ffc7d5c293..87adfe5611a4 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -193,7 +193,7 @@ impl<'o> VM<'o> { Value::Thunk(t) => self.call_value(&t.value()), // TODO: this isn't guaranteed to be a useful span, actually - _ => Err(self.error(ErrorKind::NotCallable)), + other => Err(self.error(ErrorKind::NotCallable(other.type_of()))), } } @@ -499,7 +499,7 @@ impl<'o> VM<'o> { frame.ip = CodeIdx(0); // reset instruction pointer to beginning } - _ => return Err(self.error(ErrorKind::NotCallable)), + _ => return Err(self.error(ErrorKind::NotCallable(callable.type_of()))), } } |