Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

Extend type angle-bracket generics errors to cover type definitions

+62 -18
+24 -17
compiler-core/src/parse.rs
··· 2547 2547 &mut self, 2548 2548 ) -> Result<(u32, EcoString, Vec<SpannedString>, u32, u32), ParseError> { 2549 2549 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 + ); 2566 2559 } 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)) 2568 2575 } 2569 2576 } 2570 2577
+25
compiler-core/src/parse/snapshots/gleam_core__parse__tests__type_angle_generics_definition_error.snap
··· 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 + 2 │ type 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/
compiler-core/src/parse/snapshots/gleam_core__parse__tests__type_angle_generics_error.snap compiler-core/src/parse/snapshots/gleam_core__parse__tests__type_angle_generics_usage_error.snap
+13 -1
compiler-core/src/parse/tests.rs
··· 1949 1949 } 1950 1950 1951 1951 #[test] 1952 - fn type_angle_generics_error() { 1952 + fn type_angle_generics_usage_error() { 1953 1953 assert_error!("let list: List<Int> = []"); 1954 1954 } 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 + }