Actually just three programming languages in a trenchcoat
1use super::{expression::Precedence, *};
2use crate::{Parser, Spanned};
3use source_span::Span;
4use trilogy_scanner::{Token, TokenType::*};
5
6/// An exit expression.
7///
8/// ```trilogy
9/// exit 123
10/// ```
11#[derive(Clone, Debug)]
12pub struct ExitExpression {
13 pub exit: Token,
14 pub expression: Expression,
15 pub span: Span,
16}
17
18impl Spanned for ExitExpression {
19 fn span(&self) -> Span {
20 self.span
21 }
22}
23
24impl ExitExpression {
25 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> {
26 let exit = parser.expect(KwExit).unwrap();
27 let expression = Expression::parse_precedence(parser, Precedence::Continuation)?;
28 Ok(Self {
29 span: exit.span.union(expression.span()),
30 exit,
31 expression,
32 })
33 }
34}
35
36#[cfg(test)]
37mod test {
38 use super::*;
39
40 test_parse!(exitexpr_unit: "exit unit" => ExitExpression::parse => ExitExpression { .. });
41 test_parse!(exitexpr_value: "exit true" => ExitExpression::parse => ExitExpression { .. });
42 test_parse_error!(exitexpr_empty: "exit" => ExitExpression::parse);
43}