]> git.proxmox.com Git - rustc.git/blame - src/vendor/syn-0.12.15/src/op.rs
New upstream version 1.27.2+dfsg1
[rustc.git] / src / vendor / syn-0.12.15 / src / op.rs
CommitLineData
83c7162d
XL
1// Copyright 2018 Syn Developers
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9ast_enum! {
10 /// A binary operator: `+`, `+=`, `&`.
11 ///
12 /// *This type is available if Syn is built with the `"derive"` or `"full"`
13 /// feature.*
14 #[cfg_attr(feature = "clone-impls", derive(Copy))]
15 pub enum BinOp {
16 /// The `+` operator (addition)
17 Add(Token![+]),
18 /// The `-` operator (subtraction)
19 Sub(Token![-]),
20 /// The `*` operator (multiplication)
21 Mul(Token![*]),
22 /// The `/` operator (division)
23 Div(Token![/]),
24 /// The `%` operator (modulus)
25 Rem(Token![%]),
26 /// The `&&` operator (logical and)
27 And(Token![&&]),
28 /// The `||` operator (logical or)
29 Or(Token![||]),
30 /// The `^` operator (bitwise xor)
31 BitXor(Token![^]),
32 /// The `&` operator (bitwise and)
33 BitAnd(Token![&]),
34 /// The `|` operator (bitwise or)
35 BitOr(Token![|]),
36 /// The `<<` operator (shift left)
37 Shl(Token![<<]),
38 /// The `>>` operator (shift right)
39 Shr(Token![>>]),
40 /// The `==` operator (equality)
41 Eq(Token![==]),
42 /// The `<` operator (less than)
43 Lt(Token![<]),
44 /// The `<=` operator (less than or equal to)
45 Le(Token![<=]),
46 /// The `!=` operator (not equal to)
47 Ne(Token![!=]),
48 /// The `>=` operator (greater than or equal to)
49 Ge(Token![>=]),
50 /// The `>` operator (greater than)
51 Gt(Token![>]),
52 /// The `+=` operator
53 AddEq(Token![+=]),
54 /// The `-=` operator
55 SubEq(Token![-=]),
56 /// The `*=` operator
57 MulEq(Token![*=]),
58 /// The `/=` operator
59 DivEq(Token![/=]),
60 /// The `%=` operator
61 RemEq(Token![%=]),
62 /// The `^=` operator
63 BitXorEq(Token![^=]),
64 /// The `&=` operator
65 BitAndEq(Token![&=]),
66 /// The `|=` operator
67 BitOrEq(Token![|=]),
68 /// The `<<=` operator
69 ShlEq(Token![<<=]),
70 /// The `>>=` operator
71 ShrEq(Token![>>=]),
72 }
73}
74
75ast_enum! {
76 /// A unary operator: `*`, `!`, `-`.
77 ///
78 /// *This type is available if Syn is built with the `"derive"` or `"full"`
79 /// feature.*
80 #[cfg_attr(feature = "clone-impls", derive(Copy))]
81 pub enum UnOp {
82 /// The `*` operator for dereferencing
83 Deref(Token![*]),
84 /// The `!` operator for logical inversion
85 Not(Token![!]),
86 /// The `-` operator for negation
87 Neg(Token![-]),
88 }
89}
90
91#[cfg(feature = "parsing")]
92pub mod parsing {
93 use super::*;
94 use synom::Synom;
95
96 impl BinOp {
97 named!(pub parse_binop -> Self, alt!(
98 punct!(&&) => { BinOp::And }
99 |
100 punct!(||) => { BinOp::Or }
101 |
102 punct!(<<) => { BinOp::Shl }
103 |
104 punct!(>>) => { BinOp::Shr }
105 |
106 punct!(==) => { BinOp::Eq }
107 |
108 punct!(<=) => { BinOp::Le }
109 |
110 punct!(!=) => { BinOp::Ne }
111 |
112 punct!(>=) => { BinOp::Ge }
113 |
114 punct!(+) => { BinOp::Add }
115 |
116 punct!(-) => { BinOp::Sub }
117 |
118 punct!(*) => { BinOp::Mul }
119 |
120 punct!(/) => { BinOp::Div }
121 |
122 punct!(%) => { BinOp::Rem }
123 |
124 punct!(^) => { BinOp::BitXor }
125 |
126 punct!(&) => { BinOp::BitAnd }
127 |
128 punct!(|) => { BinOp::BitOr }
129 |
130 punct!(<) => { BinOp::Lt }
131 |
132 punct!(>) => { BinOp::Gt }
133 ));
134
135 #[cfg(feature = "full")]
136 named!(pub parse_assign_op -> Self, alt!(
137 punct!(+=) => { BinOp::AddEq }
138 |
139 punct!(-=) => { BinOp::SubEq }
140 |
141 punct!(*=) => { BinOp::MulEq }
142 |
143 punct!(/=) => { BinOp::DivEq }
144 |
145 punct!(%=) => { BinOp::RemEq }
146 |
147 punct!(^=) => { BinOp::BitXorEq }
148 |
149 punct!(&=) => { BinOp::BitAndEq }
150 |
151 punct!(|=) => { BinOp::BitOrEq }
152 |
153 punct!(<<=) => { BinOp::ShlEq }
154 |
155 punct!(>>=) => { BinOp::ShrEq }
156 ));
157 }
158
159 impl Synom for UnOp {
160 named!(parse -> Self, alt!(
161 punct!(*) => { UnOp::Deref }
162 |
163 punct!(!) => { UnOp::Not }
164 |
165 punct!(-) => { UnOp::Neg }
166 ));
167
168 fn description() -> Option<&'static str> {
169 Some("unary operator: `*`, `!`, or `-`")
170 }
171 }
172}
173
174#[cfg(feature = "printing")]
175mod printing {
176 use super::*;
177 use quote::{ToTokens, Tokens};
178
179 impl ToTokens for BinOp {
180 fn to_tokens(&self, tokens: &mut Tokens) {
181 match *self {
182 BinOp::Add(ref t) => t.to_tokens(tokens),
183 BinOp::Sub(ref t) => t.to_tokens(tokens),
184 BinOp::Mul(ref t) => t.to_tokens(tokens),
185 BinOp::Div(ref t) => t.to_tokens(tokens),
186 BinOp::Rem(ref t) => t.to_tokens(tokens),
187 BinOp::And(ref t) => t.to_tokens(tokens),
188 BinOp::Or(ref t) => t.to_tokens(tokens),
189 BinOp::BitXor(ref t) => t.to_tokens(tokens),
190 BinOp::BitAnd(ref t) => t.to_tokens(tokens),
191 BinOp::BitOr(ref t) => t.to_tokens(tokens),
192 BinOp::Shl(ref t) => t.to_tokens(tokens),
193 BinOp::Shr(ref t) => t.to_tokens(tokens),
194 BinOp::Eq(ref t) => t.to_tokens(tokens),
195 BinOp::Lt(ref t) => t.to_tokens(tokens),
196 BinOp::Le(ref t) => t.to_tokens(tokens),
197 BinOp::Ne(ref t) => t.to_tokens(tokens),
198 BinOp::Ge(ref t) => t.to_tokens(tokens),
199 BinOp::Gt(ref t) => t.to_tokens(tokens),
200 BinOp::AddEq(ref t) => t.to_tokens(tokens),
201 BinOp::SubEq(ref t) => t.to_tokens(tokens),
202 BinOp::MulEq(ref t) => t.to_tokens(tokens),
203 BinOp::DivEq(ref t) => t.to_tokens(tokens),
204 BinOp::RemEq(ref t) => t.to_tokens(tokens),
205 BinOp::BitXorEq(ref t) => t.to_tokens(tokens),
206 BinOp::BitAndEq(ref t) => t.to_tokens(tokens),
207 BinOp::BitOrEq(ref t) => t.to_tokens(tokens),
208 BinOp::ShlEq(ref t) => t.to_tokens(tokens),
209 BinOp::ShrEq(ref t) => t.to_tokens(tokens),
210 }
211 }
212 }
213
214 impl ToTokens for UnOp {
215 fn to_tokens(&self, tokens: &mut Tokens) {
216 match *self {
217 UnOp::Deref(ref t) => t.to_tokens(tokens),
218 UnOp::Not(ref t) => t.to_tokens(tokens),
219 UnOp::Neg(ref t) => t.to_tokens(tokens),
220 }
221 }
222 }
223}