1*69942c0aSMiguel Ojeda // SPDX-License-Identifier: Apache-2.0 OR MIT 2*69942c0aSMiguel Ojeda 3808c999fSMiguel Ojeda ast_enum! { 4808c999fSMiguel Ojeda /// A binary operator: `+`, `+=`, `&`. 5808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))] 6808c999fSMiguel Ojeda #[non_exhaustive] 7808c999fSMiguel Ojeda pub enum BinOp { 8808c999fSMiguel Ojeda /// The `+` operator (addition) 9808c999fSMiguel Ojeda Add(Token![+]), 10808c999fSMiguel Ojeda /// The `-` operator (subtraction) 11808c999fSMiguel Ojeda Sub(Token![-]), 12808c999fSMiguel Ojeda /// The `*` operator (multiplication) 13808c999fSMiguel Ojeda Mul(Token![*]), 14808c999fSMiguel Ojeda /// The `/` operator (division) 15808c999fSMiguel Ojeda Div(Token![/]), 16808c999fSMiguel Ojeda /// The `%` operator (modulus) 17808c999fSMiguel Ojeda Rem(Token![%]), 18808c999fSMiguel Ojeda /// The `&&` operator (logical and) 19808c999fSMiguel Ojeda And(Token![&&]), 20808c999fSMiguel Ojeda /// The `||` operator (logical or) 21808c999fSMiguel Ojeda Or(Token![||]), 22808c999fSMiguel Ojeda /// The `^` operator (bitwise xor) 23808c999fSMiguel Ojeda BitXor(Token![^]), 24808c999fSMiguel Ojeda /// The `&` operator (bitwise and) 25808c999fSMiguel Ojeda BitAnd(Token![&]), 26808c999fSMiguel Ojeda /// The `|` operator (bitwise or) 27808c999fSMiguel Ojeda BitOr(Token![|]), 28808c999fSMiguel Ojeda /// The `<<` operator (shift left) 29808c999fSMiguel Ojeda Shl(Token![<<]), 30808c999fSMiguel Ojeda /// The `>>` operator (shift right) 31808c999fSMiguel Ojeda Shr(Token![>>]), 32808c999fSMiguel Ojeda /// The `==` operator (equality) 33808c999fSMiguel Ojeda Eq(Token![==]), 34808c999fSMiguel Ojeda /// The `<` operator (less than) 35808c999fSMiguel Ojeda Lt(Token![<]), 36808c999fSMiguel Ojeda /// The `<=` operator (less than or equal to) 37808c999fSMiguel Ojeda Le(Token![<=]), 38808c999fSMiguel Ojeda /// The `!=` operator (not equal to) 39808c999fSMiguel Ojeda Ne(Token![!=]), 40808c999fSMiguel Ojeda /// The `>=` operator (greater than or equal to) 41808c999fSMiguel Ojeda Ge(Token![>=]), 42808c999fSMiguel Ojeda /// The `>` operator (greater than) 43808c999fSMiguel Ojeda Gt(Token![>]), 44808c999fSMiguel Ojeda /// The `+=` operator 45808c999fSMiguel Ojeda AddAssign(Token![+=]), 46808c999fSMiguel Ojeda /// The `-=` operator 47808c999fSMiguel Ojeda SubAssign(Token![-=]), 48808c999fSMiguel Ojeda /// The `*=` operator 49808c999fSMiguel Ojeda MulAssign(Token![*=]), 50808c999fSMiguel Ojeda /// The `/=` operator 51808c999fSMiguel Ojeda DivAssign(Token![/=]), 52808c999fSMiguel Ojeda /// The `%=` operator 53808c999fSMiguel Ojeda RemAssign(Token![%=]), 54808c999fSMiguel Ojeda /// The `^=` operator 55808c999fSMiguel Ojeda BitXorAssign(Token![^=]), 56808c999fSMiguel Ojeda /// The `&=` operator 57808c999fSMiguel Ojeda BitAndAssign(Token![&=]), 58808c999fSMiguel Ojeda /// The `|=` operator 59808c999fSMiguel Ojeda BitOrAssign(Token![|=]), 60808c999fSMiguel Ojeda /// The `<<=` operator 61808c999fSMiguel Ojeda ShlAssign(Token![<<=]), 62808c999fSMiguel Ojeda /// The `>>=` operator 63808c999fSMiguel Ojeda ShrAssign(Token![>>=]), 64808c999fSMiguel Ojeda } 65808c999fSMiguel Ojeda } 66808c999fSMiguel Ojeda 67808c999fSMiguel Ojeda ast_enum! { 68808c999fSMiguel Ojeda /// A unary operator: `*`, `!`, `-`. 69808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))] 70808c999fSMiguel Ojeda #[non_exhaustive] 71808c999fSMiguel Ojeda pub enum UnOp { 72808c999fSMiguel Ojeda /// The `*` operator for dereferencing 73808c999fSMiguel Ojeda Deref(Token![*]), 74808c999fSMiguel Ojeda /// The `!` operator for logical inversion 75808c999fSMiguel Ojeda Not(Token![!]), 76808c999fSMiguel Ojeda /// The `-` operator for negation 77808c999fSMiguel Ojeda Neg(Token![-]), 78808c999fSMiguel Ojeda } 79808c999fSMiguel Ojeda } 80808c999fSMiguel Ojeda 81808c999fSMiguel Ojeda #[cfg(feature = "parsing")] 82808c999fSMiguel Ojeda pub(crate) mod parsing { 83808c999fSMiguel Ojeda use crate::error::Result; 84808c999fSMiguel Ojeda use crate::op::{BinOp, UnOp}; 85808c999fSMiguel Ojeda use crate::parse::{Parse, ParseStream}; 86808c999fSMiguel Ojeda 87808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))] 88808c999fSMiguel Ojeda impl Parse for BinOp { parse(input: ParseStream) -> Result<Self>89808c999fSMiguel Ojeda fn parse(input: ParseStream) -> Result<Self> { 90808c999fSMiguel Ojeda if input.peek(Token![+=]) { 91808c999fSMiguel Ojeda input.parse().map(BinOp::AddAssign) 92808c999fSMiguel Ojeda } else if input.peek(Token![-=]) { 93808c999fSMiguel Ojeda input.parse().map(BinOp::SubAssign) 94808c999fSMiguel Ojeda } else if input.peek(Token![*=]) { 95808c999fSMiguel Ojeda input.parse().map(BinOp::MulAssign) 96808c999fSMiguel Ojeda } else if input.peek(Token![/=]) { 97808c999fSMiguel Ojeda input.parse().map(BinOp::DivAssign) 98808c999fSMiguel Ojeda } else if input.peek(Token![%=]) { 99808c999fSMiguel Ojeda input.parse().map(BinOp::RemAssign) 100808c999fSMiguel Ojeda } else if input.peek(Token![^=]) { 101808c999fSMiguel Ojeda input.parse().map(BinOp::BitXorAssign) 102808c999fSMiguel Ojeda } else if input.peek(Token![&=]) { 103808c999fSMiguel Ojeda input.parse().map(BinOp::BitAndAssign) 104808c999fSMiguel Ojeda } else if input.peek(Token![|=]) { 105808c999fSMiguel Ojeda input.parse().map(BinOp::BitOrAssign) 106808c999fSMiguel Ojeda } else if input.peek(Token![<<=]) { 107808c999fSMiguel Ojeda input.parse().map(BinOp::ShlAssign) 108808c999fSMiguel Ojeda } else if input.peek(Token![>>=]) { 109808c999fSMiguel Ojeda input.parse().map(BinOp::ShrAssign) 110808c999fSMiguel Ojeda } else if input.peek(Token![&&]) { 111808c999fSMiguel Ojeda input.parse().map(BinOp::And) 112808c999fSMiguel Ojeda } else if input.peek(Token![||]) { 113808c999fSMiguel Ojeda input.parse().map(BinOp::Or) 114808c999fSMiguel Ojeda } else if input.peek(Token![<<]) { 115808c999fSMiguel Ojeda input.parse().map(BinOp::Shl) 116808c999fSMiguel Ojeda } else if input.peek(Token![>>]) { 117808c999fSMiguel Ojeda input.parse().map(BinOp::Shr) 118808c999fSMiguel Ojeda } else if input.peek(Token![==]) { 119808c999fSMiguel Ojeda input.parse().map(BinOp::Eq) 120808c999fSMiguel Ojeda } else if input.peek(Token![<=]) { 121808c999fSMiguel Ojeda input.parse().map(BinOp::Le) 122808c999fSMiguel Ojeda } else if input.peek(Token![!=]) { 123808c999fSMiguel Ojeda input.parse().map(BinOp::Ne) 124808c999fSMiguel Ojeda } else if input.peek(Token![>=]) { 125808c999fSMiguel Ojeda input.parse().map(BinOp::Ge) 126808c999fSMiguel Ojeda } else if input.peek(Token![+]) { 127808c999fSMiguel Ojeda input.parse().map(BinOp::Add) 128808c999fSMiguel Ojeda } else if input.peek(Token![-]) { 129808c999fSMiguel Ojeda input.parse().map(BinOp::Sub) 130808c999fSMiguel Ojeda } else if input.peek(Token![*]) { 131808c999fSMiguel Ojeda input.parse().map(BinOp::Mul) 132808c999fSMiguel Ojeda } else if input.peek(Token![/]) { 133808c999fSMiguel Ojeda input.parse().map(BinOp::Div) 134808c999fSMiguel Ojeda } else if input.peek(Token![%]) { 135808c999fSMiguel Ojeda input.parse().map(BinOp::Rem) 136808c999fSMiguel Ojeda } else if input.peek(Token![^]) { 137808c999fSMiguel Ojeda input.parse().map(BinOp::BitXor) 138808c999fSMiguel Ojeda } else if input.peek(Token![&]) { 139808c999fSMiguel Ojeda input.parse().map(BinOp::BitAnd) 140808c999fSMiguel Ojeda } else if input.peek(Token![|]) { 141808c999fSMiguel Ojeda input.parse().map(BinOp::BitOr) 142808c999fSMiguel Ojeda } else if input.peek(Token![<]) { 143808c999fSMiguel Ojeda input.parse().map(BinOp::Lt) 144808c999fSMiguel Ojeda } else if input.peek(Token![>]) { 145808c999fSMiguel Ojeda input.parse().map(BinOp::Gt) 146808c999fSMiguel Ojeda } else { 147808c999fSMiguel Ojeda Err(input.error("expected binary operator")) 148808c999fSMiguel Ojeda } 149808c999fSMiguel Ojeda } 150808c999fSMiguel Ojeda } 151808c999fSMiguel Ojeda 152808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))] 153808c999fSMiguel Ojeda impl Parse for UnOp { parse(input: ParseStream) -> Result<Self>154808c999fSMiguel Ojeda fn parse(input: ParseStream) -> Result<Self> { 155808c999fSMiguel Ojeda let lookahead = input.lookahead1(); 156808c999fSMiguel Ojeda if lookahead.peek(Token![*]) { 157808c999fSMiguel Ojeda input.parse().map(UnOp::Deref) 158808c999fSMiguel Ojeda } else if lookahead.peek(Token![!]) { 159808c999fSMiguel Ojeda input.parse().map(UnOp::Not) 160808c999fSMiguel Ojeda } else if lookahead.peek(Token![-]) { 161808c999fSMiguel Ojeda input.parse().map(UnOp::Neg) 162808c999fSMiguel Ojeda } else { 163808c999fSMiguel Ojeda Err(lookahead.error()) 164808c999fSMiguel Ojeda } 165808c999fSMiguel Ojeda } 166808c999fSMiguel Ojeda } 167808c999fSMiguel Ojeda } 168808c999fSMiguel Ojeda 169808c999fSMiguel Ojeda #[cfg(feature = "printing")] 170808c999fSMiguel Ojeda mod printing { 171808c999fSMiguel Ojeda use crate::op::{BinOp, UnOp}; 172808c999fSMiguel Ojeda use proc_macro2::TokenStream; 173808c999fSMiguel Ojeda use quote::ToTokens; 174808c999fSMiguel Ojeda 175808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "printing")))] 176808c999fSMiguel Ojeda impl ToTokens for BinOp { to_tokens(&self, tokens: &mut TokenStream)177808c999fSMiguel Ojeda fn to_tokens(&self, tokens: &mut TokenStream) { 178808c999fSMiguel Ojeda match self { 179808c999fSMiguel Ojeda BinOp::Add(t) => t.to_tokens(tokens), 180808c999fSMiguel Ojeda BinOp::Sub(t) => t.to_tokens(tokens), 181808c999fSMiguel Ojeda BinOp::Mul(t) => t.to_tokens(tokens), 182808c999fSMiguel Ojeda BinOp::Div(t) => t.to_tokens(tokens), 183808c999fSMiguel Ojeda BinOp::Rem(t) => t.to_tokens(tokens), 184808c999fSMiguel Ojeda BinOp::And(t) => t.to_tokens(tokens), 185808c999fSMiguel Ojeda BinOp::Or(t) => t.to_tokens(tokens), 186808c999fSMiguel Ojeda BinOp::BitXor(t) => t.to_tokens(tokens), 187808c999fSMiguel Ojeda BinOp::BitAnd(t) => t.to_tokens(tokens), 188808c999fSMiguel Ojeda BinOp::BitOr(t) => t.to_tokens(tokens), 189808c999fSMiguel Ojeda BinOp::Shl(t) => t.to_tokens(tokens), 190808c999fSMiguel Ojeda BinOp::Shr(t) => t.to_tokens(tokens), 191808c999fSMiguel Ojeda BinOp::Eq(t) => t.to_tokens(tokens), 192808c999fSMiguel Ojeda BinOp::Lt(t) => t.to_tokens(tokens), 193808c999fSMiguel Ojeda BinOp::Le(t) => t.to_tokens(tokens), 194808c999fSMiguel Ojeda BinOp::Ne(t) => t.to_tokens(tokens), 195808c999fSMiguel Ojeda BinOp::Ge(t) => t.to_tokens(tokens), 196808c999fSMiguel Ojeda BinOp::Gt(t) => t.to_tokens(tokens), 197808c999fSMiguel Ojeda BinOp::AddAssign(t) => t.to_tokens(tokens), 198808c999fSMiguel Ojeda BinOp::SubAssign(t) => t.to_tokens(tokens), 199808c999fSMiguel Ojeda BinOp::MulAssign(t) => t.to_tokens(tokens), 200808c999fSMiguel Ojeda BinOp::DivAssign(t) => t.to_tokens(tokens), 201808c999fSMiguel Ojeda BinOp::RemAssign(t) => t.to_tokens(tokens), 202808c999fSMiguel Ojeda BinOp::BitXorAssign(t) => t.to_tokens(tokens), 203808c999fSMiguel Ojeda BinOp::BitAndAssign(t) => t.to_tokens(tokens), 204808c999fSMiguel Ojeda BinOp::BitOrAssign(t) => t.to_tokens(tokens), 205808c999fSMiguel Ojeda BinOp::ShlAssign(t) => t.to_tokens(tokens), 206808c999fSMiguel Ojeda BinOp::ShrAssign(t) => t.to_tokens(tokens), 207808c999fSMiguel Ojeda } 208808c999fSMiguel Ojeda } 209808c999fSMiguel Ojeda } 210808c999fSMiguel Ojeda 211808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "printing")))] 212808c999fSMiguel Ojeda impl ToTokens for UnOp { to_tokens(&self, tokens: &mut TokenStream)213808c999fSMiguel Ojeda fn to_tokens(&self, tokens: &mut TokenStream) { 214808c999fSMiguel Ojeda match self { 215808c999fSMiguel Ojeda UnOp::Deref(t) => t.to_tokens(tokens), 216808c999fSMiguel Ojeda UnOp::Not(t) => t.to_tokens(tokens), 217808c999fSMiguel Ojeda UnOp::Neg(t) => t.to_tokens(tokens), 218808c999fSMiguel Ojeda } 219808c999fSMiguel Ojeda } 220808c999fSMiguel Ojeda } 221808c999fSMiguel Ojeda } 222