blob: 8c16f2d9766e1f6da06f9064a5bcf6667d63de98 [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 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
David Tolnay4a79b7f2020-12-30 19:48:42 -080084impl Eq for Lifetimes {}
85
86impl PartialEq for Lifetimes {
87 fn eq(&self, other: &Lifetimes) -> bool {
88 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 {
119 fn eq(&self, other: &Ty1) -> 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 {
152 fn eq(&self, other: &Ref) -> 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
David Tolnaye0dca7b2020-11-25 17:18:57 -0800193impl Eq for SliceRef {}
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700194
David Tolnaye0dca7b2020-11-25 17:18:57 -0800195impl PartialEq for SliceRef {
196 fn eq(&self, other: &SliceRef) -> bool {
197 let SliceRef {
198 ampersand: _,
199 lifetime,
200 mutable,
201 bracket: _,
202 inner,
203 mutability: _,
204 } = self;
205 let SliceRef {
206 ampersand: _,
207 lifetime: lifetime2,
208 mutable: mutable2,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700209 bracket: _,
210 inner: inner2,
David Tolnaye0dca7b2020-11-25 17:18:57 -0800211 mutability: _,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700212 } = other;
David Tolnaye0dca7b2020-11-25 17:18:57 -0800213 lifetime == lifetime2 && mutable == mutable2 && inner == inner2
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700214 }
215}
216
David Tolnaye0dca7b2020-11-25 17:18:57 -0800217impl Hash for SliceRef {
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700218 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800219 let SliceRef {
220 ampersand: _,
221 lifetime,
222 mutable,
223 bracket: _,
224 inner,
225 mutability: _,
226 } = self;
227 lifetime.hash(state);
228 mutable.hash(state);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700229 inner.hash(state);
230 }
231}
232
Xiangpeng Hao78762352020-11-12 10:24:18 +0800233impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800234
Xiangpeng Hao78762352020-11-12 10:24:18 +0800235impl PartialEq for Array {
236 fn eq(&self, other: &Array) -> bool {
237 let Array {
238 bracket: _,
239 inner,
240 semi_token: _,
241 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800242 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800243 } = self;
244 let Array {
245 bracket: _,
246 inner: inner2,
247 semi_token: _,
248 len: len2,
David Tolnayc351dc42020-11-24 20:45:13 -0800249 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800250 } = other;
251 inner == inner2 && len == len2
252 }
253}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800254
Xiangpeng Hao78762352020-11-12 10:24:18 +0800255impl Hash for Array {
256 fn hash<H: Hasher>(&self, state: &mut H) {
257 let Array {
258 bracket: _,
259 inner,
260 semi_token: _,
261 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800262 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800263 } = self;
264 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800265 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800266 }
267}
268
David Tolnay417305a2020-03-18 13:54:00 -0700269impl Eq for Signature {}
270
271impl PartialEq for Signature {
272 fn eq(&self, other: &Signature) -> bool {
273 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700274 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700275 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800276 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700277 receiver,
278 args,
279 ret,
280 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700281 paren_token: _,
282 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700283 } = self;
284 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700285 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700286 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800287 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700288 receiver: receiver2,
289 args: args2,
290 ret: ret2,
291 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700292 paren_token: _,
293 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700294 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700295 unsafety.is_some() == unsafety2.is_some()
296 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700297 && ret == ret2
298 && throws == throws2
299 && args.len() == args2.len()
300 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700301 }
302}
303
304impl Hash for Signature {
305 fn hash<H: Hasher>(&self, state: &mut H) {
306 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700307 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700308 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800309 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700310 receiver,
311 args,
312 ret,
313 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700314 paren_token: _,
315 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700316 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700317 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700318 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700319 for arg in args {
320 arg.hash(state);
321 }
David Tolnay417305a2020-03-18 13:54:00 -0700322 ret.hash(state);
323 throws.hash(state);
324 }
325}
326
David Tolnay89902442020-12-30 15:10:40 -0800327impl Eq for Var {}
328
329impl PartialEq for Var {
330 fn eq(&self, other: &Var) -> bool {
331 let Var {
David Tolnayb4a05c32020-12-30 15:37:01 -0800332 doc: _,
David Tolnay067638e2020-12-30 16:18:05 -0800333 attrs: _,
David Tolnay89902442020-12-30 15:10:40 -0800334 visibility: _,
335 ident,
336 ty,
337 } = self;
338 let Var {
David Tolnayb4a05c32020-12-30 15:37:01 -0800339 doc: _,
David Tolnay067638e2020-12-30 16:18:05 -0800340 attrs: _,
David Tolnay89902442020-12-30 15:10:40 -0800341 visibility: _,
342 ident: ident2,
343 ty: ty2,
344 } = other;
345 ident == ident2 && ty == ty2
346 }
347}
348
349impl Hash for Var {
350 fn hash<H: Hasher>(&self, state: &mut H) {
351 let Var {
David Tolnayb4a05c32020-12-30 15:37:01 -0800352 doc: _,
David Tolnay067638e2020-12-30 16:18:05 -0800353 attrs: _,
David Tolnay89902442020-12-30 15:10:40 -0800354 visibility: _,
355 ident,
356 ty,
357 } = self;
358 ident.hash(state);
359 ty.hash(state);
360 }
361}
362
David Tolnay417305a2020-03-18 13:54:00 -0700363impl Eq for Receiver {}
364
365impl PartialEq for Receiver {
366 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700367 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800368 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700369 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700370 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800371 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700372 var: _,
373 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700374 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800375 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800376 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700377 } = self;
378 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800379 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700380 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700381 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800382 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700383 var: _,
384 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700385 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800386 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800387 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700388 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800389 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700390 }
391}
392
393impl Hash for Receiver {
394 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700395 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800396 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700397 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700398 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800399 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700400 var: _,
401 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700402 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800403 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800404 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700405 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800406 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700407 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800408 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700409 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700410 }
411}
David Tolnay6586c692020-10-03 23:48:19 -0700412
413impl Hash for Impl {
414 fn hash<H: Hasher>(&self, state: &mut H) {
415 let Impl {
416 impl_token: _,
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 Tolnay028d3d22020-11-29 18:09:52 -0800422 if *negative {
423 negative.hash(state);
424 }
David Tolnay6586c692020-10-03 23:48:19 -0700425 ty.hash(state);
426 }
427}
428
429impl Eq for Impl {}
430
431impl PartialEq for Impl {
432 fn eq(&self, other: &Impl) -> bool {
433 let Impl {
434 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800435 negative,
David Tolnay6586c692020-10-03 23:48:19 -0700436 ty,
437 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800438 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700439 } = self;
440 let Impl {
441 impl_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800442 negative: negative2,
David Tolnay6586c692020-10-03 23:48:19 -0700443 ty: ty2,
444 brace_token: _,
David Tolnay028d3d22020-11-29 18:09:52 -0800445 negative_token: _,
David Tolnay6586c692020-10-03 23:48:19 -0700446 } = other;
David Tolnay028d3d22020-11-29 18:09:52 -0800447 negative == negative2 && ty == ty2
David Tolnay6586c692020-10-03 23:48:19 -0700448 }
449}
450
451impl Borrow<Type> for &Impl {
452 fn borrow(&self) -> &Type {
453 &self.ty
454 }
455}