blob: 636b9743baba66d72082d8a84b782cc0f858fcee [file] [log] [blame]
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001use tokens;
2
Alex Crichton62a0a592017-05-22 13:58:53 -07003ast_enum! {
Alex Crichton2e0229c2017-05-23 09:34:50 -07004 #[cfg_attr(feature = "clone-impls", derive(Copy))]
Alex Crichton62a0a592017-05-22 13:58:53 -07005 pub enum BinOp {
6 /// The `+` operator (addition)
Alex Crichtonccbb45d2017-05-23 10:58:24 -07007 Add(tokens::Add),
Alex Crichton62a0a592017-05-22 13:58:53 -07008 /// The `-` operator (subtraction)
Alex Crichtonccbb45d2017-05-23 10:58:24 -07009 Sub(tokens::Sub),
Alex Crichton62a0a592017-05-22 13:58:53 -070010 /// The `*` operator (multiplication)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070011 Mul(tokens::Star),
Alex Crichton62a0a592017-05-22 13:58:53 -070012 /// The `/` operator (division)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070013 Div(tokens::Div),
Alex Crichton62a0a592017-05-22 13:58:53 -070014 /// The `%` operator (modulus)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070015 Rem(tokens::Rem),
Alex Crichton62a0a592017-05-22 13:58:53 -070016 /// The `&&` operator (logical and)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070017 And(tokens::AndAnd),
Alex Crichton62a0a592017-05-22 13:58:53 -070018 /// The `||` operator (logical or)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070019 Or(tokens::OrOr),
Alex Crichton62a0a592017-05-22 13:58:53 -070020 /// The `^` operator (bitwise xor)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070021 BitXor(tokens::Caret),
Alex Crichton62a0a592017-05-22 13:58:53 -070022 /// The `&` operator (bitwise and)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070023 BitAnd(tokens::And),
Alex Crichton62a0a592017-05-22 13:58:53 -070024 /// The `|` operator (bitwise or)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070025 BitOr(tokens::Or),
Alex Crichton62a0a592017-05-22 13:58:53 -070026 /// The `<<` operator (shift left)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070027 Shl(tokens::Shl),
Alex Crichton62a0a592017-05-22 13:58:53 -070028 /// The `>>` operator (shift right)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070029 Shr(tokens::Shr),
Alex Crichton62a0a592017-05-22 13:58:53 -070030 /// The `==` operator (equality)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070031 Eq(tokens::EqEq),
Alex Crichton62a0a592017-05-22 13:58:53 -070032 /// The `<` operator (less than)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070033 Lt(tokens::Lt),
Alex Crichton62a0a592017-05-22 13:58:53 -070034 /// The `<=` operator (less than or equal to)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070035 Le(tokens::Le),
Alex Crichton62a0a592017-05-22 13:58:53 -070036 /// The `!=` operator (not equal to)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070037 Ne(tokens::Ne),
Alex Crichton62a0a592017-05-22 13:58:53 -070038 /// The `>=` operator (greater than or equal to)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070039 Ge(tokens::Ge),
Alex Crichton62a0a592017-05-22 13:58:53 -070040 /// The `>` operator (greater than)
Alex Crichtonccbb45d2017-05-23 10:58:24 -070041 Gt(tokens::Gt),
42 /// The `+=` operator
43 AddEq(tokens::AddEq),
44 /// The `-=` operator
45 SubEq(tokens::SubEq),
46 /// The `*=` operator
47 MulEq(tokens::MulEq),
48 /// The `/=` operator
49 DivEq(tokens::DivEq),
50 /// The `%=` operator
51 RemEq(tokens::RemEq),
52 /// The `^=` operator
53 BitXorEq(tokens::CaretEq),
54 /// The `&=` operator
55 BitAndEq(tokens::AndEq),
56 /// The `|=` operator
57 BitOrEq(tokens::OrEq),
58 /// The `<<=` operator
59 ShlEq(tokens::ShlEq),
60 /// The `>>=` operator
61 ShrEq(tokens::ShrEq),
Alex Crichton62a0a592017-05-22 13:58:53 -070062 }
David Tolnay3cb23a92016-10-07 23:02:21 -070063}
64
Alex Crichton62a0a592017-05-22 13:58:53 -070065ast_enum! {
Alex Crichton2e0229c2017-05-23 09:34:50 -070066 #[cfg_attr(feature = "clone-impls", derive(Copy))]
Alex Crichton62a0a592017-05-22 13:58:53 -070067 pub enum UnOp {
68 /// The `*` operator for dereferencing
Alex Crichtonccbb45d2017-05-23 10:58:24 -070069 Deref(tokens::Star),
Alex Crichton62a0a592017-05-22 13:58:53 -070070 /// The `!` operator for logical inversion
Alex Crichtonccbb45d2017-05-23 10:58:24 -070071 Not(tokens::Bang),
Alex Crichton62a0a592017-05-22 13:58:53 -070072 /// The `-` operator for negation
Alex Crichtonccbb45d2017-05-23 10:58:24 -070073 Neg(tokens::Sub),
Alex Crichton62a0a592017-05-22 13:58:53 -070074 }
David Tolnay3cb23a92016-10-07 23:02:21 -070075}
76
77#[cfg(feature = "parsing")]
78pub mod parsing {
79 use super::*;
80
81 named!(pub binop -> BinOp, alt!(
Alex Crichtonccbb45d2017-05-23 10:58:24 -070082 punct!("&&") => { |_| BinOp::And(tokens::AndAnd::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070083 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070084 punct!("||") => { |_| BinOp::Or(tokens::OrOr::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070085 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070086 punct!("<<") => { |_| BinOp::Shl(tokens::Shl::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070087 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070088 punct!(">>") => { |_| BinOp::Shr(tokens::Shr::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070089 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070090 punct!("==") => { |_| BinOp::Eq(tokens::EqEq::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070091 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070092 punct!("<=") => { |_| BinOp::Le(tokens::Le::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070093 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070094 punct!("!=") => { |_| BinOp::Ne(tokens::Ne::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070095 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070096 punct!(">=") => { |_| BinOp::Ge(tokens::Ge::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070097 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -070098 punct!("+") => { |_| BinOp::Add(tokens::Add::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -070099 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700100 punct!("-") => { |_| BinOp::Sub(tokens::Sub::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700101 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700102 punct!("*") => { |_| BinOp::Mul(tokens::Star::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700103 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700104 punct!("/") => { |_| BinOp::Div(tokens::Div::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700105 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700106 punct!("%") => { |_| BinOp::Rem(tokens::Rem::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700107 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700108 punct!("^") => { |_| BinOp::BitXor(tokens::Caret::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700109 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700110 punct!("&") => { |_| BinOp::BitAnd(tokens::And::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700111 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700112 punct!("|") => { |_| BinOp::BitOr(tokens::Or::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700113 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700114 punct!("<") => { |_| BinOp::Lt(tokens::Lt::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700115 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700116 punct!(">") => { |_| BinOp::Gt(tokens::Gt::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700117 ));
118
David Tolnay438c9052016-10-07 23:24:48 -0700119 #[cfg(feature = "full")]
120 named!(pub assign_op -> BinOp, alt!(
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700121 punct!("+=") => { |_| BinOp::AddEq(tokens::AddEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700122 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700123 punct!("-=") => { |_| BinOp::SubEq(tokens::SubEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700124 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700125 punct!("*=") => { |_| BinOp::MulEq(tokens::MulEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700126 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700127 punct!("/=") => { |_| BinOp::DivEq(tokens::DivEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700128 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700129 punct!("%=") => { |_| BinOp::RemEq(tokens::RemEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700130 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700131 punct!("^=") => { |_| BinOp::BitXorEq(tokens::CaretEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700132 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700133 punct!("&=") => { |_| BinOp::BitAndEq(tokens::AndEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700134 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700135 punct!("|=") => { |_| BinOp::BitOrEq(tokens::OrEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700136 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700137 punct!("<<=") => { |_| BinOp::ShlEq(tokens::ShlEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700138 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700139 punct!(">>=") => { |_| BinOp::ShrEq(tokens::ShrEq::default()) }
David Tolnay438c9052016-10-07 23:24:48 -0700140 ));
141
David Tolnay3cb23a92016-10-07 23:02:21 -0700142 named!(pub unop -> UnOp, alt!(
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700143 punct!("*") => { |_| UnOp::Deref(tokens::Star::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700144 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700145 punct!("!") => { |_| UnOp::Not(tokens::Bang::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700146 |
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700147 punct!("-") => { |_| UnOp::Neg(tokens::Sub::default()) }
David Tolnay3cb23a92016-10-07 23:02:21 -0700148 ));
149}
150
151#[cfg(feature = "printing")]
152mod printing {
153 use super::*;
154 use quote::{Tokens, ToTokens};
155
David Tolnay3cb23a92016-10-07 23:02:21 -0700156 impl ToTokens for BinOp {
157 fn to_tokens(&self, tokens: &mut Tokens) {
David Tolnay3cb23a92016-10-07 23:02:21 -0700158 match *self {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700159 BinOp::Add(ref t) => t.to_tokens(tokens),
160 BinOp::Sub(ref t) => t.to_tokens(tokens),
161 BinOp::Mul(ref t) => t.to_tokens(tokens),
162 BinOp::Div(ref t) => t.to_tokens(tokens),
163 BinOp::Rem(ref t) => t.to_tokens(tokens),
164 BinOp::And(ref t) => t.to_tokens(tokens),
165 BinOp::Or(ref t) => t.to_tokens(tokens),
166 BinOp::BitXor(ref t) => t.to_tokens(tokens),
167 BinOp::BitAnd(ref t) => t.to_tokens(tokens),
168 BinOp::BitOr(ref t) => t.to_tokens(tokens),
169 BinOp::Shl(ref t) => t.to_tokens(tokens),
170 BinOp::Shr(ref t) => t.to_tokens(tokens),
171 BinOp::Eq(ref t) => t.to_tokens(tokens),
172 BinOp::Lt(ref t) => t.to_tokens(tokens),
173 BinOp::Le(ref t) => t.to_tokens(tokens),
174 BinOp::Ne(ref t) => t.to_tokens(tokens),
175 BinOp::Ge(ref t) => t.to_tokens(tokens),
176 BinOp::Gt(ref t) => t.to_tokens(tokens),
177 BinOp::AddEq(ref t) => t.to_tokens(tokens),
178 BinOp::SubEq(ref t) => t.to_tokens(tokens),
179 BinOp::MulEq(ref t) => t.to_tokens(tokens),
180 BinOp::DivEq(ref t) => t.to_tokens(tokens),
181 BinOp::RemEq(ref t) => t.to_tokens(tokens),
182 BinOp::BitXorEq(ref t) => t.to_tokens(tokens),
183 BinOp::BitAndEq(ref t) => t.to_tokens(tokens),
184 BinOp::BitOrEq(ref t) => t.to_tokens(tokens),
185 BinOp::ShlEq(ref t) => t.to_tokens(tokens),
186 BinOp::ShrEq(ref t) => t.to_tokens(tokens),
David Tolnay3cb23a92016-10-07 23:02:21 -0700187 }
188 }
189 }
190
191 impl ToTokens for UnOp {
192 fn to_tokens(&self, tokens: &mut Tokens) {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700193 match *self {
194 UnOp::Deref(ref t) => t.to_tokens(tokens),
195 UnOp::Not(ref t) => t.to_tokens(tokens),
196 UnOp::Neg(ref t) => t.to_tokens(tokens),
197 }
David Tolnay3cb23a92016-10-07 23:02:21 -0700198 }
199 }
200}