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