Actually just three programming languages in a trenchcoat
at string-repr-callable 54 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, PrettyPrintSExpr)] 7pub struct ParenthesizedPattern { 8 pub open_paren: Token, 9 pub pattern: Pattern, 10 pub close_paren: Token, 11} 12 13impl Spanned for ParenthesizedPattern { 14 fn span(&self) -> Span { 15 self.open_paren.span.union(self.close_paren.span()) 16 } 17} 18 19impl ParenthesizedPattern { 20 pub(crate) fn finish( 21 parser: &mut Parser, 22 open_paren: Token, 23 pattern: Pattern, 24 ) -> SyntaxResult<Self> { 25 let close_paren = parser 26 .expect(CParen) 27 .map_err(|token| parser.expected(token, "expected `)`"))?; 28 Ok(Self { 29 open_paren, 30 pattern, 31 close_paren, 32 }) 33 } 34 35 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 36 let open_paren = parser 37 .expect(OParen) 38 .map_err(|token| parser.expected(token, "expected `(`"))?; 39 let pattern = Pattern::parse(parser)?; 40 Self::finish(parser, open_paren, pattern) 41 } 42} 43 44impl TryFrom<ParenthesizedExpression> for ParenthesizedPattern { 45 type Error = SyntaxError; 46 47 fn try_from(value: ParenthesizedExpression) -> Result<Self, Self::Error> { 48 Ok(Self { 49 open_paren: value.open_paren, 50 pattern: value.expression.try_into()?, 51 close_paren: value.close_paren, 52 }) 53 } 54}