Skip to content

Commit

Permalink
Improve error messages of branching cases
Browse files Browse the repository at this point in the history
  • Loading branch information
imaqtkatt committed Jul 24, 2024
1 parent 2232a70 commit 676d4ca
Show file tree
Hide file tree
Showing 10 changed files with 78 additions and 8 deletions.
22 changes: 15 additions & 7 deletions src/imp/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand All @@ -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));
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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_;
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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()?;
Expand All @@ -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()?;
Expand Down
15 changes: 15 additions & 0 deletions tests/golden_tests/parse_file/bend_missing_else.bend
Original file line number Diff line number Diff line change
@@ -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)
3 changes: 3 additions & 0 deletions tests/golden_tests/parse_file/fold_missing_case.bend
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def main:
fold [] with x = 1:

4 changes: 4 additions & 0 deletions tests/golden_tests/parse_file/if_missing_else.bend
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
def main:
if 1 == 1:
return "true"

3 changes: 3 additions & 0 deletions tests/golden_tests/parse_file/match_missing_case.bend
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def main:
match []:

3 changes: 2 additions & 1 deletion tests/snapshots/compile_file__elif_no_else.bend.snap
Original file line number Diff line number Diff line change
Expand Up @@ -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 |  
9 changes: 9 additions & 0 deletions tests/snapshots/parse_file__bend_missing_else.bend.snap
Original file line number Diff line number Diff line change
@@ -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():
9 changes: 9 additions & 0 deletions tests/snapshots/parse_file__fold_missing_case.bend.snap
Original file line number Diff line number Diff line change
@@ -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 |  
9 changes: 9 additions & 0 deletions tests/snapshots/parse_file__if_missing_else.bend.snap
Original file line number Diff line number Diff line change
@@ -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 |  
9 changes: 9 additions & 0 deletions tests/snapshots/parse_file__match_missing_case.bend.snap
Original file line number Diff line number Diff line change
@@ -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 |  

0 comments on commit 676d4ca

Please sign in to comment.