blob: 9b154f6812fbe2a646f2505714af43c513f3edf4 [file] [log] [blame]
David Tolnaye0dca7b2020-11-25 17:18:57 -08001use crate::syntax::{
2 Array, ExternFn, Impl, Include, Receiver, Ref, Signature, SliceRef, Ty1, Type,
3};
David Tolnay6586c692020-10-03 23:48:19 -07004use std::borrow::Borrow;
David Tolnay7db73692019-10-20 14:51:12 -04005use std::hash::{Hash, Hasher};
David Tolnayc21b20a2020-03-15 23:25:32 -07006use std::mem;
David Tolnay9bfbea32020-04-22 18:12:43 -07007use std::ops::{Deref, DerefMut};
David Tolnay16448732020-03-18 12:39:36 -07008
David Tolnayb0cd3272020-10-27 21:32:54 -07009impl PartialEq for Include {
10 fn eq(&self, other: &Include) -> bool {
11 let Include {
12 path,
13 kind,
14 begin_span: _,
15 end_span: _,
16 } = self;
17 let Include {
18 path: path2,
19 kind: kind2,
20 begin_span: _,
21 end_span: _,
22 } = other;
23 path == path2 && kind == kind2
24 }
25}
26
David Tolnay16448732020-03-18 12:39:36 -070027impl Deref for ExternFn {
28 type Target = Signature;
29
30 fn deref(&self) -> &Self::Target {
31 &self.sig
32 }
33}
David Tolnayc21b20a2020-03-15 23:25:32 -070034
David Tolnay9bfbea32020-04-22 18:12:43 -070035impl DerefMut for ExternFn {
36 fn deref_mut(&mut self) -> &mut Self::Target {
37 &mut self.sig
38 }
39}
40
David Tolnayc21b20a2020-03-15 23:25:32 -070041impl Hash for Type {
42 fn hash<H: Hasher>(&self, state: &mut H) {
43 mem::discriminant(self).hash(state);
44 match self {
45 Type::Ident(t) => t.hash(state),
46 Type::RustBox(t) => t.hash(state),
47 Type::UniquePtr(t) => t.hash(state),
David Tolnayb3b24a12020-12-01 15:27:43 -080048 Type::SharedPtr(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070049 Type::Ref(t) => t.hash(state),
50 Type::Str(t) => t.hash(state),
Myron Ahneba35cf2020-02-05 19:41:51 +070051 Type::RustVec(t) => t.hash(state),
David Tolnay4377a9e2020-04-24 15:20:26 -070052 Type::CxxVector(t) => t.hash(state),
David Tolnay417305a2020-03-18 13:54:00 -070053 Type::Fn(t) => t.hash(state),
David Tolnay73b72642020-11-25 17:44:05 -080054 Type::SliceRef(t) => t.hash(state),
Xiangpeng Hao78762352020-11-12 10:24:18 +080055 Type::Array(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070056 Type::Void(_) => {}
57 }
58 }
59}
60
61impl Eq for Type {}
62
63impl PartialEq for Type {
64 fn eq(&self, other: &Type) -> bool {
65 match (self, other) {
66 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
67 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
68 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
David Tolnayb3b24a12020-12-01 15:27:43 -080069 (Type::SharedPtr(lhs), Type::SharedPtr(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070070 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
71 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070072 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070073 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070074 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
David Tolnay73b72642020-11-25 17:44:05 -080075 (Type::SliceRef(lhs), Type::SliceRef(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070076 (Type::Void(_), Type::Void(_)) => true,
77 (_, _) => false,
78 }
79 }
80}
David Tolnay7db73692019-10-20 14:51:12 -040081
82impl Eq for Ty1 {}
83
84impl PartialEq for Ty1 {
85 fn eq(&self, other: &Ty1) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070086 let Ty1 {
87 name,
88 langle: _,
89 inner,
90 rangle: _,
91 } = self;
92 let Ty1 {
93 name: name2,
94 langle: _,
95 inner: inner2,
96 rangle: _,
97 } = other;
David Tolnaybf7ae812020-11-16 23:31:45 -080098 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -040099 }
100}
101
102impl Hash for Ty1 {
103 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700104 let Ty1 {
105 name,
106 langle: _,
107 inner,
108 rangle: _,
109 } = self;
110 name.hash(state);
111 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400112 }
113}
114
115impl Eq for Ref {}
116
117impl PartialEq for Ref {
118 fn eq(&self, other: &Ref) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700119 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800120 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700121 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700122 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800123 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700124 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800125 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800126 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700127 } = self;
128 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800129 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700130 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700131 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800132 mutable: mutable2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700133 inner: inner2,
David Tolnayb27f7872020-11-15 15:07:04 -0800134 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800135 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700136 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800137 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400138 }
139}
140
141impl Hash for Ref {
142 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700143 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800144 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700145 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700146 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800147 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700148 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800149 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800150 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700151 } = self;
David Tolnayb27f7872020-11-15 15:07:04 -0800152 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700153 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800154 mutable.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700155 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400156 }
157}
David Tolnay417305a2020-03-18 13:54:00 -0700158
David Tolnaye0dca7b2020-11-25 17:18:57 -0800159impl Eq for SliceRef {}
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700160
David Tolnaye0dca7b2020-11-25 17:18:57 -0800161impl PartialEq for SliceRef {
162 fn eq(&self, other: &SliceRef) -> bool {
163 let SliceRef {
164 ampersand: _,
165 lifetime,
166 mutable,
167 bracket: _,
168 inner,
169 mutability: _,
170 } = self;
171 let SliceRef {
172 ampersand: _,
173 lifetime: lifetime2,
174 mutable: mutable2,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700175 bracket: _,
176 inner: inner2,
David Tolnaye0dca7b2020-11-25 17:18:57 -0800177 mutability: _,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700178 } = other;
David Tolnaye0dca7b2020-11-25 17:18:57 -0800179 lifetime == lifetime2 && mutable == mutable2 && inner == inner2
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700180 }
181}
182
David Tolnaye0dca7b2020-11-25 17:18:57 -0800183impl Hash for SliceRef {
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700184 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800185 let SliceRef {
186 ampersand: _,
187 lifetime,
188 mutable,
189 bracket: _,
190 inner,
191 mutability: _,
192 } = self;
193 lifetime.hash(state);
194 mutable.hash(state);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700195 inner.hash(state);
196 }
197}
198
Xiangpeng Hao78762352020-11-12 10:24:18 +0800199impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800200
Xiangpeng Hao78762352020-11-12 10:24:18 +0800201impl PartialEq for Array {
202 fn eq(&self, other: &Array) -> bool {
203 let Array {
204 bracket: _,
205 inner,
206 semi_token: _,
207 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800208 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800209 } = self;
210 let Array {
211 bracket: _,
212 inner: inner2,
213 semi_token: _,
214 len: len2,
David Tolnayc351dc42020-11-24 20:45:13 -0800215 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800216 } = other;
217 inner == inner2 && len == len2
218 }
219}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800220
Xiangpeng Hao78762352020-11-12 10:24:18 +0800221impl Hash for Array {
222 fn hash<H: Hasher>(&self, state: &mut H) {
223 let Array {
224 bracket: _,
225 inner,
226 semi_token: _,
227 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800228 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800229 } = self;
230 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800231 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800232 }
233}
234
David Tolnay417305a2020-03-18 13:54:00 -0700235impl Eq for Signature {}
236
237impl PartialEq for Signature {
238 fn eq(&self, other: &Signature) -> bool {
239 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700240 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700241 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800242 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700243 receiver,
244 args,
245 ret,
246 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700247 paren_token: _,
248 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700249 } = self;
250 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700251 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700252 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800253 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700254 receiver: receiver2,
255 args: args2,
256 ret: ret2,
257 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700258 paren_token: _,
259 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700260 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700261 unsafety.is_some() == unsafety2.is_some()
262 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700263 && ret == ret2
264 && throws == throws2
265 && args.len() == args2.len()
266 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700267 }
268}
269
270impl Hash for Signature {
271 fn hash<H: Hasher>(&self, state: &mut H) {
272 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700273 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700274 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800275 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700276 receiver,
277 args,
278 ret,
279 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700280 paren_token: _,
281 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700282 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700283 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700284 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700285 for arg in args {
286 arg.hash(state);
287 }
David Tolnay417305a2020-03-18 13:54:00 -0700288 ret.hash(state);
289 throws.hash(state);
290 }
291}
292
293impl Eq for Receiver {}
294
295impl PartialEq for Receiver {
296 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700297 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800298 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700299 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700300 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800301 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700302 var: _,
303 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700304 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800305 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800306 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700307 } = self;
308 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800309 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700310 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700311 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800312 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700313 var: _,
314 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700315 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800316 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800317 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700318 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800319 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700320 }
321}
322
323impl Hash for Receiver {
324 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700325 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800326 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700327 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700328 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800329 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700330 var: _,
331 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700332 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800333 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800334 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700335 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800336 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700337 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800338 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700339 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700340 }
341}
David Tolnay6586c692020-10-03 23:48:19 -0700342
343impl Hash for Impl {
344 fn hash<H: Hasher>(&self, state: &mut H) {
345 let Impl {
346 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800347 negative,
David Tolnay6586c692020-10-03 23:48:19 -0700348 ty,
349 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800350 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700351 } = self;
David Tolnay028d3d22020-11-29 18:09:52 -0800352 if *negative {
353 negative.hash(state);
354 }
David Tolnay6586c692020-10-03 23:48:19 -0700355 ty.hash(state);
356 }
357}
358
359impl Eq for Impl {}
360
361impl PartialEq for Impl {
362 fn eq(&self, other: &Impl) -> bool {
363 let Impl {
364 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800365 negative,
David Tolnay6586c692020-10-03 23:48:19 -0700366 ty,
367 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800368 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700369 } = self;
370 let Impl {
371 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800372 negative: negative2,
David Tolnay6586c692020-10-03 23:48:19 -0700373 ty: ty2,
374 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800375 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700376 } = other;
David Tolnay028d3d22020-11-29 18:09:52 -0800377 negative == negative2 && ty == ty2
David Tolnay6586c692020-10-03 23:48:19 -0700378 }
379}
380
381impl Borrow<Type> for &Impl {
382 fn borrow(&self) -> &Type {
383 &self.ty
384 }
385}