Skip to content

Commit 1a4863c

Browse files
fruno-bulaxlpil
authored andcommitted
✨ Improve error for wrong number of subjects
1 parent ea59a58 commit 1a4863c

File tree

5 files changed

+41
-5
lines changed

5 files changed

+41
-5
lines changed

compiler-core/src/type_/expression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2339,7 +2339,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
23392339
PatternPosition::CaseClause,
23402340
);
23412341

2342-
let typed_pattern = pattern_typer.infer_multi_pattern(pattern, subjects, location);
2342+
let typed_pattern = pattern_typer.infer_multi_pattern(pattern, subjects);
23432343

23442344
// Each case clause has one or more patterns that may match the
23452345
// subject in order for the clause to be selected, so we must type

compiler-core/src/type_/pattern.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ impl<'a, 'b> PatternTyper<'a, 'b> {
266266
location: &SrcSpan,
267267
) -> Vec<TypedPattern> {
268268
self.mode = PatternMode::Alternative(vec![]);
269-
let typed_multi = self.infer_multi_pattern(multi_pattern, subjects, location);
269+
let typed_multi = self.infer_multi_pattern(multi_pattern, subjects);
270270

271271
if self.error_encountered {
272272
return typed_multi;
@@ -300,12 +300,18 @@ impl<'a, 'b> PatternTyper<'a, 'b> {
300300
&mut self,
301301
multi_pattern: UntypedMultiPattern,
302302
subjects: &[TypedExpr],
303-
location: &SrcSpan,
304303
) -> Vec<TypedPattern> {
305304
// If there are N subjects the multi-pattern is expected to be N patterns
306305
if subjects.len() != multi_pattern.len() {
306+
let first = multi_pattern
307+
.first()
308+
.expect("multi-pattern to contain at least one pattern");
309+
let last = multi_pattern
310+
.last()
311+
.expect("multi-pattern to contain at least one pattern");
312+
307313
self.error(Error::IncorrectNumClausePatterns {
308-
location: *location,
314+
location: first.location().merge(&last.location()),
309315
expected: subjects.len(),
310316
given: multi_pattern.len(),
311317
});

compiler-core/src/type_/tests/errors.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,11 @@ fn wrong_number_of_subjects() {
385385
assert_error!("case 1 { _, _ -> 1 }");
386386
}
387387

388+
#[test]
389+
fn wrong_number_of_subjects_alternative_patterns() {
390+
assert_error!("case 1 { _, _ | _ | _, _, _ -> 1 }");
391+
}
392+
388393
#[test]
389394
fn recursive_var() {
390395
assert_error!("let id = fn(x) { x(x) } 1");

compiler-core/src/type_/tests/snapshots/gleam_core__type___tests__errors__wrong_number_of_subjects.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ error: Incorrect number of patterns
1010
┌─ /src/one/two.gleam:1:10
1111
1212
1case 1 { _, _ -> 1 }
13-
^^^^^^^^^ Expected 1 patterns, got 2
13+
^^^^ Expected 1 patterns, got 2
1414

1515
This case expression has 1 subjects, but this pattern matches 2.
1616
Each clause must have a pattern for every subject value.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
source: compiler-core/src/type_/tests/errors.rs
3+
expression: "case 1 { _, _ | _ | _, _, _ -> 1 }"
4+
---
5+
----- SOURCE CODE
6+
case 1 { _, _ | _ | _, _, _ -> 1 }
7+
8+
----- ERROR
9+
error: Incorrect number of patterns
10+
┌─ /src/one/two.gleam:1:10
11+
12+
1case 1 { _, _ | _ | _, _, _ -> 1 }
13+
^^^^ Expected 1 patterns, got 2
14+
15+
This case expression has 1 subjects, but this pattern matches 2.
16+
Each clause must have a pattern for every subject value.
17+
18+
error: Incorrect number of patterns
19+
┌─ /src/one/two.gleam:1:21
20+
21+
1case 1 { _, _ | _ | _, _, _ -> 1 }
22+
^^^^^^^ Expected 1 patterns, got 3
23+
24+
This case expression has 1 subjects, but this pattern matches 3.
25+
Each clause must have a pattern for every subject value.

0 commit comments

Comments
 (0)