blob: c7e1a2c2e55baf5218ebaed00045ac4f4eef1aa9 [file] [log] [blame]
David Tolnaye0dca7b2020-11-25 17:18:57 -08001use crate::syntax::{
David Tolnay89902442020-12-30 15:10:40 -08002 Array, ExternFn, Impl, Include, Receiver, Ref, Signature, SliceRef, Ty1, Type, Var,
David Tolnaye0dca7b2020-11-25 17:18:57 -08003};
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 Tolnay215e77f2020-12-28 17:09:48 -080049 Type::WeakPtr(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070050 Type::Ref(t) => t.hash(state),
51 Type::Str(t) => t.hash(state),
Myron Ahneba35cf2020-02-05 19:41:51 +070052 Type::RustVec(t) => t.hash(state),
David Tolnay4377a9e2020-04-24 15:20:26 -070053 Type::CxxVector(t) => t.hash(state),
David Tolnay417305a2020-03-18 13:54:00 -070054 Type::Fn(t) => t.hash(state),
David Tolnay73b72642020-11-25 17:44:05 -080055 Type::SliceRef(t) => t.hash(state),
Xiangpeng Hao78762352020-11-12 10:24:18 +080056 Type::Array(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070057 Type::Void(_) => {}
58 }
59 }
60}
61
62impl Eq for Type {}
63
64impl PartialEq for Type {
65 fn eq(&self, other: &Type) -> bool {
66 match (self, other) {
67 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
68 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
69 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
David Tolnayb3b24a12020-12-01 15:27:43 -080070 (Type::SharedPtr(lhs), Type::SharedPtr(rhs)) => lhs == rhs,
David Tolnay215e77f2020-12-28 17:09:48 -080071 (Type::WeakPtr(lhs), Type::WeakPtr(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070072 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
73 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070074 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070075 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070076 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
David Tolnay73b72642020-11-25 17:44:05 -080077 (Type::SliceRef(lhs), Type::SliceRef(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070078 (Type::Void(_), Type::Void(_)) => true,
79 (_, _) => false,
80 }
81 }
82}
David Tolnay7db73692019-10-20 14:51:12 -040083
84impl Eq for Ty1 {}
85
86impl PartialEq for Ty1 {
87 fn eq(&self, other: &Ty1) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070088 let Ty1 {
89 name,
90 langle: _,
91 inner,
92 rangle: _,
93 } = self;
94 let Ty1 {
95 name: name2,
96 langle: _,
97 inner: inner2,
98 rangle: _,
99 } = other;
David Tolnaybf7ae812020-11-16 23:31:45 -0800100 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400101 }
102}
103
104impl Hash for Ty1 {
105 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700106 let Ty1 {
107 name,
108 langle: _,
109 inner,
110 rangle: _,
111 } = self;
112 name.hash(state);
113 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400114 }
115}
116
117impl Eq for Ref {}
118
119impl PartialEq for Ref {
120 fn eq(&self, other: &Ref) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700121 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800122 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700123 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700124 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800125 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700126 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800127 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800128 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700129 } = self;
130 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800131 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700132 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700133 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800134 mutable: mutable2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700135 inner: inner2,
David Tolnayb27f7872020-11-15 15:07:04 -0800136 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800137 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700138 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800139 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400140 }
141}
142
143impl Hash for Ref {
144 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700145 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800146 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700147 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700148 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800149 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700150 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800151 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800152 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700153 } = self;
David Tolnayb27f7872020-11-15 15:07:04 -0800154 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700155 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800156 mutable.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700157 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400158 }
159}
David Tolnay417305a2020-03-18 13:54:00 -0700160
David Tolnaye0dca7b2020-11-25 17:18:57 -0800161impl Eq for SliceRef {}
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700162
David Tolnaye0dca7b2020-11-25 17:18:57 -0800163impl PartialEq for SliceRef {
164 fn eq(&self, other: &SliceRef) -> bool {
165 let SliceRef {
166 ampersand: _,
167 lifetime,
168 mutable,
169 bracket: _,
170 inner,
171 mutability: _,
172 } = self;
173 let SliceRef {
174 ampersand: _,
175 lifetime: lifetime2,
176 mutable: mutable2,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700177 bracket: _,
178 inner: inner2,
David Tolnaye0dca7b2020-11-25 17:18:57 -0800179 mutability: _,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700180 } = other;
David Tolnaye0dca7b2020-11-25 17:18:57 -0800181 lifetime == lifetime2 && mutable == mutable2 && inner == inner2
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700182 }
183}
184
David Tolnaye0dca7b2020-11-25 17:18:57 -0800185impl Hash for SliceRef {
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700186 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800187 let SliceRef {
188 ampersand: _,
189 lifetime,
190 mutable,
191 bracket: _,
192 inner,
193 mutability: _,
194 } = self;
195 lifetime.hash(state);
196 mutable.hash(state);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700197 inner.hash(state);
198 }
199}
200
Xiangpeng Hao78762352020-11-12 10:24:18 +0800201impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800202
Xiangpeng Hao78762352020-11-12 10:24:18 +0800203impl PartialEq for Array {
204 fn eq(&self, other: &Array) -> bool {
205 let Array {
206 bracket: _,
207 inner,
208 semi_token: _,
209 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800210 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800211 } = self;
212 let Array {
213 bracket: _,
214 inner: inner2,
215 semi_token: _,
216 len: len2,
David Tolnayc351dc42020-11-24 20:45:13 -0800217 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800218 } = other;
219 inner == inner2 && len == len2
220 }
221}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800222
Xiangpeng Hao78762352020-11-12 10:24:18 +0800223impl Hash for Array {
224 fn hash<H: Hasher>(&self, state: &mut H) {
225 let Array {
226 bracket: _,
227 inner,
228 semi_token: _,
229 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800230 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800231 } = self;
232 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800233 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800234 }
235}
236
David Tolnay417305a2020-03-18 13:54:00 -0700237impl Eq for Signature {}
238
239impl PartialEq for Signature {
240 fn eq(&self, other: &Signature) -> bool {
241 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700242 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700243 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800244 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700245 receiver,
246 args,
247 ret,
248 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700249 paren_token: _,
250 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700251 } = self;
252 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700253 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700254 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800255 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700256 receiver: receiver2,
257 args: args2,
258 ret: ret2,
259 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700260 paren_token: _,
261 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700262 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700263 unsafety.is_some() == unsafety2.is_some()
264 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700265 && ret == ret2
266 && throws == throws2
267 && args.len() == args2.len()
268 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700269 }
270}
271
272impl Hash for Signature {
273 fn hash<H: Hasher>(&self, state: &mut H) {
274 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700275 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700276 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800277 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700278 receiver,
279 args,
280 ret,
281 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700282 paren_token: _,
283 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700284 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700285 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700286 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700287 for arg in args {
288 arg.hash(state);
289 }
David Tolnay417305a2020-03-18 13:54:00 -0700290 ret.hash(state);
291 throws.hash(state);
292 }
293}
294
David Tolnay89902442020-12-30 15:10:40 -0800295impl Eq for Var {}
296
297impl PartialEq for Var {
298 fn eq(&self, other: &Var) -> bool {
299 let Var {
300 visibility: _,
301 ident,
302 ty,
303 } = self;
304 let Var {
305 visibility: _,
306 ident: ident2,
307 ty: ty2,
308 } = other;
309 ident == ident2 && ty == ty2
310 }
311}
312
313impl Hash for Var {
314 fn hash<H: Hasher>(&self, state: &mut H) {
315 let Var {
316 visibility: _,
317 ident,
318 ty,
319 } = self;
320 ident.hash(state);
321 ty.hash(state);
322 }
323}
324
David Tolnay417305a2020-03-18 13:54:00 -0700325impl Eq for Receiver {}
326
327impl PartialEq for Receiver {
328 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700329 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800330 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700331 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700332 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800333 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700334 var: _,
335 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700336 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800337 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800338 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700339 } = self;
340 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800341 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700342 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700343 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800344 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700345 var: _,
346 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700347 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800348 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800349 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700350 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800351 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700352 }
353}
354
355impl Hash for Receiver {
356 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700357 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800358 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700359 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700360 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800361 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700362 var: _,
363 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700364 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800365 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800366 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700367 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800368 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700369 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800370 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700371 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700372 }
373}
David Tolnay6586c692020-10-03 23:48:19 -0700374
375impl Hash for Impl {
376 fn hash<H: Hasher>(&self, state: &mut H) {
377 let Impl {
378 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800379 negative,
David Tolnay6586c692020-10-03 23:48:19 -0700380 ty,
381 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800382 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700383 } = self;
David Tolnay028d3d22020-11-29 18:09:52 -0800384 if *negative {
385 negative.hash(state);
386 }
David Tolnay6586c692020-10-03 23:48:19 -0700387 ty.hash(state);
388 }
389}
390
391impl Eq for Impl {}
392
393impl PartialEq for Impl {
394 fn eq(&self, other: &Impl) -> bool {
395 let Impl {
396 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800397 negative,
David Tolnay6586c692020-10-03 23:48:19 -0700398 ty,
399 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800400 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700401 } = self;
402 let Impl {
403 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800404 negative: negative2,
David Tolnay6586c692020-10-03 23:48:19 -0700405 ty: ty2,
406 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800407 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700408 } = other;
David Tolnay028d3d22020-11-29 18:09:52 -0800409 negative == negative2 && ty == ty2
David Tolnay6586c692020-10-03 23:48:19 -0700410 }
411}
412
413impl Borrow<Type> for &Impl {
414 fn borrow(&self) -> &Type {
415 &self.ty
416 }
417}