Actually just three programming languages in a trenchcoat
at main 57 lines 1.5 kB view raw
1use super::*; 2use crate::{Parser, Spanned}; 3use source_span::Span; 4use trilogy_scanner::{Token, TokenType::*}; 5 6#[derive(Clone, Debug)] 7pub struct ParenthesizedPattern { 8 pub open_paren: Token, 9 pub pattern: Pattern, 10 pub close_paren: Token, 11 pub span: Span, 12} 13 14impl Spanned for ParenthesizedPattern { 15 fn span(&self) -> Span { 16 self.span 17 } 18} 19 20impl ParenthesizedPattern { 21 pub(crate) fn finish( 22 parser: &mut Parser, 23 open_paren: Token, 24 pattern: Pattern, 25 ) -> SyntaxResult<Self> { 26 let close_paren = parser 27 .expect(CParen) 28 .map_err(|token| parser.expected(token, "expected `)`"))?; 29 Ok(Self { 30 span: open_paren.span.union(close_paren.span()), 31 open_paren, 32 pattern, 33 close_paren, 34 }) 35 } 36 37 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 38 let open_paren = parser 39 .expect(OParen) 40 .map_err(|token| parser.expected(token, "expected `(`"))?; 41 let pattern = Pattern::parse(parser)?; 42 Self::finish(parser, open_paren, pattern) 43 } 44} 45 46impl TryFrom<ParenthesizedExpression> for ParenthesizedPattern { 47 type Error = SyntaxError; 48 49 fn try_from(value: ParenthesizedExpression) -> Result<Self, Self::Error> { 50 Ok(Self { 51 span: value.span, 52 open_paren: value.open_paren, 53 pattern: value.expression.try_into()?, 54 close_paren: value.close_paren, 55 }) 56 } 57}