Actually just three programming languages in a trenchcoat
at main 54 lines 1.4 kB view raw
1use super::{pattern::Precedence, *}; 2use crate::{Parser, Spanned}; 3use source_span::Span; 4use trilogy_scanner::{Token, TokenType::*}; 5 6#[derive(Clone, Debug)] 7pub struct NegativePattern { 8 pub minus: Token, 9 pub pattern: Pattern, 10 pub span: Span, 11} 12 13impl NegativePattern { 14 pub(crate) fn new(minus: Token, pattern: Pattern) -> Self { 15 Self { 16 span: minus.span.union(pattern.span()), 17 minus, 18 pattern, 19 } 20 } 21 22 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 23 let minus = parser 24 .expect(OpMinus) 25 .expect("Caller should have found this"); 26 let pattern = Pattern::parse_precedence(parser, Precedence::Unary)?; 27 Ok(Self::new(minus, pattern)) 28 } 29} 30 31impl Spanned for NegativePattern { 32 fn span(&self) -> Span { 33 self.span 34 } 35} 36 37impl TryFrom<UnaryOperation> for NegativePattern { 38 type Error = SyntaxError; 39 40 fn try_from(value: UnaryOperation) -> Result<Self, Self::Error> { 41 let span = value.span(); 42 match value.operator { 43 UnaryOperator::Negate(minus) => Ok(Self { 44 span, 45 minus, 46 pattern: value.operand.try_into()?, 47 }), 48 _ => Err(SyntaxError::new( 49 value.span(), 50 "incorrect operator for negative pattern", 51 )), 52 } 53 } 54}