From 842891cbf4543f0a46e0ae092874042c08c5ac37 Mon Sep 17 00:00:00 2001 From: imaqtkatt Date: Tue, 2 Jul 2024 09:14:02 -0300 Subject: [PATCH] Add missing error message --- src/fun/parser.rs | 17 ++++++++--------- src/fun/transform/lift_defs.rs | 4 ++-- tests/golden_tests/parse_file/fun_def.bend | 5 +++++ tests/golden_tests/parse_file/fun_def_name.bend | 5 +++++ tests/snapshots/parse_file__fun_def.bend.snap | 5 +++++ .../parse_file__fun_def_name.bend.snap | 8 ++++++++ 6 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 tests/golden_tests/parse_file/fun_def.bend create mode 100644 tests/golden_tests/parse_file/fun_def_name.bend create mode 100644 tests/snapshots/parse_file__fun_def.bend.snap create mode 100644 tests/snapshots/parse_file__fun_def_name.bend.snap diff --git a/src/fun/parser.rs b/src/fun/parser.rs index 1d6530cb..b1c3e177 100644 --- a/src/fun/parser.rs +++ b/src/fun/parser.rs @@ -495,27 +495,26 @@ impl<'a> TermParser<'a> { self.skip_trivia(); let (cur_name, rule) = self.parse_rule()?; let mut rules = vec![rule]; - let mut cur_idx = *self.index(); + let mut nxt_term = *self.index(); loop { self.skip_trivia(); - let back_term = *self.index(); + let nxt_def = *self.index(); match self.parse_rule() { Ok((name, rule)) => { if name == "def" { - self.index = back_term; + self.index = nxt_def; return Ok(Term::Def { nam: cur_name, rules, nxt: Box::new(self.parse_term()?) }); } if name == cur_name { rules.push(rule); - cur_idx = *self.index(); + nxt_term = *self.index(); } else { - panic!() + let cur = *self.index(); + let msg = format!("Expected a rule with name '{cur_name}'."); + return self.with_ctx(Err(msg), nxt_def..cur); } } - Err(_) => { - self.index = cur_idx; - break; - } + Err(_) => break self.index = nxt_term, } } let nxt = self.parse_term()?; diff --git a/src/fun/transform/lift_defs.rs b/src/fun/transform/lift_defs.rs index 1671bee6..3d51a4a4 100644 --- a/src/fun/transform/lift_defs.rs +++ b/src/fun/transform/lift_defs.rs @@ -77,13 +77,13 @@ fn gen_use( fvs.iter().cloned().map(|nam| Term::Var { nam }).collect::>(), ); - let r#use = Term::Use { nam: Some(nam.clone()), val: Box::new(call.clone()), nxt: std::mem::take(nxt) }; - for rule in rules.iter_mut() { let slf = std::mem::take(&mut rule.body); rule.body = Term::Use { nam: Some(nam.clone()), val: Box::new(call.clone()), nxt: Box::new(slf) }; } + let r#use = Term::Use { nam: Some(nam.clone()), val: Box::new(call.clone()), nxt: std::mem::take(nxt) }; + (r#use, fvs, rules) } diff --git a/tests/golden_tests/parse_file/fun_def.bend b/tests/golden_tests/parse_file/fun_def.bend new file mode 100644 index 00000000..0b85c7b9 --- /dev/null +++ b/tests/golden_tests/parse_file/fun_def.bend @@ -0,0 +1,5 @@ +main = + let base = 0 + def aux [] = base + aux (List/Cons head tail) = (+ head (aux tail)) + (aux [1, 2, 3]) diff --git a/tests/golden_tests/parse_file/fun_def_name.bend b/tests/golden_tests/parse_file/fun_def_name.bend new file mode 100644 index 00000000..5befee3c --- /dev/null +++ b/tests/golden_tests/parse_file/fun_def_name.bend @@ -0,0 +1,5 @@ +main = + let base = 0 + def aux [] = base + aux2 (List/Cons head tail) = (+ head (aux tail)) + (aux [1, 2, 3]) diff --git a/tests/snapshots/parse_file__fun_def.bend.snap b/tests/snapshots/parse_file__fun_def.bend.snap new file mode 100644 index 00000000..e6107bf0 --- /dev/null +++ b/tests/snapshots/parse_file__fun_def.bend.snap @@ -0,0 +1,5 @@ +--- +source: tests/golden_tests.rs +input_file: tests/golden_tests/parse_file/fun_def.bend +--- +(main) = let base = 0; def (aux []) = base(aux (List/Cons head tail)) = (+ head (aux tail))(aux [1, 2, 3]) diff --git a/tests/snapshots/parse_file__fun_def_name.bend.snap b/tests/snapshots/parse_file__fun_def_name.bend.snap new file mode 100644 index 00000000..996c633f --- /dev/null +++ b/tests/snapshots/parse_file__fun_def_name.bend.snap @@ -0,0 +1,8 @@ +--- +source: tests/golden_tests.rs +input_file: tests/golden_tests/parse_file/fun_def_name.bend +--- +Errors: +In tests/golden_tests/parse_file/fun_def_name.bend : +Expected a rule with name 'aux'. + 4 | aux2 (List/Cons head tail) = (+ head (aux tail))