syn_solidity/expr/
ternary.rs1use crate::{utils::ParseNested, Expr, Spanned};
2use proc_macro2::Span;
3use std::fmt;
4use syn::{
5 parse::{Parse, ParseStream},
6 Result, Token,
7};
8
9#[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}