Skip to content

Commit 465a5d4

Browse files
AaronC81lpil
authored andcommitted
Extend type angle-bracket generics errors to cover type definitions
1 parent aaa625a commit 465a5d4

File tree

4 files changed

+62
-18
lines changed

4 files changed

+62
-18
lines changed

compiler-core/src/parse.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2547,24 +2547,31 @@ where
25472547
&mut self,
25482548
) -> Result<(u32, EcoString, Vec<SpannedString>, u32, u32), ParseError> {
25492549
let (start, upname, end) = self.expect_upname()?;
2550-
match self.maybe_one(&Token::LeftParen) {
2551-
Some((par_s, _)) => {
2552-
let arguments =
2553-
Parser::series_of(self, &|p| Ok(Parser::maybe_name(p)), Some(&Token::Comma))?;
2554-
let (_, par_e) = self.expect_one_following_series(&Token::RightParen, "a name")?;
2555-
if arguments.is_empty() {
2556-
return parse_error(
2557-
ParseErrorType::TypeDefinitionNoArguments,
2558-
SrcSpan::new(par_s, par_e),
2559-
);
2560-
}
2561-
let arguments2 = arguments
2562-
.into_iter()
2563-
.map(|(start, name, end)| (SrcSpan { start, end }, name))
2564-
.collect();
2565-
Ok((start, upname, arguments2, par_e, end))
2550+
if let Some((par_s, _)) = self.maybe_one(&Token::LeftParen) {
2551+
let arguments =
2552+
Parser::series_of(self, &|p| Ok(Parser::maybe_name(p)), Some(&Token::Comma))?;
2553+
let (_, par_e) = self.expect_one_following_series(&Token::RightParen, "a name")?;
2554+
if arguments.is_empty() {
2555+
return parse_error(
2556+
ParseErrorType::TypeDefinitionNoArguments,
2557+
SrcSpan::new(par_s, par_e),
2558+
);
25662559
}
2567-
_ => Ok((start, upname, vec![], end, end)),
2560+
let arguments2 = arguments
2561+
.into_iter()
2562+
.map(|(start, name, end)| (SrcSpan { start, end }, name))
2563+
.collect();
2564+
Ok((start, upname, arguments2, par_e, end))
2565+
} else if let Some((less_start, less_end)) = self.maybe_one(&Token::Less) {
2566+
Err(ParseError {
2567+
error: ParseErrorType::TypeAngleGenerics,
2568+
location: SrcSpan {
2569+
start: less_start,
2570+
end: less_end,
2571+
},
2572+
})
2573+
} else {
2574+
Ok((start, upname, vec![], end, end))
25682575
}
25692576
}
25702577

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
source: compiler-core/src/parse/tests.rs
3+
expression: "\ntype Maybe<A> {\n Some(A)\n None\n}\n"
4+
---
5+
----- SOURCE CODE
6+
7+
type Maybe<A> {
8+
Some(A)
9+
None
10+
}
11+
12+
13+
----- ERROR
14+
error: Syntax error
15+
┌─ /src/parse/error.gleam:2:11
16+
17+
2type Maybe<A> {
18+
│ ^ I was expecting `(` here.
19+
20+
Type parameters use lowercase names and are surrounded by parentheses.
21+
22+
List(String)
23+
Result(Int, Error)
24+
25+
See: https://tour.gleam.run/data-types/generic-custom-types/
File renamed without changes.

compiler-core/src/parse/tests.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1949,6 +1949,18 @@ fn function_definition_angle_generics_error() {
19491949
}
19501950

19511951
#[test]
1952-
fn type_angle_generics_error() {
1952+
fn type_angle_generics_usage_error() {
19531953
assert_error!("let list: List<Int> = []");
19541954
}
1955+
1956+
#[test]
1957+
fn type_angle_generics_definition_error() {
1958+
assert_module_error!(
1959+
r#"
1960+
type Maybe<A> {
1961+
Some(A)
1962+
None
1963+
}
1964+
"#
1965+
);
1966+
}

0 commit comments

Comments
 (0)