syn_solidity/expr/
ternary.rs

1use crate::{utils::ParseNested, Expr, Spanned};
2use proc_macro2::Span;
3use std::fmt;
4use syn::{
5    parse::{Parse, ParseStream},
6    Result, Token,
7};
8
9/// A ternary (AKA conditional) expression: `foo ? bar : baz`.
10#[derive(Clone)]
11pub struct ExprTernary {
12    pub cond: Box<Expr>,
13    pub question_token: Token![?],
14    pub if_true: Box<Expr>,
15    pub colon_token: Token![:],
16    pub if_false: Box<Expr>,
17}
18
19impl fmt::Debug for ExprTernary {
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        f.debug_struct("ExprTernary")
22            .field("cond", &self.cond)
23            .field("if_true", &self.if_true)
24            .field("if_false", &self.if_false)
25            .finish()
26    }
27}
28
29impl ParseNested for ExprTernary {
30    fn parse_nested(expr: Box<Expr>, input: ParseStream<'_>) -> Result<Self> {
31        Ok(Self {
32            cond: expr,
33            question_token: input.parse()?,
34            if_true: input.parse()?,
35            colon_token: input.parse()?,
36            if_false: input.parse()?,
37        })
38    }
39}
40
41derive_parse!(ExprTernary);
42
43impl Spanned for ExprTernary {
44    fn span(&self) -> Span {
45        let span = self.cond.span();
46        span.join(self.if_false.span()).unwrap_or(span)
47    }
48
49    fn set_span(&mut self, span: Span) {
50        self.cond.set_span(span);
51        self.if_false.set_span(span);
52    }
53}