blob: fd8162ff2177ce6b5198379d93dbf69cef59e129 [file] [log] [blame]
David Tolnaye0dca7b2020-11-25 17:18:57 -08001use crate::syntax::{
David Tolnay4a79b7f2020-12-30 19:48:42 -08002 Array, ExternFn, Impl, Include, Lifetimes, Receiver, Ref, Signature, SliceRef, Ty1, Type, Var,
David Tolnaye0dca7b2020-11-25 17:18:57 -08003};
David Tolnay7db73692019-10-20 14:51:12 -04004use std::hash::{Hash, Hasher};
David Tolnayc21b20a2020-03-15 23:25:32 -07005use std::mem;
David Tolnay9bfbea32020-04-22 18:12:43 -07006use std::ops::{Deref, DerefMut};
David Tolnay16448732020-03-18 12:39:36 -07007
David Tolnayb0cd3272020-10-27 21:32:54 -07008impl PartialEq for Include {
9 fn eq(&self, other: &Include) -> bool {
10 let Include {
11 path,
12 kind,
13 begin_span: _,
14 end_span: _,
15 } = self;
16 let Include {
17 path: path2,
18 kind: kind2,
19 begin_span: _,
20 end_span: _,
21 } = other;
22 path == path2 && kind == kind2
23 }
24}
25
David Tolnay16448732020-03-18 12:39:36 -070026impl Deref for ExternFn {
27 type Target = Signature;
28
29 fn deref(&self) -> &Self::Target {
30 &self.sig
31 }
32}
David Tolnayc21b20a2020-03-15 23:25:32 -070033
David Tolnay9bfbea32020-04-22 18:12:43 -070034impl DerefMut for ExternFn {
35 fn deref_mut(&mut self) -> &mut Self::Target {
36 &mut self.sig
37 }
38}
39
David Tolnayc21b20a2020-03-15 23:25:32 -070040impl Hash for Type {
41 fn hash<H: Hasher>(&self, state: &mut H) {
42 mem::discriminant(self).hash(state);
43 match self {
44 Type::Ident(t) => t.hash(state),
45 Type::RustBox(t) => t.hash(state),
46 Type::UniquePtr(t) => t.hash(state),
David Tolnayb3b24a12020-12-01 15:27:43 -080047 Type::SharedPtr(t) => t.hash(state),
David Tolnay215e77f2020-12-28 17:09:48 -080048 Type::WeakPtr(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 Tolnay215e77f2020-12-28 17:09:48 -080070 (Type::WeakPtr(lhs), Type::WeakPtr(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070071 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
72 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070073 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070074 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070075 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
David Tolnay73b72642020-11-25 17:44:05 -080076 (Type::SliceRef(lhs), Type::SliceRef(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070077 (Type::Void(_), Type::Void(_)) => true,
78 (_, _) => false,
79 }
80 }
81}
David Tolnay7db73692019-10-20 14:51:12 -040082
David Tolnay4a79b7f2020-12-30 19:48:42 -080083impl Eq for Lifetimes {}
84
85impl PartialEq for Lifetimes {
86 fn eq(&self, other: &Lifetimes) -> bool {
87 let Lifetimes {
88 lt_token: _,
89 lifetimes,
90 gt_token: _,
91 } = self;
92 let Lifetimes {
93 lt_token: _,
94 lifetimes: lifetimes2,
95 gt_token: _,
96 } = other;
97 lifetimes.iter().eq(lifetimes2)
98 }
99}
100
101impl Hash for Lifetimes {
102 fn hash<H: Hasher>(&self, state: &mut H) {
103 let Lifetimes {
104 lt_token: _,
105 lifetimes,
106 gt_token: _,
107 } = self;
108 lifetimes.len().hash(state);
109 for lifetime in lifetimes {
110 lifetime.hash(state);
111 }
112 }
113}
114
David Tolnay7db73692019-10-20 14:51:12 -0400115impl Eq for Ty1 {}
116
117impl PartialEq for Ty1 {
118 fn eq(&self, other: &Ty1) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700119 let Ty1 {
120 name,
121 langle: _,
122 inner,
123 rangle: _,
124 } = self;
125 let Ty1 {
126 name: name2,
127 langle: _,
128 inner: inner2,
129 rangle: _,
130 } = other;
David Tolnaybf7ae812020-11-16 23:31:45 -0800131 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400132 }
133}
134
135impl Hash for Ty1 {
136 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700137 let Ty1 {
138 name,
139 langle: _,
140 inner,
141 rangle: _,
142 } = self;
143 name.hash(state);
144 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400145 }
146}
147
148impl Eq for Ref {}
149
150impl PartialEq for Ref {
151 fn eq(&self, other: &Ref) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700152 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800153 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700154 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700155 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800156 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700157 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800158 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800159 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700160 } = self;
161 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800162 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700163 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700164 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800165 mutable: mutable2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700166 inner: inner2,
David Tolnayb27f7872020-11-15 15:07:04 -0800167 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800168 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700169 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800170 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400171 }
172}
173
174impl Hash for Ref {
175 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700176 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800177 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700178 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700179 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800180 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700181 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800182 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800183 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700184 } = self;
David Tolnayb27f7872020-11-15 15:07:04 -0800185 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700186 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800187 mutable.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700188 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400189 }
190}
David Tolnay417305a2020-03-18 13:54:00 -0700191
David Tolnaye0dca7b2020-11-25 17:18:57 -0800192impl Eq for SliceRef {}
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700193
David Tolnaye0dca7b2020-11-25 17:18:57 -0800194impl PartialEq for SliceRef {
195 fn eq(&self, other: &SliceRef) -> bool {
196 let SliceRef {
197 ampersand: _,
198 lifetime,
199 mutable,
200 bracket: _,
201 inner,
202 mutability: _,
203 } = self;
204 let SliceRef {
205 ampersand: _,
206 lifetime: lifetime2,
207 mutable: mutable2,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700208 bracket: _,
209 inner: inner2,
David Tolnaye0dca7b2020-11-25 17:18:57 -0800210 mutability: _,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700211 } = other;
David Tolnaye0dca7b2020-11-25 17:18:57 -0800212 lifetime == lifetime2 && mutable == mutable2 && inner == inner2
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700213 }
214}
215
David Tolnaye0dca7b2020-11-25 17:18:57 -0800216impl Hash for SliceRef {
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700217 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800218 let SliceRef {
219 ampersand: _,
220 lifetime,
221 mutable,
222 bracket: _,
223 inner,
224 mutability: _,
225 } = self;
226 lifetime.hash(state);
227 mutable.hash(state);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700228 inner.hash(state);
229 }
230}
231
Xiangpeng Hao78762352020-11-12 10:24:18 +0800232impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800233
Xiangpeng Hao78762352020-11-12 10:24:18 +0800234impl PartialEq for Array {
235 fn eq(&self, other: &Array) -> bool {
236 let Array {
237 bracket: _,
238 inner,
239 semi_token: _,
240 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800241 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800242 } = self;
243 let Array {
244 bracket: _,
245 inner: inner2,
246 semi_token: _,
247 len: len2,
David Tolnayc351dc42020-11-24 20:45:13 -0800248 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800249 } = other;
250 inner == inner2 && len == len2
251 }
252}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800253
Xiangpeng Hao78762352020-11-12 10:24:18 +0800254impl Hash for Array {
255 fn hash<H: Hasher>(&self, state: &mut H) {
256 let Array {
257 bracket: _,
258 inner,
259 semi_token: _,
260 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800261 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800262 } = self;
263 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800264 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800265 }
266}
267
David Tolnay417305a2020-03-18 13:54:00 -0700268impl Eq for Signature {}
269
270impl PartialEq for Signature {
271 fn eq(&self, other: &Signature) -> bool {
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;
283 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700284 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700285 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800286 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700287 receiver: receiver2,
288 args: args2,
289 ret: ret2,
290 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700291 paren_token: _,
292 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700293 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700294 unsafety.is_some() == unsafety2.is_some()
295 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700296 && ret == ret2
297 && throws == throws2
298 && args.len() == args2.len()
299 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700300 }
301}
302
303impl Hash for Signature {
304 fn hash<H: Hasher>(&self, state: &mut H) {
305 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700306 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700307 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800308 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700309 receiver,
310 args,
311 ret,
312 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700313 paren_token: _,
314 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700315 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700316 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700317 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700318 for arg in args {
319 arg.hash(state);
320 }
David Tolnay417305a2020-03-18 13:54:00 -0700321 ret.hash(state);
322 throws.hash(state);
323 }
324}
325
David Tolnay89902442020-12-30 15:10:40 -0800326impl Eq for Var {}
327
328impl PartialEq for Var {
329 fn eq(&self, other: &Var) -> bool {
330 let Var {
David Tolnayb4a05c32020-12-30 15:37:01 -0800331 doc: _,
David Tolnay067638e2020-12-30 16:18:05 -0800332 attrs: _,
David Tolnay89902442020-12-30 15:10:40 -0800333 visibility: _,
334 ident,
335 ty,
336 } = self;
337 let Var {
David Tolnayb4a05c32020-12-30 15:37:01 -0800338 doc: _,
David Tolnay067638e2020-12-30 16:18:05 -0800339 attrs: _,
David Tolnay89902442020-12-30 15:10:40 -0800340 visibility: _,
341 ident: ident2,
342 ty: ty2,
343 } = other;
344 ident == ident2 && ty == ty2
345 }
346}
347
348impl Hash for Var {
349 fn hash<H: Hasher>(&self, state: &mut H) {
350 let Var {
David Tolnayb4a05c32020-12-30 15:37:01 -0800351 doc: _,
David Tolnay067638e2020-12-30 16:18:05 -0800352 attrs: _,
David Tolnay89902442020-12-30 15:10:40 -0800353 visibility: _,
354 ident,
355 ty,
356 } = self;
357 ident.hash(state);
358 ty.hash(state);
359 }
360}
361
David Tolnay417305a2020-03-18 13:54:00 -0700362impl Eq for Receiver {}
363
364impl PartialEq for Receiver {
365 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700366 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800367 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700368 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700369 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800370 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700371 var: _,
372 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700373 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800374 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800375 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700376 } = self;
377 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800378 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700379 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700380 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800381 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700382 var: _,
383 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700384 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800385 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800386 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700387 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800388 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700389 }
390}
391
392impl Hash for Receiver {
393 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700394 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800395 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700396 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700397 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800398 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700399 var: _,
400 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700401 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800402 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800403 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700404 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800405 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700406 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800407 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700408 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700409 }
410}
David Tolnay6586c692020-10-03 23:48:19 -0700411
412impl Hash for Impl {
413 fn hash<H: Hasher>(&self, state: &mut H) {
414 let Impl {
415 impl_token: _,
David Tolnayc455e972020-12-31 14:40:23 -0800416 generics,
David Tolnay028d3d22020-11-29 18:09:52 -0800417 negative,
David Tolnay6586c692020-10-03 23:48:19 -0700418 ty,
419 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800420 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700421 } = self;
David Tolnayc455e972020-12-31 14:40:23 -0800422 generics.hash(state);
David Tolnay028d3d22020-11-29 18:09:52 -0800423 if *negative {
424 negative.hash(state);
425 }
David Tolnay6586c692020-10-03 23:48:19 -0700426 ty.hash(state);
427 }
428}
429
430impl Eq for Impl {}
431
432impl PartialEq for Impl {
433 fn eq(&self, other: &Impl) -> bool {
434 let Impl {
435 impl_token: _,
David Tolnayc455e972020-12-31 14:40:23 -0800436 generics,
David Tolnay028d3d22020-11-29 18:09:52 -0800437 negative,
David Tolnay6586c692020-10-03 23:48:19 -0700438 ty,
439 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800440 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700441 } = self;
442 let Impl {
443 impl_token: _,
David Tolnayc455e972020-12-31 14:40:23 -0800444 generics: generics2,
David Tolnay028d3d22020-11-29 18:09:52 -0800445 negative: negative2,
David Tolnay6586c692020-10-03 23:48:19 -0700446 ty: ty2,
447 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800448 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700449 } = other;
David Tolnayc455e972020-12-31 14:40:23 -0800450 generics == generics2 && negative == negative2 && ty == ty2
David Tolnay6586c692020-10-03 23:48:19 -0700451 }
452}