Actually just three programming languages in a trenchcoat
at main 59 lines 1.4 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 RestPattern { 8 pub rest: Token, 9 pub pattern: Option<Pattern>, 10 pub span: Span, 11} 12 13impl Spanned for RestPattern { 14 fn span(&self) -> Span { 15 self.span 16 } 17} 18 19impl RestPattern { 20 pub(crate) fn new(rest: Token, pattern: Pattern) -> Self { 21 Self { 22 span: rest.span.union(pattern.span()), 23 rest, 24 pattern: Some(pattern), 25 } 26 } 27 28 pub(crate) fn parse(parser: &mut Parser, rest: Token) -> SyntaxResult<Self> { 29 if parser 30 .check([ 31 TokenType::OpComma, 32 TokenType::CBrack, 33 TokenType::CBracePipe, 34 TokenType::CBrackPipe, 35 ]) 36 .is_ok() 37 { 38 return Ok(Self { 39 span: rest.span, 40 rest, 41 pattern: None, 42 }); 43 } 44 let pattern = Pattern::parse(parser)?; 45 Ok(Self { 46 span: rest.span.union(pattern.span()), 47 rest, 48 pattern: Some(pattern), 49 }) 50 } 51} 52 53impl TryFrom<(Token, Expression)> for RestPattern { 54 type Error = SyntaxError; 55 56 fn try_from((rest, val): (Token, Expression)) -> Result<Self, Self::Error> { 57 Ok(Self::new(rest, val.try_into()?)) 58 } 59}