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