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