DEV: Fix bad error reporting for bad function calls.

This commit is contained in:
Jeremy Wall 2019-11-27 22:36:25 -06:00
parent b4c23abbfa
commit 95293ce87f
2 changed files with 16 additions and 3 deletions

View File

@ -576,3 +576,14 @@ fn test_bad_import_path_compile_failure() {
], ],
) )
} }
#[test]
fn test_invalid_call_selector() {
assert_build_failure(
"let tpl = { f = {}}; tpl.f();",
vec![
Regex::new(r"Not a function").unwrap(),
Regex::new(r"line: 1 column: 26").unwrap(),
],
)
}

View File

@ -510,7 +510,7 @@ where
} }
fn op_fcall(&mut self, pos: Position) -> Result<(), Error> { fn op_fcall(&mut self, pos: Position) -> Result<(), Error> {
let (f, f_pos) = self.pop()?; let (f, f_pos) = dbg!(self.pop())?;
let (arg_length, _) = self.pop()?; let (arg_length, _) = self.pop()?;
if let &F(ref f) = f.as_ref() { if let &F(ref f) = f.as_ref() {
if let &P(Int(arg_length)) = arg_length.as_ref() { if let &P(Int(arg_length)) = arg_length.as_ref() {
@ -537,6 +537,8 @@ where
let (val, _) = decorate_call!(f_pos => let (val, _) = decorate_call!(f_pos =>
Self::fcall_impl(f, self.runtime.strict, &mut self.stack, self.env.clone(), &self.import_stack))?; Self::fcall_impl(f, self.runtime.strict, &mut self.stack, self.env.clone(), &self.import_stack))?;
self.push(val, pos.clone())?; self.push(val, pos.clone())?;
} else {
return Err(Error::new(format!("Not a function! {:?}", f,), pos));
} }
Ok(()) Ok(())
} }
@ -807,7 +809,7 @@ where
fn op_index(&mut self, safe: bool, pos: Position) -> Result<(), Error> { fn op_index(&mut self, safe: bool, pos: Position) -> Result<(), Error> {
// left and then right // left and then right
let (right, right_pos) = self.pop()?; let (right, right_pos) = dbg!(self.pop())?;
let (left, _) = self.pop()?; let (left, _) = self.pop()?;
match right.as_ref() { match right.as_ref() {
&P(Int(i)) => { &P(Int(i)) => {
@ -822,7 +824,7 @@ where
if let &C(Tuple(ref flds, _)) = left.as_ref() { if let &C(Tuple(ref flds, _)) = left.as_ref() {
for &(ref key, ref val) in flds.iter() { for &(ref key, ref val) in flds.iter() {
if key == s { if key == s {
self.push(val.clone(), right_pos)?; self.push(dbg!(val).clone(), right_pos)?;
return Ok(()); return Ok(());
} }
} }