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/// A continue expression.
7///
8/// ```trilogy
9/// continue unit
10/// ```
11#[derive(Clone, Debug, PrettyPrintSExpr)]
12pub struct ContinueExpression {
13 pub r#continue: Token,
14 pub expression: Expression,
15 span: Span,
16}
17
18impl ContinueExpression {
19 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> {
20 let r#continue = parser.expect(KwContinue).unwrap();
21 let expression = Expression::parse_precedence(parser, Precedence::Continuation)?;
22 Ok(Self {
23 span: r#continue.span.union(expression.span()),
24 r#continue,
25 expression,
26 })
27 }
28}
29
30impl Spanned for ContinueExpression {
31 fn span(&self) -> Span {
32 self.span
33 }
34}
35
36#[cfg(test)]
37mod test {
38 use super::*;
39
40 test_parse!(continueexpr_unit: "continue unit" => ContinueExpression::parse => "(ContinueExpression _ _)");
41 test_parse!(continueexpr_value: "continue true" => ContinueExpression::parse => "(ContinueExpression _ _)");
42 test_parse_error!(continueexpr_empty: "continue" => ContinueExpression::parse);
43}