Skip to main content

mago_syntax/ast/ast/loop/
mod.rs

1use serde::Serialize;
2
3use mago_span::HasSpan;
4use mago_span::Span;
5
6use crate::ast::ast::expression::Expression;
7use crate::ast::ast::keyword::Keyword;
8use crate::ast::ast::terminator::Terminator;
9
10pub mod do_while;
11pub mod r#for;
12pub mod foreach;
13pub mod r#while;
14
15/// Represents a continue statement in PHP.
16///
17/// Example:
18///
19/// ```php
20/// <?php
21///
22/// for ($i = 0; $i < 10; $i++) {
23///   if ($i === 5) {
24///     continue;
25///   }
26/// }
27/// ```
28#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
29pub struct Continue<'arena> {
30    pub r#continue: Keyword<'arena>,
31    pub level: Option<&'arena Expression<'arena>>,
32    pub terminator: Terminator<'arena>,
33}
34
35/// Represents a break statement in PHP.
36///
37/// Example:
38///
39/// ```php
40/// <?php
41///
42/// for ($i = 0; $i < 10; $i++) {
43///   if ($i === 5) {
44///     break;
45///   }
46/// }
47/// ```
48#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
49pub struct Break<'arena> {
50    pub r#break: Keyword<'arena>,
51    pub level: Option<&'arena Expression<'arena>>,
52    pub terminator: Terminator<'arena>,
53}
54
55impl HasSpan for Continue<'_> {
56    fn span(&self) -> Span {
57        self.r#continue.span().join(self.terminator.span())
58    }
59}
60
61impl HasSpan for Break<'_> {
62    fn span(&self) -> Span {
63        self.r#break.span().join(self.terminator.span())
64    }
65}