xref: /linux/rust/syn/op.rs (revision 808c999fc9e7c366fd47da564e69d579c1dc8279)
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