Actually just three programming languages in a trenchcoat
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}