syn_solidity/expr/
binary.rs1use crate::{utils::ParseNested, Expr, Spanned};
2use proc_macro2::Span;
3use syn::{
4 parse::{Parse, ParseStream},
5 Result,
6};
7
8#[derive(Clone, Debug)]
10pub struct ExprBinary {
11 pub left: Box<Expr>,
12 pub op: BinOp,
13 pub right: Box<Expr>,
14}
15
16impl ParseNested for ExprBinary {
17 fn parse_nested(expr: Box<Expr>, input: ParseStream<'_>) -> Result<Self> {
18 Ok(Self { left: expr, op: input.parse()?, right: input.parse()? })
19 }
20}
21
22derive_parse!(ExprBinary);
23
24impl Spanned for ExprBinary {
25 fn span(&self) -> Span {
26 let span = self.left.span();
27 span.join(self.right.span()).unwrap_or(span)
28 }
29
30 fn set_span(&mut self, span: Span) {
31 self.left.set_span(span);
32 self.right.set_span(span);
33 }
34}
35
36op_enum! {
37 pub enum BinOp {
39 Le(<=),
40 Ge(>=),
41 Eq(==),
42 Neq(!=),
43 Or(||),
44 And(&&),
45
46 Assign(=),
47 AddAssign(+=),
48 SubAssign(-=),
49 MulAssign(*=),
50 DivAssign(/=),
51 RemAssign(%=),
52 BitAndAssign(&=),
53 BitOrAssign(|=),
54 BitXorAssign(^=),
55 SarAssign(>>>=) peek3,
56 ShlAssign(<<=),
57 ShrAssign(>>=),
58
59 Sar(>>>) peek3,
60 Shr(>>),
61 Shl(<<),
62 BitAnd(&),
63 BitOr(|),
64 BitXor(^),
65
66 Lt(<),
67 Gt(>),
68
69 Add(+),
70 Sub(-),
71 Pow(**) peek2,
72 Mul(*),
73 Div(/),
74 Rem(%),
75 }
76}