blob: 0cb20ff696d4e9de7729bbe26057b980249e29ad [file] [log] [blame]
David Tolnaye0dca7b2020-11-25 17:18:57 -08001use crate::syntax::{
David Tolnayeb472ad2021-01-01 19:40:15 -08002 Array, ExternFn, 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
Adrian Taylor38ae2282021-01-23 10:20:32 -08008use super::Ptr;
9
David Tolnayb0cd3272020-10-27 21:32:54 -070010impl PartialEq for Include {
David Tolnay2e43b512021-03-18 13:35:38 -070011 fn eq(&self, other: &Self) -> bool {
David Tolnayb0cd3272020-10-27 21:32:54 -070012 let Include {
13 path,
14 kind,
15 begin_span: _,
16 end_span: _,
17 } = self;
18 let Include {
19 path: path2,
20 kind: kind2,
21 begin_span: _,
22 end_span: _,
23 } = other;
24 path == path2 && kind == kind2
25 }
26}
27
David Tolnay16448732020-03-18 12:39:36 -070028impl Deref for ExternFn {
29 type Target = Signature;
30
31 fn deref(&self) -> &Self::Target {
32 &self.sig
33 }
34}
David Tolnayc21b20a2020-03-15 23:25:32 -070035
David Tolnay9bfbea32020-04-22 18:12:43 -070036impl DerefMut for ExternFn {
37 fn deref_mut(&mut self) -> &mut Self::Target {
38 &mut self.sig
39 }
40}
41
David Tolnayc21b20a2020-03-15 23:25:32 -070042impl Hash for Type {
43 fn hash<H: Hasher>(&self, state: &mut H) {
44 mem::discriminant(self).hash(state);
45 match self {
46 Type::Ident(t) => t.hash(state),
47 Type::RustBox(t) => t.hash(state),
48 Type::UniquePtr(t) => t.hash(state),
David Tolnayb3b24a12020-12-01 15:27:43 -080049 Type::SharedPtr(t) => t.hash(state),
David Tolnay215e77f2020-12-28 17:09:48 -080050 Type::WeakPtr(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070051 Type::Ref(t) => t.hash(state),
Adrian Taylor38ae2282021-01-23 10:20:32 -080052 Type::Ptr(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070053 Type::Str(t) => t.hash(state),
Myron Ahneba35cf2020-02-05 19:41:51 +070054 Type::RustVec(t) => t.hash(state),
David Tolnay4377a9e2020-04-24 15:20:26 -070055 Type::CxxVector(t) => t.hash(state),
David Tolnay417305a2020-03-18 13:54:00 -070056 Type::Fn(t) => t.hash(state),
David Tolnay73b72642020-11-25 17:44:05 -080057 Type::SliceRef(t) => t.hash(state),
Xiangpeng Hao78762352020-11-12 10:24:18 +080058 Type::Array(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070059 Type::Void(_) => {}
60 }
61 }
62}
63
64impl Eq for Type {}
65
66impl PartialEq for Type {
David Tolnay2e43b512021-03-18 13:35:38 -070067 fn eq(&self, other: &Self) -> bool {
David Tolnayc21b20a2020-03-15 23:25:32 -070068 match (self, other) {
69 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
70 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
71 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
David Tolnayb3b24a12020-12-01 15:27:43 -080072 (Type::SharedPtr(lhs), Type::SharedPtr(rhs)) => lhs == rhs,
David Tolnay215e77f2020-12-28 17:09:48 -080073 (Type::WeakPtr(lhs), Type::WeakPtr(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070074 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
75 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070076 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070077 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070078 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
David Tolnay73b72642020-11-25 17:44:05 -080079 (Type::SliceRef(lhs), Type::SliceRef(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070080 (Type::Void(_), Type::Void(_)) => true,
81 (_, _) => false,
82 }
83 }
84}
David Tolnay7db73692019-10-20 14:51:12 -040085
David Tolnay4a79b7f2020-12-30 19:48:42 -080086impl Eq for Lifetimes {}
87
88impl PartialEq for Lifetimes {
David Tolnay2e43b512021-03-18 13:35:38 -070089 fn eq(&self, other: &Self) -> bool {
David Tolnay4a79b7f2020-12-30 19:48:42 -080090 let Lifetimes {
91 lt_token: _,
92 lifetimes,
93 gt_token: _,
94 } = self;
95 let Lifetimes {
96 lt_token: _,
97 lifetimes: lifetimes2,
98 gt_token: _,
99 } = other;
100 lifetimes.iter().eq(lifetimes2)
101 }
102}
103
104impl Hash for Lifetimes {
105 fn hash<H: Hasher>(&self, state: &mut H) {
106 let Lifetimes {
107 lt_token: _,
108 lifetimes,
109 gt_token: _,
110 } = self;
111 lifetimes.len().hash(state);
112 for lifetime in lifetimes {
113 lifetime.hash(state);
114 }
115 }
116}
117
David Tolnay7db73692019-10-20 14:51:12 -0400118impl Eq for Ty1 {}
119
120impl PartialEq for Ty1 {
David Tolnay2e43b512021-03-18 13:35:38 -0700121 fn eq(&self, other: &Self) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700122 let Ty1 {
123 name,
124 langle: _,
125 inner,
126 rangle: _,
127 } = self;
128 let Ty1 {
129 name: name2,
130 langle: _,
131 inner: inner2,
132 rangle: _,
133 } = other;
David Tolnaybf7ae812020-11-16 23:31:45 -0800134 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400135 }
136}
137
138impl Hash for Ty1 {
139 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700140 let Ty1 {
141 name,
142 langle: _,
143 inner,
144 rangle: _,
145 } = self;
146 name.hash(state);
147 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400148 }
149}
150
151impl Eq for Ref {}
152
153impl PartialEq for Ref {
David Tolnay2e43b512021-03-18 13:35:38 -0700154 fn eq(&self, other: &Self) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700155 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800156 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700157 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700158 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800159 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700160 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800161 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800162 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700163 } = self;
164 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800165 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700166 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700167 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800168 mutable: mutable2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700169 inner: inner2,
David Tolnayb27f7872020-11-15 15:07:04 -0800170 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800171 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700172 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800173 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400174 }
175}
176
177impl Hash for Ref {
178 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700179 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800180 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700181 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700182 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800183 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700184 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800185 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800186 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700187 } = self;
David Tolnayb27f7872020-11-15 15:07:04 -0800188 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700189 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800190 mutable.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700191 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400192 }
193}
David Tolnay417305a2020-03-18 13:54:00 -0700194
Adrian Taylor38ae2282021-01-23 10:20:32 -0800195impl Eq for Ptr {}
196
197impl PartialEq for Ptr {
198 fn eq(&self, other: &Ptr) -> bool {
199 let Ptr {
200 star: _,
201 mutable,
202 inner,
203 mutability: _,
204 constness: _,
205 } = self;
206 let Ptr {
207 star: _,
208 mutable: mutable2,
209 inner: inner2,
210 mutability: _,
211 constness: _,
212 } = other;
213 mutable == mutable2 && inner == inner2
214 }
215}
216
217impl Hash for Ptr {
218 fn hash<H: Hasher>(&self, state: &mut H) {
219 let Ptr {
220 star: _,
221 mutable,
222 inner,
223 mutability: _,
224 constness: _,
225 } = self;
226 mutable.hash(state);
227 inner.hash(state);
228 }
229}
230
David Tolnaye0dca7b2020-11-25 17:18:57 -0800231impl Eq for SliceRef {}
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700232
David Tolnaye0dca7b2020-11-25 17:18:57 -0800233impl PartialEq for SliceRef {
David Tolnay2e43b512021-03-18 13:35:38 -0700234 fn eq(&self, other: &Self) -> bool {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800235 let SliceRef {
236 ampersand: _,
237 lifetime,
238 mutable,
239 bracket: _,
240 inner,
241 mutability: _,
242 } = self;
243 let SliceRef {
244 ampersand: _,
245 lifetime: lifetime2,
246 mutable: mutable2,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700247 bracket: _,
248 inner: inner2,
David Tolnaye0dca7b2020-11-25 17:18:57 -0800249 mutability: _,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700250 } = other;
David Tolnaye0dca7b2020-11-25 17:18:57 -0800251 lifetime == lifetime2 && mutable == mutable2 && inner == inner2
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700252 }
253}
254
David Tolnaye0dca7b2020-11-25 17:18:57 -0800255impl Hash for SliceRef {
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700256 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800257 let SliceRef {
258 ampersand: _,
259 lifetime,
260 mutable,
261 bracket: _,
262 inner,
263 mutability: _,
264 } = self;
265 lifetime.hash(state);
266 mutable.hash(state);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700267 inner.hash(state);
268 }
269}
270
Xiangpeng Hao78762352020-11-12 10:24:18 +0800271impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800272
Xiangpeng Hao78762352020-11-12 10:24:18 +0800273impl PartialEq for Array {
David Tolnay2e43b512021-03-18 13:35:38 -0700274 fn eq(&self, other: &Self) -> bool {
Xiangpeng Hao78762352020-11-12 10:24:18 +0800275 let Array {
276 bracket: _,
277 inner,
278 semi_token: _,
279 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800280 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800281 } = self;
282 let Array {
283 bracket: _,
284 inner: inner2,
285 semi_token: _,
286 len: len2,
David Tolnayc351dc42020-11-24 20:45:13 -0800287 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800288 } = other;
289 inner == inner2 && len == len2
290 }
291}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800292
Xiangpeng Hao78762352020-11-12 10:24:18 +0800293impl Hash for Array {
294 fn hash<H: Hasher>(&self, state: &mut H) {
295 let Array {
296 bracket: _,
297 inner,
298 semi_token: _,
299 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800300 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800301 } = self;
302 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800303 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800304 }
305}
306
David Tolnay417305a2020-03-18 13:54:00 -0700307impl Eq for Signature {}
308
309impl PartialEq for Signature {
David Tolnay2e43b512021-03-18 13:35:38 -0700310 fn eq(&self, other: &Self) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700311 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700312 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700313 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800314 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700315 receiver,
316 args,
317 ret,
318 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700319 paren_token: _,
320 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700321 } = self;
322 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700323 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700324 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800325 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700326 receiver: receiver2,
327 args: args2,
328 ret: ret2,
329 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700330 paren_token: _,
331 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700332 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700333 unsafety.is_some() == unsafety2.is_some()
334 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700335 && ret == ret2
336 && throws == throws2
337 && args.len() == args2.len()
David Tolnayb97a2452021-01-01 15:32:35 -0800338 && args.iter().zip(args2).all(|(arg, arg2)| {
339 let Var {
340 doc: _,
341 attrs: _,
342 visibility: _,
David Tolnay84ed6ad2021-01-01 15:30:14 -0800343 name: _,
David Tolnayb97a2452021-01-01 15:32:35 -0800344 ty,
345 } = arg;
346 let Var {
347 doc: _,
348 attrs: _,
349 visibility: _,
David Tolnay84ed6ad2021-01-01 15:30:14 -0800350 name: _,
David Tolnayb97a2452021-01-01 15:32:35 -0800351 ty: ty2,
352 } = arg2;
353 ty == ty2
354 })
David Tolnay417305a2020-03-18 13:54:00 -0700355 }
356}
357
358impl Hash for Signature {
359 fn hash<H: Hasher>(&self, state: &mut H) {
360 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700361 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700362 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800363 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700364 receiver,
365 args,
366 ret,
367 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700368 paren_token: _,
369 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700370 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700371 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700372 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700373 for arg in args {
David Tolnayb97a2452021-01-01 15:32:35 -0800374 let Var {
375 doc: _,
376 attrs: _,
377 visibility: _,
David Tolnay84ed6ad2021-01-01 15:30:14 -0800378 name: _,
David Tolnayb97a2452021-01-01 15:32:35 -0800379 ty,
380 } = arg;
381 ty.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700382 }
David Tolnay417305a2020-03-18 13:54:00 -0700383 ret.hash(state);
384 throws.hash(state);
385 }
386}
387
388impl Eq for Receiver {}
389
390impl PartialEq for Receiver {
David Tolnay2e43b512021-03-18 13:35:38 -0700391 fn eq(&self, other: &Self) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700392 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800393 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700394 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700395 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800396 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700397 var: _,
398 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700399 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800400 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800401 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700402 } = self;
403 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800404 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700405 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700406 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800407 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700408 var: _,
409 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700410 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800411 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800412 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700413 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800414 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700415 }
416}
417
418impl Hash for Receiver {
419 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700420 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800421 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700422 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700423 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800424 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700425 var: _,
426 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700427 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800428 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800429 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700430 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800431 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700432 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800433 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700434 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700435 }
436}