Improve error messages of branching cases

This commit is contained in:
imaqtkatt 2024-07-24 17:18:05 -03:00
parent 2232a708e3
commit 676d4ca732
10 changed files with 78 additions and 8 deletions

View File

@ -575,7 +575,9 @@ impl<'a> PyParser<'a> {
indent.exit_level();
if nxt_indent != *indent {
return self.expected_indent(*indent, nxt_indent);
return self
.expected_indent(*indent, nxt_indent)
.or(self.expected_spanned("else or elif", self.index..self.index + 1));
}
let mut elifs = Vec::new();
while self.try_parse_keyword("elif") {
@ -588,7 +590,9 @@ impl<'a> PyParser<'a> {
indent.exit_level();
if nxt_indent != *indent {
return self.expected_indent(*indent, nxt_indent);
return self
.expected_indent(*indent, nxt_indent)
.or(self.expected_spanned("else or elif", self.index..self.index + 1));
}
elifs.push((cond, then));
}
@ -630,7 +634,7 @@ impl<'a> PyParser<'a> {
self.consume_new_line()?;
indent.enter_level();
self.consume_indent_exactly(*indent)?;
self.consume_indent_exactly(*indent).or(self.expected_spanned("case", self.index..self.index + 1))?;
let (case, mut nxt_indent) = self.parse_match_case(indent)?;
let mut arms = vec![case];
while nxt_indent == *indent {
@ -728,7 +732,9 @@ impl<'a> PyParser<'a> {
let mut expected_num = 1;
while should_continue {
if nxt_indent != *indent {
return self.expected_indent(*indent, nxt_indent);
return self
.expected_indent(*indent, nxt_indent)
.or(self.expected_spanned("case", self.index..self.index + 1));
}
let (case, stmt, nxt_indent_) = self.parse_switch_case(indent)?;
nxt_indent = nxt_indent_;
@ -793,7 +799,7 @@ impl<'a> PyParser<'a> {
self.consume_new_line()?;
indent.enter_level();
self.consume_indent_exactly(*indent)?;
self.consume_indent_exactly(*indent).or(self.expected_spanned("case", self.index..self.index + 1))?;
let (case, mut nxt_indent) = self.parse_match_case(indent)?;
let mut arms = vec![case];
while nxt_indent == *indent {
@ -824,7 +830,7 @@ impl<'a> PyParser<'a> {
self.consume_new_line()?;
indent.enter_level();
self.consume_indent_exactly(*indent)?;
self.consume_indent_exactly(*indent).or(self.expected_spanned("when", self.index..self.index + 1))?;
self.parse_keyword("when")?;
let cond = self.parse_expr(true, false)?;
self.skip_trivia_inline()?;
@ -837,7 +843,9 @@ impl<'a> PyParser<'a> {
indent.exit_level();
if nxt_indent != *indent {
return self.expected_indent(*indent, nxt_indent);
return self
.expected_indent(*indent, nxt_indent)
.or(self.expected_spanned("else", self.index..self.index + 1));
}
self.parse_keyword("else")?;
self.skip_trivia_inline()?;

View File

@ -0,0 +1,15 @@
def is_even(n):
if n % 2 == 0:
return 1
else:
return 0
def get_even_sum_under_if(this_number):
bend current = 0:
when current < this_number:
new_num = fork(current + is_even(current))
return new_num
def main():
return get_even_sum_under_if(1000)

View File

@ -0,0 +1,3 @@
def main:
fold [] with x = 1:

View File

@ -0,0 +1,4 @@
def main:
if 1 == 1:
return "true"

View File

@ -0,0 +1,3 @@
def main:
match []:

View File

@ -4,5 +4,6 @@ input_file: tests/golden_tests/compile_file/elif_no_else.bend
---
Errors:
In tests/golden_tests/compile_file/elif_no_else.bend :
Indentation error. Expected 2 spaces, got end-of-input.
- expected: else or elif
- detected: end of input
 6 |  

View File

@ -0,0 +1,9 @@
---
source: tests/golden_tests.rs
input_file: tests/golden_tests/parse_file/bend_missing_else.bend
---
Errors:
In tests/golden_tests/parse_file/bend_missing_else.bend :
- expected: else
- detected:
 14 | def main():

View File

@ -0,0 +1,9 @@
---
source: tests/golden_tests.rs
input_file: tests/golden_tests/parse_file/fold_missing_case.bend
---
Errors:
In tests/golden_tests/parse_file/fold_missing_case.bend :
- expected: case
- detected: end of input
 4 |  

View File

@ -0,0 +1,9 @@
---
source: tests/golden_tests.rs
input_file: tests/golden_tests/parse_file/if_missing_else.bend
---
Errors:
In tests/golden_tests/parse_file/if_missing_else.bend :
- expected: else or elif
- detected: end of input
 5 |  

View File

@ -0,0 +1,9 @@
---
source: tests/golden_tests.rs
input_file: tests/golden_tests/parse_file/match_missing_case.bend
---
Errors:
In tests/golden_tests/parse_file/match_missing_case.bend :
- expected: case
- detected: end of input
 4 |