blob: 8b0743b6242f76cd3d3599f6b70c9cf7f96d4e1a [file] [log] [blame]
David Tolnaye0dca7b2020-11-25 17:18:57 -08001use crate::syntax::{
David Tolnaybeba43d2021-03-22 15:13:20 -07002 Array, ExternFn, Include, Lifetimes, Ptr, 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 {
David Tolnay2e43b512021-03-18 13:35:38 -07009 fn eq(&self, other: &Self) -> bool {
David Tolnayb0cd3272020-10-27 21:32:54 -070010 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),
Adrian Taylor38ae2282021-01-23 10:20:32 -080050 Type::Ptr(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070051 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 {
David Tolnay2e43b512021-03-18 13:35:38 -070065 fn eq(&self, other: &Self) -> bool {
David Tolnayc21b20a2020-03-15 23:25:32 -070066 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
David Tolnay4a79b7f2020-12-30 19:48:42 -080084impl Eq for Lifetimes {}
85
86impl PartialEq for Lifetimes {
David Tolnay2e43b512021-03-18 13:35:38 -070087 fn eq(&self, other: &Self) -> bool {
David Tolnay4a79b7f2020-12-30 19:48:42 -080088 let Lifetimes {
89 lt_token: _,
90 lifetimes,
91 gt_token: _,
92 } = self;
93 let Lifetimes {
94 lt_token: _,
95 lifetimes: lifetimes2,
96 gt_token: _,
97 } = other;
98 lifetimes.iter().eq(lifetimes2)
99 }
100}
101
102impl Hash for Lifetimes {
103 fn hash<H: Hasher>(&self, state: &mut H) {
104 let Lifetimes {
105 lt_token: _,
106 lifetimes,
107 gt_token: _,
108 } = self;
109 lifetimes.len().hash(state);
110 for lifetime in lifetimes {
111 lifetime.hash(state);
112 }
113 }
114}
115
David Tolnay7db73692019-10-20 14:51:12 -0400116impl Eq for Ty1 {}
117
118impl PartialEq for Ty1 {
David Tolnay2e43b512021-03-18 13:35:38 -0700119 fn eq(&self, other: &Self) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700120 let Ty1 {
121 name,
122 langle: _,
123 inner,
124 rangle: _,
125 } = self;
126 let Ty1 {
127 name: name2,
128 langle: _,
129 inner: inner2,
130 rangle: _,
131 } = other;
David Tolnaybf7ae812020-11-16 23:31:45 -0800132 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400133 }
134}
135
136impl Hash for Ty1 {
137 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700138 let Ty1 {
139 name,
140 langle: _,
141 inner,
142 rangle: _,
143 } = self;
144 name.hash(state);
145 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400146 }
147}
148
149impl Eq for Ref {}
150
151impl PartialEq for Ref {
David Tolnay2e43b512021-03-18 13:35:38 -0700152 fn eq(&self, other: &Self) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700153 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800154 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700155 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700156 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800157 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700158 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800159 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800160 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700161 } = self;
162 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800163 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700164 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700165 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800166 mutable: mutable2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700167 inner: inner2,
David Tolnayb27f7872020-11-15 15:07:04 -0800168 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800169 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700170 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800171 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400172 }
173}
174
175impl Hash for Ref {
176 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700177 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800178 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700179 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700180 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800181 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700182 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800183 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800184 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700185 } = self;
David Tolnayb27f7872020-11-15 15:07:04 -0800186 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700187 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800188 mutable.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700189 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400190 }
191}
David Tolnay417305a2020-03-18 13:54:00 -0700192
Adrian Taylor38ae2282021-01-23 10:20:32 -0800193impl Eq for Ptr {}
194
195impl PartialEq for Ptr {
196 fn eq(&self, other: &Ptr) -> bool {
197 let Ptr {
198 star: _,
199 mutable,
200 inner,
201 mutability: _,
202 constness: _,
203 } = self;
204 let Ptr {
205 star: _,
206 mutable: mutable2,
207 inner: inner2,
208 mutability: _,
209 constness: _,
210 } = other;
211 mutable == mutable2 && inner == inner2
212 }
213}
214
215impl Hash for Ptr {
216 fn hash<H: Hasher>(&self, state: &mut H) {
217 let Ptr {
218 star: _,
219 mutable,
220 inner,
221 mutability: _,
222 constness: _,
223 } = self;
224 mutable.hash(state);
225 inner.hash(state);
226 }
227}
228
David Tolnaye0dca7b2020-11-25 17:18:57 -0800229impl Eq for SliceRef {}
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700230
David Tolnaye0dca7b2020-11-25 17:18:57 -0800231impl PartialEq for SliceRef {
David Tolnay2e43b512021-03-18 13:35:38 -0700232 fn eq(&self, other: &Self) -> bool {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800233 let SliceRef {
234 ampersand: _,
235 lifetime,
236 mutable,
237 bracket: _,
238 inner,
239 mutability: _,
240 } = self;
241 let SliceRef {
242 ampersand: _,
243 lifetime: lifetime2,
244 mutable: mutable2,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700245 bracket: _,
246 inner: inner2,
David Tolnaye0dca7b2020-11-25 17:18:57 -0800247 mutability: _,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700248 } = other;
David Tolnaye0dca7b2020-11-25 17:18:57 -0800249 lifetime == lifetime2 && mutable == mutable2 && inner == inner2
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700250 }
251}
252
David Tolnaye0dca7b2020-11-25 17:18:57 -0800253impl Hash for SliceRef {
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700254 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800255 let SliceRef {
256 ampersand: _,
257 lifetime,
258 mutable,
259 bracket: _,
260 inner,
261 mutability: _,
262 } = self;
263 lifetime.hash(state);
264 mutable.hash(state);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700265 inner.hash(state);
266 }
267}
268
Xiangpeng Hao78762352020-11-12 10:24:18 +0800269impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800270
Xiangpeng Hao78762352020-11-12 10:24:18 +0800271impl PartialEq for Array {
David Tolnay2e43b512021-03-18 13:35:38 -0700272 fn eq(&self, other: &Self) -> bool {
Xiangpeng Hao78762352020-11-12 10:24:18 +0800273 let Array {
274 bracket: _,
275 inner,
276 semi_token: _,
277 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800278 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800279 } = self;
280 let Array {
281 bracket: _,
282 inner: inner2,
283 semi_token: _,
284 len: len2,
David Tolnayc351dc42020-11-24 20:45:13 -0800285 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800286 } = other;
287 inner == inner2 && len == len2
288 }
289}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800290
Xiangpeng Hao78762352020-11-12 10:24:18 +0800291impl Hash for Array {
292 fn hash<H: Hasher>(&self, state: &mut H) {
293 let Array {
294 bracket: _,
295 inner,
296 semi_token: _,
297 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800298 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800299 } = self;
300 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800301 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800302 }
303}
304
David Tolnay417305a2020-03-18 13:54:00 -0700305impl Eq for Signature {}
306
307impl PartialEq for Signature {
David Tolnay2e43b512021-03-18 13:35:38 -0700308 fn eq(&self, other: &Self) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700309 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700310 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700311 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800312 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700313 receiver,
314 args,
315 ret,
316 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700317 paren_token: _,
318 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700319 } = self;
320 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700321 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700322 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800323 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700324 receiver: receiver2,
325 args: args2,
326 ret: ret2,
327 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700328 paren_token: _,
329 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700330 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700331 unsafety.is_some() == unsafety2.is_some()
332 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700333 && ret == ret2
334 && throws == throws2
335 && args.len() == args2.len()
David Tolnayb97a2452021-01-01 15:32:35 -0800336 && args.iter().zip(args2).all(|(arg, arg2)| {
337 let Var {
338 doc: _,
339 attrs: _,
340 visibility: _,
David Tolnay84ed6ad2021-01-01 15:30:14 -0800341 name: _,
David Tolnayb97a2452021-01-01 15:32:35 -0800342 ty,
343 } = arg;
344 let Var {
345 doc: _,
346 attrs: _,
347 visibility: _,
David Tolnay84ed6ad2021-01-01 15:30:14 -0800348 name: _,
David Tolnayb97a2452021-01-01 15:32:35 -0800349 ty: ty2,
350 } = arg2;
351 ty == ty2
352 })
David Tolnay417305a2020-03-18 13:54:00 -0700353 }
354}
355
356impl Hash for Signature {
357 fn hash<H: Hasher>(&self, state: &mut H) {
358 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700359 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700360 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800361 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700362 receiver,
363 args,
364 ret,
365 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700366 paren_token: _,
367 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700368 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700369 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700370 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700371 for arg in args {
David Tolnayb97a2452021-01-01 15:32:35 -0800372 let Var {
373 doc: _,
374 attrs: _,
375 visibility: _,
David Tolnay84ed6ad2021-01-01 15:30:14 -0800376 name: _,
David Tolnayb97a2452021-01-01 15:32:35 -0800377 ty,
378 } = arg;
379 ty.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700380 }
David Tolnay417305a2020-03-18 13:54:00 -0700381 ret.hash(state);
382 throws.hash(state);
383 }
384}
385
386impl Eq for Receiver {}
387
388impl PartialEq for Receiver {
David Tolnay2e43b512021-03-18 13:35:38 -0700389 fn eq(&self, other: &Self) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700390 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800391 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700392 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700393 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800394 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700395 var: _,
396 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700397 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800398 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800399 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700400 } = self;
401 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800402 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700403 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700404 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800405 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700406 var: _,
407 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700408 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800409 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800410 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700411 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800412 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700413 }
414}
415
416impl Hash for Receiver {
417 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700418 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800419 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700420 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700421 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800422 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700423 var: _,
424 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700425 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800426 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800427 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700428 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800429 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700430 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800431 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700432 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700433 }
434}