Skip to content

Commit ea59a58

Browse files
fruno-bulaxlpil
authored andcommitted
🐛 Recognize missing pattern in alternative as syntax error
1 parent f0cd386 commit ea59a58

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

compiler-core/src/parse.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,11 +1609,18 @@ where
16091609
match &patterns.first() {
16101610
Some(lead) => {
16111611
let mut alternative_patterns = vec![];
1612-
loop {
1613-
if self.maybe_one(&Token::Vbar).is_none() {
1614-
break;
1612+
while let Some((vbar_start, vbar_end)) = self.maybe_one(&Token::Vbar) {
1613+
let patterns = self.parse_patterns(PatternPosition::CaseClause)?;
1614+
if patterns.is_empty() {
1615+
return parse_error(
1616+
ParseErrorType::ExpectedPattern,
1617+
SrcSpan {
1618+
start: vbar_start,
1619+
end: vbar_end,
1620+
},
1621+
);
16151622
}
1616-
alternative_patterns.push(self.parse_patterns(PatternPosition::CaseClause)?);
1623+
alternative_patterns.push(patterns);
16171624
}
16181625
let guard = self.parse_case_clause_guard()?;
16191626
let (arr_s, arr_e) = self
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
source: compiler-core/src/parse/tests.rs
3+
expression: "\nfn main() {\n case 1 {\n 1 | -> 1\n _ -> 1\n }\n}\n"
4+
---
5+
----- SOURCE CODE
6+
7+
fn main() {
8+
case 1 {
9+
1 | -> 1
10+
_ -> 1
11+
}
12+
}
13+
14+
15+
----- ERROR
16+
error: Syntax error
17+
┌─ /src/parse/error.gleam:4:9
18+
19+
41 | -> 1
20+
^ I was expecting a pattern after this
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
source: compiler-core/src/parse/tests.rs
3+
expression: "\nfn main() {\n case 1 {\n -> 1\n _ -> 2\n }\n}\n"
4+
---
5+
----- SOURCE CODE
6+
7+
fn main() {
8+
case 1 {
9+
-> 1
10+
_ -> 2
11+
}
12+
}
13+
14+
15+
----- ERROR
16+
error: Syntax error
17+
┌─ /src/parse/error.gleam:4:7
18+
19+
4-> 1
20+
^^ I was not expecting this
21+
22+
Found `->`, expected one of:
23+
- `}`
24+
- a case clause

compiler-core/src/parse/tests.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,34 @@ fn main() {
11441144
);
11451145
}
11461146

1147+
#[test]
1148+
fn case_clause_no_subject() {
1149+
assert_module_error!(
1150+
"
1151+
fn main() {
1152+
case 1 {
1153+
-> 1
1154+
_ -> 2
1155+
}
1156+
}
1157+
"
1158+
);
1159+
}
1160+
1161+
#[test]
1162+
fn case_alternative_clause_no_subject() {
1163+
assert_module_error!(
1164+
"
1165+
fn main() {
1166+
case 1 {
1167+
1 | -> 1
1168+
_ -> 1
1169+
}
1170+
}
1171+
"
1172+
);
1173+
}
1174+
11471175
#[test]
11481176
fn use_invalid_assignments() {
11491177
assert_module_error!(

0 commit comments

Comments
 (0)