syn_solidity/stmt/
return.rs

1use crate::{Expr, Spanned};
2use proc_macro2::Span;
3use std::fmt;
4use syn::{
5    parse::{Parse, ParseStream},
6    Result, Token,
7};
8
9/// A return statement: `return 42;`.
10///
11/// Solidity Reference:
12/// <https://docs.soliditylang.org/en/latest/grammar.html#a4.SolidityParser.returnStatement>
13#[derive(Clone)]
14pub struct StmtReturn {
15    pub return_token: Token![return],
16    pub expr: Option<Expr>,
17    pub semi_token: Token![;],
18}
19
20impl fmt::Debug for StmtReturn {
21    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22        f.debug_struct("StmtReturn").field("expr", &self.expr).finish()
23    }
24}
25
26impl Parse for StmtReturn {
27    fn parse(input: ParseStream<'_>) -> Result<Self> {
28        Ok(Self {
29            return_token: input.parse()?,
30            expr: if input.peek(Token![;]) { None } else { Some(input.parse()?) },
31            semi_token: input.parse()?,
32        })
33    }
34}
35
36impl Spanned for StmtReturn {
37    fn span(&self) -> Span {
38        let span = self.return_token.span;
39        span.join(self.semi_token.span).unwrap_or(span)
40    }
41
42    fn set_span(&mut self, span: Span) {
43        self.return_token.span = span;
44        self.semi_token.span = span;
45    }
46}