sway_ast/
statement.rs

1use sway_error::handler::ErrorEmitted;
2
3use crate::priv_prelude::*;
4
5#[allow(clippy::large_enum_variant)]
6#[derive(Clone, Debug, Serialize)]
7pub enum Statement {
8    Let(StatementLet),
9    Item(Item),
10    Expr {
11        expr: Expr,
12        semicolon_token_opt: Option<SemicolonToken>,
13    },
14    // to handle parser recovery: Error represents an unknown statement
15    Error(Box<[Span]>, #[serde(skip_serializing)] ErrorEmitted),
16}
17
18#[derive(Clone, Debug, Serialize)]
19pub struct StatementLet {
20    pub let_token: LetToken,
21    pub pattern: Pattern,
22    pub ty_opt: Option<(ColonToken, Ty)>,
23    pub eq_token: EqToken,
24    pub expr: Expr,
25    pub semicolon_token: SemicolonToken,
26}
27
28impl Spanned for Statement {
29    fn span(&self) -> Span {
30        match self {
31            Statement::Let(statement_let) => statement_let.span(),
32            Statement::Item(item) => item.span(),
33            Statement::Expr {
34                expr,
35                semicolon_token_opt,
36            } => match semicolon_token_opt {
37                None => expr.span(),
38                Some(semicolon_token) => Span::join(expr.span(), &semicolon_token.span()),
39            },
40            Statement::Error(spans, _) => Span::join_all(spans.iter().cloned()),
41        }
42    }
43}
44
45impl Spanned for StatementLet {
46    fn span(&self) -> Span {
47        Span::join(self.let_token.span(), &self.semicolon_token.span())
48    }
49}