syn_solidity/yul/stmt/
for.rs

1use crate::{Spanned, YulBlock, YulExpr};
2use proc_macro2::Span;
3use std::fmt;
4use syn::{
5    parse::{Parse, ParseStream},
6    Result, Token,
7};
8
9/// Yul for loop e.g `for {let i := 0} lt(i,10) {i := add(i,1)} {mstore(i,7)}`.
10///
11/// Solidity Reference:
12/// <https://docs.soliditylang.org/en/latest/grammar.html#a4.SolidityParser.yulForStatement>
13/// breakdown of parts: <https://docs.soliditylang.org/en/latest/yul.html#loops>
14#[derive(Clone)]
15pub struct YulFor {
16    for_token: Token![for],
17    initialization: YulBlock,
18    condition: YulExpr,
19    post_iteration: YulBlock,
20    body: YulBlock,
21}
22
23impl Parse for YulFor {
24    fn parse(input: ParseStream<'_>) -> Result<Self> {
25        Ok(Self {
26            for_token: input.parse()?,
27            initialization: input.parse()?,
28            condition: input.parse()?,
29            post_iteration: input.parse()?,
30            body: input.parse()?,
31        })
32    }
33}
34
35impl Spanned for YulFor {
36    fn span(&self) -> Span {
37        let span = self.for_token.span();
38        span.join(self.body.span()).unwrap_or(span)
39    }
40
41    fn set_span(&mut self, span: Span) {
42        self.for_token.set_span(span);
43        self.initialization.set_span(span);
44        self.condition.set_span(span);
45        self.post_iteration.set_span(span);
46        self.body.set_span(span);
47    }
48}
49
50impl fmt::Debug for YulFor {
51    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52        f.debug_struct("YulFor")
53            .field("initialization", &self.initialization)
54            .field("condition", &self.condition)
55            .field("post_iteration", &self.post_iteration)
56            .field("body", &self.body)
57            .finish()
58    }
59}