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