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 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}