Actually just three programming languages in a trenchcoat
at main 44 lines 1.1 kB view raw
1use super::*; 2use crate::{Parser, Spanned}; 3use source_span::Span; 4use trilogy_scanner::{Token, TokenType}; 5 6/// A fallback `else` handler for a handled `when` statement or expression. 7#[derive(Clone, Debug)] 8pub struct ElseHandler { 9 pub r#else: Token, 10 pub strategy: HandlerStrategy, 11 pub span: Span, 12} 13 14impl ElseHandler { 15 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 16 let r#else = parser.expect(TokenType::KwElse).unwrap(); 17 let strategy = HandlerStrategy::parse(parser)?; 18 19 Ok(Self { 20 span: r#else.span.union(strategy.span()), 21 r#else, 22 strategy, 23 }) 24 } 25 26 pub fn else_token(&self) -> &Token { 27 &self.r#else 28 } 29} 30 31impl Spanned for ElseHandler { 32 fn span(&self) -> Span { 33 self.span 34 } 35} 36 37#[cfg(test)] 38mod test { 39 use super::*; 40 41 test_parse!(elsehandler_yield: "else yield" => ElseHandler::parse => ElseHandler { .. }); 42 test_parse!(elsehandler_resume: "else resume 3" => ElseHandler::parse => ElseHandler { .. }); 43 test_parse!(elsehandler_cancel: "else cancel 3" => ElseHandler::parse => ElseHandler { .. }); 44}