221 lines · 8.2 KB · Rust
RawDownload
// SPDX-License-Identifier: Apache-2.0 OR MIT ast_enum! {    /// A binary operator: `+`, `+=`, `&`.    #[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))]    #[non_exhaustive]    pub enum BinOp {        /// The `+` operator (addition)        Add(Token![+]),        /// The `-` operator (subtraction)        Sub(Token![-]),        /// The `*` operator (multiplication)        Mul(Token![*]),        /// The `/` operator (division)        Div(Token![/]),        /// The `%` operator (modulus)        Rem(Token![%]),        /// The `&&` operator (logical and)        And(Token![&&]),        /// The `||` operator (logical or)        Or(Token![||]),        /// The `^` operator (bitwise xor)        BitXor(Token![^]),        /// The `&` operator (bitwise and)        BitAnd(Token![&]),        /// The `|` operator (bitwise or)        BitOr(Token![|]),        /// The `<<` operator (shift left)        Shl(Token![<<]),        /// The `>>` operator (shift right)        Shr(Token![>>]),        /// The `==` operator (equality)        Eq(Token![==]),        /// The `<` operator (less than)        Lt(Token![<]),        /// The `<=` operator (less than or equal to)        Le(Token![<=]),        /// The `!=` operator (not equal to)        Ne(Token![!=]),        /// The `>=` operator (greater than or equal to)        Ge(Token![>=]),        /// The `>` operator (greater than)        Gt(Token![>]),        /// The `+=` operator        AddAssign(Token![+=]),        /// The `-=` operator        SubAssign(Token![-=]),        /// The `*=` operator        MulAssign(Token![*=]),        /// The `/=` operator        DivAssign(Token![/=]),        /// The `%=` operator        RemAssign(Token![%=]),        /// The `^=` operator        BitXorAssign(Token![^=]),        /// The `&=` operator        BitAndAssign(Token![&=]),        /// The `|=` operator        BitOrAssign(Token![|=]),        /// The `<<=` operator        ShlAssign(Token![<<=]),        /// The `>>=` operator        ShrAssign(Token![>>=]),    }} ast_enum! {    /// A unary operator: `*`, `!`, `-`.    #[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))]    #[non_exhaustive]    pub enum UnOp {        /// The `*` operator for dereferencing        Deref(Token![*]),        /// The `!` operator for logical inversion        Not(Token![!]),        /// The `-` operator for negation        Neg(Token![-]),    }} #[cfg(feature = "parsing")]pub(crate) mod parsing {    use crate::error::Result;    use crate::op::{BinOp, UnOp};    use crate::parse::{Parse, ParseStream};     #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))]    impl Parse for BinOp {        fn parse(input: ParseStream) -> Result<Self> {            if input.peek(Token![+=]) {                input.parse().map(BinOp::AddAssign)            } else if input.peek(Token![-=]) {                input.parse().map(BinOp::SubAssign)            } else if input.peek(Token![*=]) {                input.parse().map(BinOp::MulAssign)            } else if input.peek(Token![/=]) {                input.parse().map(BinOp::DivAssign)            } else if input.peek(Token![%=]) {                input.parse().map(BinOp::RemAssign)            } else if input.peek(Token![^=]) {                input.parse().map(BinOp::BitXorAssign)            } else if input.peek(Token![&=]) {                input.parse().map(BinOp::BitAndAssign)            } else if input.peek(Token![|=]) {                input.parse().map(BinOp::BitOrAssign)            } else if input.peek(Token![<<=]) {                input.parse().map(BinOp::ShlAssign)            } else if input.peek(Token![>>=]) {                input.parse().map(BinOp::ShrAssign)            } else if input.peek(Token![&&]) {                input.parse().map(BinOp::And)            } else if input.peek(Token![||]) {                input.parse().map(BinOp::Or)            } else if input.peek(Token![<<]) {                input.parse().map(BinOp::Shl)            } else if input.peek(Token![>>]) {                input.parse().map(BinOp::Shr)            } else if input.peek(Token![==]) {                input.parse().map(BinOp::Eq)            } else if input.peek(Token![<=]) {                input.parse().map(BinOp::Le)            } else if input.peek(Token![!=]) {                input.parse().map(BinOp::Ne)            } else if input.peek(Token![>=]) {                input.parse().map(BinOp::Ge)            } else if input.peek(Token![+]) {                input.parse().map(BinOp::Add)            } else if input.peek(Token![-]) {                input.parse().map(BinOp::Sub)            } else if input.peek(Token![*]) {                input.parse().map(BinOp::Mul)            } else if input.peek(Token![/]) {                input.parse().map(BinOp::Div)            } else if input.peek(Token![%]) {                input.parse().map(BinOp::Rem)            } else if input.peek(Token![^]) {                input.parse().map(BinOp::BitXor)            } else if input.peek(Token![&]) {                input.parse().map(BinOp::BitAnd)            } else if input.peek(Token![|]) {                input.parse().map(BinOp::BitOr)            } else if input.peek(Token![<]) {                input.parse().map(BinOp::Lt)            } else if input.peek(Token![>]) {                input.parse().map(BinOp::Gt)            } else {                Err(input.error("expected binary operator"))            }        }    }     #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))]    impl Parse for UnOp {        fn parse(input: ParseStream) -> Result<Self> {            let lookahead = input.lookahead1();            if lookahead.peek(Token![*]) {                input.parse().map(UnOp::Deref)            } else if lookahead.peek(Token![!]) {                input.parse().map(UnOp::Not)            } else if lookahead.peek(Token![-]) {                input.parse().map(UnOp::Neg)            } else {                Err(lookahead.error())            }        }    }} #[cfg(feature = "printing")]mod printing {    use crate::op::{BinOp, UnOp};    use proc_macro2::TokenStream;    use quote::ToTokens;     #[cfg_attr(docsrs, doc(cfg(feature = "printing")))]    impl ToTokens for BinOp {        fn to_tokens(&self, tokens: &mut TokenStream) {            match self {                BinOp::Add(t) => t.to_tokens(tokens),                BinOp::Sub(t) => t.to_tokens(tokens),                BinOp::Mul(t) => t.to_tokens(tokens),                BinOp::Div(t) => t.to_tokens(tokens),                BinOp::Rem(t) => t.to_tokens(tokens),                BinOp::And(t) => t.to_tokens(tokens),                BinOp::Or(t) => t.to_tokens(tokens),                BinOp::BitXor(t) => t.to_tokens(tokens),                BinOp::BitAnd(t) => t.to_tokens(tokens),                BinOp::BitOr(t) => t.to_tokens(tokens),                BinOp::Shl(t) => t.to_tokens(tokens),                BinOp::Shr(t) => t.to_tokens(tokens),                BinOp::Eq(t) => t.to_tokens(tokens),                BinOp::Lt(t) => t.to_tokens(tokens),                BinOp::Le(t) => t.to_tokens(tokens),                BinOp::Ne(t) => t.to_tokens(tokens),                BinOp::Ge(t) => t.to_tokens(tokens),                BinOp::Gt(t) => t.to_tokens(tokens),                BinOp::AddAssign(t) => t.to_tokens(tokens),                BinOp::SubAssign(t) => t.to_tokens(tokens),                BinOp::MulAssign(t) => t.to_tokens(tokens),                BinOp::DivAssign(t) => t.to_tokens(tokens),                BinOp::RemAssign(t) => t.to_tokens(tokens),                BinOp::BitXorAssign(t) => t.to_tokens(tokens),                BinOp::BitAndAssign(t) => t.to_tokens(tokens),                BinOp::BitOrAssign(t) => t.to_tokens(tokens),                BinOp::ShlAssign(t) => t.to_tokens(tokens),                BinOp::ShrAssign(t) => t.to_tokens(tokens),            }        }    }     #[cfg_attr(docsrs, doc(cfg(feature = "printing")))]    impl ToTokens for UnOp {        fn to_tokens(&self, tokens: &mut TokenStream) {            match self {                UnOp::Deref(t) => t.to_tokens(tokens),                UnOp::Not(t) => t.to_tokens(tokens),                UnOp::Neg(t) => t.to_tokens(tokens),            }        }    }}