1*808c999fSMiguel Ojeda ast_enum! { 2*808c999fSMiguel Ojeda /// A binary operator: `+`, `+=`, `&`. 3*808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))] 4*808c999fSMiguel Ojeda #[non_exhaustive] 5*808c999fSMiguel Ojeda pub enum BinOp { 6*808c999fSMiguel Ojeda /// The `+` operator (addition) 7*808c999fSMiguel Ojeda Add(Token![+]), 8*808c999fSMiguel Ojeda /// The `-` operator (subtraction) 9*808c999fSMiguel Ojeda Sub(Token![-]), 10*808c999fSMiguel Ojeda /// The `*` operator (multiplication) 11*808c999fSMiguel Ojeda Mul(Token![*]), 12*808c999fSMiguel Ojeda /// The `/` operator (division) 13*808c999fSMiguel Ojeda Div(Token![/]), 14*808c999fSMiguel Ojeda /// The `%` operator (modulus) 15*808c999fSMiguel Ojeda Rem(Token![%]), 16*808c999fSMiguel Ojeda /// The `&&` operator (logical and) 17*808c999fSMiguel Ojeda And(Token![&&]), 18*808c999fSMiguel Ojeda /// The `||` operator (logical or) 19*808c999fSMiguel Ojeda Or(Token![||]), 20*808c999fSMiguel Ojeda /// The `^` operator (bitwise xor) 21*808c999fSMiguel Ojeda BitXor(Token![^]), 22*808c999fSMiguel Ojeda /// The `&` operator (bitwise and) 23*808c999fSMiguel Ojeda BitAnd(Token![&]), 24*808c999fSMiguel Ojeda /// The `|` operator (bitwise or) 25*808c999fSMiguel Ojeda BitOr(Token![|]), 26*808c999fSMiguel Ojeda /// The `<<` operator (shift left) 27*808c999fSMiguel Ojeda Shl(Token![<<]), 28*808c999fSMiguel Ojeda /// The `>>` operator (shift right) 29*808c999fSMiguel Ojeda Shr(Token![>>]), 30*808c999fSMiguel Ojeda /// The `==` operator (equality) 31*808c999fSMiguel Ojeda Eq(Token![==]), 32*808c999fSMiguel Ojeda /// The `<` operator (less than) 33*808c999fSMiguel Ojeda Lt(Token![<]), 34*808c999fSMiguel Ojeda /// The `<=` operator (less than or equal to) 35*808c999fSMiguel Ojeda Le(Token![<=]), 36*808c999fSMiguel Ojeda /// The `!=` operator (not equal to) 37*808c999fSMiguel Ojeda Ne(Token![!=]), 38*808c999fSMiguel Ojeda /// The `>=` operator (greater than or equal to) 39*808c999fSMiguel Ojeda Ge(Token![>=]), 40*808c999fSMiguel Ojeda /// The `>` operator (greater than) 41*808c999fSMiguel Ojeda Gt(Token![>]), 42*808c999fSMiguel Ojeda /// The `+=` operator 43*808c999fSMiguel Ojeda AddAssign(Token![+=]), 44*808c999fSMiguel Ojeda /// The `-=` operator 45*808c999fSMiguel Ojeda SubAssign(Token![-=]), 46*808c999fSMiguel Ojeda /// The `*=` operator 47*808c999fSMiguel Ojeda MulAssign(Token![*=]), 48*808c999fSMiguel Ojeda /// The `/=` operator 49*808c999fSMiguel Ojeda DivAssign(Token![/=]), 50*808c999fSMiguel Ojeda /// The `%=` operator 51*808c999fSMiguel Ojeda RemAssign(Token![%=]), 52*808c999fSMiguel Ojeda /// The `^=` operator 53*808c999fSMiguel Ojeda BitXorAssign(Token![^=]), 54*808c999fSMiguel Ojeda /// The `&=` operator 55*808c999fSMiguel Ojeda BitAndAssign(Token![&=]), 56*808c999fSMiguel Ojeda /// The `|=` operator 57*808c999fSMiguel Ojeda BitOrAssign(Token![|=]), 58*808c999fSMiguel Ojeda /// The `<<=` operator 59*808c999fSMiguel Ojeda ShlAssign(Token![<<=]), 60*808c999fSMiguel Ojeda /// The `>>=` operator 61*808c999fSMiguel Ojeda ShrAssign(Token![>>=]), 62*808c999fSMiguel Ojeda } 63*808c999fSMiguel Ojeda } 64*808c999fSMiguel Ojeda 65*808c999fSMiguel Ojeda ast_enum! { 66*808c999fSMiguel Ojeda /// A unary operator: `*`, `!`, `-`. 67*808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))] 68*808c999fSMiguel Ojeda #[non_exhaustive] 69*808c999fSMiguel Ojeda pub enum UnOp { 70*808c999fSMiguel Ojeda /// The `*` operator for dereferencing 71*808c999fSMiguel Ojeda Deref(Token![*]), 72*808c999fSMiguel Ojeda /// The `!` operator for logical inversion 73*808c999fSMiguel Ojeda Not(Token![!]), 74*808c999fSMiguel Ojeda /// The `-` operator for negation 75*808c999fSMiguel Ojeda Neg(Token![-]), 76*808c999fSMiguel Ojeda } 77*808c999fSMiguel Ojeda } 78*808c999fSMiguel Ojeda 79*808c999fSMiguel Ojeda #[cfg(feature = "parsing")] 80*808c999fSMiguel Ojeda pub(crate) mod parsing { 81*808c999fSMiguel Ojeda use crate::error::Result; 82*808c999fSMiguel Ojeda use crate::op::{BinOp, UnOp}; 83*808c999fSMiguel Ojeda use crate::parse::{Parse, ParseStream}; 84*808c999fSMiguel Ojeda 85*808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))] 86*808c999fSMiguel Ojeda impl Parse for BinOp { 87*808c999fSMiguel Ojeda fn parse(input: ParseStream) -> Result<Self> { 88*808c999fSMiguel Ojeda if input.peek(Token![+=]) { 89*808c999fSMiguel Ojeda input.parse().map(BinOp::AddAssign) 90*808c999fSMiguel Ojeda } else if input.peek(Token![-=]) { 91*808c999fSMiguel Ojeda input.parse().map(BinOp::SubAssign) 92*808c999fSMiguel Ojeda } else if input.peek(Token![*=]) { 93*808c999fSMiguel Ojeda input.parse().map(BinOp::MulAssign) 94*808c999fSMiguel Ojeda } else if input.peek(Token![/=]) { 95*808c999fSMiguel Ojeda input.parse().map(BinOp::DivAssign) 96*808c999fSMiguel Ojeda } else if input.peek(Token![%=]) { 97*808c999fSMiguel Ojeda input.parse().map(BinOp::RemAssign) 98*808c999fSMiguel Ojeda } else if input.peek(Token![^=]) { 99*808c999fSMiguel Ojeda input.parse().map(BinOp::BitXorAssign) 100*808c999fSMiguel Ojeda } else if input.peek(Token![&=]) { 101*808c999fSMiguel Ojeda input.parse().map(BinOp::BitAndAssign) 102*808c999fSMiguel Ojeda } else if input.peek(Token![|=]) { 103*808c999fSMiguel Ojeda input.parse().map(BinOp::BitOrAssign) 104*808c999fSMiguel Ojeda } else if input.peek(Token![<<=]) { 105*808c999fSMiguel Ojeda input.parse().map(BinOp::ShlAssign) 106*808c999fSMiguel Ojeda } else if input.peek(Token![>>=]) { 107*808c999fSMiguel Ojeda input.parse().map(BinOp::ShrAssign) 108*808c999fSMiguel Ojeda } else if input.peek(Token![&&]) { 109*808c999fSMiguel Ojeda input.parse().map(BinOp::And) 110*808c999fSMiguel Ojeda } else if input.peek(Token![||]) { 111*808c999fSMiguel Ojeda input.parse().map(BinOp::Or) 112*808c999fSMiguel Ojeda } else if input.peek(Token![<<]) { 113*808c999fSMiguel Ojeda input.parse().map(BinOp::Shl) 114*808c999fSMiguel Ojeda } else if input.peek(Token![>>]) { 115*808c999fSMiguel Ojeda input.parse().map(BinOp::Shr) 116*808c999fSMiguel Ojeda } else if input.peek(Token![==]) { 117*808c999fSMiguel Ojeda input.parse().map(BinOp::Eq) 118*808c999fSMiguel Ojeda } else if input.peek(Token![<=]) { 119*808c999fSMiguel Ojeda input.parse().map(BinOp::Le) 120*808c999fSMiguel Ojeda } else if input.peek(Token![!=]) { 121*808c999fSMiguel Ojeda input.parse().map(BinOp::Ne) 122*808c999fSMiguel Ojeda } else if input.peek(Token![>=]) { 123*808c999fSMiguel Ojeda input.parse().map(BinOp::Ge) 124*808c999fSMiguel Ojeda } else if input.peek(Token![+]) { 125*808c999fSMiguel Ojeda input.parse().map(BinOp::Add) 126*808c999fSMiguel Ojeda } else if input.peek(Token![-]) { 127*808c999fSMiguel Ojeda input.parse().map(BinOp::Sub) 128*808c999fSMiguel Ojeda } else if input.peek(Token![*]) { 129*808c999fSMiguel Ojeda input.parse().map(BinOp::Mul) 130*808c999fSMiguel Ojeda } else if input.peek(Token![/]) { 131*808c999fSMiguel Ojeda input.parse().map(BinOp::Div) 132*808c999fSMiguel Ojeda } else if input.peek(Token![%]) { 133*808c999fSMiguel Ojeda input.parse().map(BinOp::Rem) 134*808c999fSMiguel Ojeda } else if input.peek(Token![^]) { 135*808c999fSMiguel Ojeda input.parse().map(BinOp::BitXor) 136*808c999fSMiguel Ojeda } else if input.peek(Token![&]) { 137*808c999fSMiguel Ojeda input.parse().map(BinOp::BitAnd) 138*808c999fSMiguel Ojeda } else if input.peek(Token![|]) { 139*808c999fSMiguel Ojeda input.parse().map(BinOp::BitOr) 140*808c999fSMiguel Ojeda } else if input.peek(Token![<]) { 141*808c999fSMiguel Ojeda input.parse().map(BinOp::Lt) 142*808c999fSMiguel Ojeda } else if input.peek(Token![>]) { 143*808c999fSMiguel Ojeda input.parse().map(BinOp::Gt) 144*808c999fSMiguel Ojeda } else { 145*808c999fSMiguel Ojeda Err(input.error("expected binary operator")) 146*808c999fSMiguel Ojeda } 147*808c999fSMiguel Ojeda } 148*808c999fSMiguel Ojeda } 149*808c999fSMiguel Ojeda 150*808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))] 151*808c999fSMiguel Ojeda impl Parse for UnOp { 152*808c999fSMiguel Ojeda fn parse(input: ParseStream) -> Result<Self> { 153*808c999fSMiguel Ojeda let lookahead = input.lookahead1(); 154*808c999fSMiguel Ojeda if lookahead.peek(Token![*]) { 155*808c999fSMiguel Ojeda input.parse().map(UnOp::Deref) 156*808c999fSMiguel Ojeda } else if lookahead.peek(Token![!]) { 157*808c999fSMiguel Ojeda input.parse().map(UnOp::Not) 158*808c999fSMiguel Ojeda } else if lookahead.peek(Token![-]) { 159*808c999fSMiguel Ojeda input.parse().map(UnOp::Neg) 160*808c999fSMiguel Ojeda } else { 161*808c999fSMiguel Ojeda Err(lookahead.error()) 162*808c999fSMiguel Ojeda } 163*808c999fSMiguel Ojeda } 164*808c999fSMiguel Ojeda } 165*808c999fSMiguel Ojeda } 166*808c999fSMiguel Ojeda 167*808c999fSMiguel Ojeda #[cfg(feature = "printing")] 168*808c999fSMiguel Ojeda mod printing { 169*808c999fSMiguel Ojeda use crate::op::{BinOp, UnOp}; 170*808c999fSMiguel Ojeda use proc_macro2::TokenStream; 171*808c999fSMiguel Ojeda use quote::ToTokens; 172*808c999fSMiguel Ojeda 173*808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "printing")))] 174*808c999fSMiguel Ojeda impl ToTokens for BinOp { 175*808c999fSMiguel Ojeda fn to_tokens(&self, tokens: &mut TokenStream) { 176*808c999fSMiguel Ojeda match self { 177*808c999fSMiguel Ojeda BinOp::Add(t) => t.to_tokens(tokens), 178*808c999fSMiguel Ojeda BinOp::Sub(t) => t.to_tokens(tokens), 179*808c999fSMiguel Ojeda BinOp::Mul(t) => t.to_tokens(tokens), 180*808c999fSMiguel Ojeda BinOp::Div(t) => t.to_tokens(tokens), 181*808c999fSMiguel Ojeda BinOp::Rem(t) => t.to_tokens(tokens), 182*808c999fSMiguel Ojeda BinOp::And(t) => t.to_tokens(tokens), 183*808c999fSMiguel Ojeda BinOp::Or(t) => t.to_tokens(tokens), 184*808c999fSMiguel Ojeda BinOp::BitXor(t) => t.to_tokens(tokens), 185*808c999fSMiguel Ojeda BinOp::BitAnd(t) => t.to_tokens(tokens), 186*808c999fSMiguel Ojeda BinOp::BitOr(t) => t.to_tokens(tokens), 187*808c999fSMiguel Ojeda BinOp::Shl(t) => t.to_tokens(tokens), 188*808c999fSMiguel Ojeda BinOp::Shr(t) => t.to_tokens(tokens), 189*808c999fSMiguel Ojeda BinOp::Eq(t) => t.to_tokens(tokens), 190*808c999fSMiguel Ojeda BinOp::Lt(t) => t.to_tokens(tokens), 191*808c999fSMiguel Ojeda BinOp::Le(t) => t.to_tokens(tokens), 192*808c999fSMiguel Ojeda BinOp::Ne(t) => t.to_tokens(tokens), 193*808c999fSMiguel Ojeda BinOp::Ge(t) => t.to_tokens(tokens), 194*808c999fSMiguel Ojeda BinOp::Gt(t) => t.to_tokens(tokens), 195*808c999fSMiguel Ojeda BinOp::AddAssign(t) => t.to_tokens(tokens), 196*808c999fSMiguel Ojeda BinOp::SubAssign(t) => t.to_tokens(tokens), 197*808c999fSMiguel Ojeda BinOp::MulAssign(t) => t.to_tokens(tokens), 198*808c999fSMiguel Ojeda BinOp::DivAssign(t) => t.to_tokens(tokens), 199*808c999fSMiguel Ojeda BinOp::RemAssign(t) => t.to_tokens(tokens), 200*808c999fSMiguel Ojeda BinOp::BitXorAssign(t) => t.to_tokens(tokens), 201*808c999fSMiguel Ojeda BinOp::BitAndAssign(t) => t.to_tokens(tokens), 202*808c999fSMiguel Ojeda BinOp::BitOrAssign(t) => t.to_tokens(tokens), 203*808c999fSMiguel Ojeda BinOp::ShlAssign(t) => t.to_tokens(tokens), 204*808c999fSMiguel Ojeda BinOp::ShrAssign(t) => t.to_tokens(tokens), 205*808c999fSMiguel Ojeda } 206*808c999fSMiguel Ojeda } 207*808c999fSMiguel Ojeda } 208*808c999fSMiguel Ojeda 209*808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "printing")))] 210*808c999fSMiguel Ojeda impl ToTokens for UnOp { 211*808c999fSMiguel Ojeda fn to_tokens(&self, tokens: &mut TokenStream) { 212*808c999fSMiguel Ojeda match self { 213*808c999fSMiguel Ojeda UnOp::Deref(t) => t.to_tokens(tokens), 214*808c999fSMiguel Ojeda UnOp::Not(t) => t.to_tokens(tokens), 215*808c999fSMiguel Ojeda UnOp::Neg(t) => t.to_tokens(tokens), 216*808c999fSMiguel Ojeda } 217*808c999fSMiguel Ojeda } 218*808c999fSMiguel Ojeda } 219*808c999fSMiguel Ojeda } 220