blob: 36cf3cdef39f55e197d8954ec4cbb3ff6dc6048f [file] [log] [blame]
David Tolnaye0dca7b2020-11-25 17:18:57 -08001use crate::syntax::{
2 Array, ExternFn, Impl, Include, Receiver, Ref, Signature, SliceRef, Ty1, Type,
3};
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),
48 Type::Ref(t) => t.hash(state),
49 Type::Str(t) => t.hash(state),
Myron Ahneba35cf2020-02-05 19:41:51 +070050 Type::RustVec(t) => t.hash(state),
David Tolnay4377a9e2020-04-24 15:20:26 -070051 Type::CxxVector(t) => t.hash(state),
David Tolnay417305a2020-03-18 13:54:00 -070052 Type::Fn(t) => t.hash(state),
Adrian Taylorf5dd5522020-04-13 16:50:14 -070053 Type::SliceRefU8(t) => t.hash(state),
Xiangpeng Hao78762352020-11-12 10:24:18 +080054 Type::Array(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070055 Type::Void(_) => {}
56 }
57 }
58}
59
60impl Eq for Type {}
61
62impl PartialEq for Type {
63 fn eq(&self, other: &Type) -> bool {
64 match (self, other) {
65 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
66 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
67 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
68 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
69 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070070 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070071 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070072 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
Adrian Taylorf5dd5522020-04-13 16:50:14 -070073 (Type::SliceRefU8(lhs), Type::SliceRefU8(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070074 (Type::Void(_), Type::Void(_)) => true,
75 (_, _) => false,
76 }
77 }
78}
David Tolnay7db73692019-10-20 14:51:12 -040079
80impl Eq for Ty1 {}
81
82impl PartialEq for Ty1 {
83 fn eq(&self, other: &Ty1) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070084 let Ty1 {
85 name,
86 langle: _,
87 inner,
88 rangle: _,
89 } = self;
90 let Ty1 {
91 name: name2,
92 langle: _,
93 inner: inner2,
94 rangle: _,
95 } = other;
David Tolnaybf7ae812020-11-16 23:31:45 -080096 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -040097 }
98}
99
100impl Hash for Ty1 {
101 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700102 let Ty1 {
103 name,
104 langle: _,
105 inner,
106 rangle: _,
107 } = self;
108 name.hash(state);
109 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400110 }
111}
112
113impl Eq for Ref {}
114
115impl PartialEq for Ref {
116 fn eq(&self, other: &Ref) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700117 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800118 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700119 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700120 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800121 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700122 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800123 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800124 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700125 } = self;
126 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800127 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700128 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700129 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800130 mutable: mutable2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700131 inner: inner2,
David Tolnayb27f7872020-11-15 15:07:04 -0800132 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800133 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700134 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800135 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400136 }
137}
138
139impl Hash for Ref {
140 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700141 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800142 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700143 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700144 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800145 mutable,
David Tolnay35c82eb2020-03-18 16:48:28 -0700146 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800147 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800148 mutability: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700149 } = self;
David Tolnayb27f7872020-11-15 15:07:04 -0800150 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700151 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800152 mutable.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700153 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400154 }
155}
David Tolnay417305a2020-03-18 13:54:00 -0700156
David Tolnaye0dca7b2020-11-25 17:18:57 -0800157impl Eq for SliceRef {}
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700158
David Tolnaye0dca7b2020-11-25 17:18:57 -0800159impl PartialEq for SliceRef {
160 fn eq(&self, other: &SliceRef) -> bool {
161 let SliceRef {
162 ampersand: _,
163 lifetime,
164 mutable,
165 bracket: _,
166 inner,
167 mutability: _,
168 } = self;
169 let SliceRef {
170 ampersand: _,
171 lifetime: lifetime2,
172 mutable: mutable2,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700173 bracket: _,
174 inner: inner2,
David Tolnaye0dca7b2020-11-25 17:18:57 -0800175 mutability: _,
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700176 } = other;
David Tolnaye0dca7b2020-11-25 17:18:57 -0800177 lifetime == lifetime2 && mutable == mutable2 && inner == inner2
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700178 }
179}
180
David Tolnaye0dca7b2020-11-25 17:18:57 -0800181impl Hash for SliceRef {
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700182 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnaye0dca7b2020-11-25 17:18:57 -0800183 let SliceRef {
184 ampersand: _,
185 lifetime,
186 mutable,
187 bracket: _,
188 inner,
189 mutability: _,
190 } = self;
191 lifetime.hash(state);
192 mutable.hash(state);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700193 inner.hash(state);
194 }
195}
196
Xiangpeng Hao78762352020-11-12 10:24:18 +0800197impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800198
Xiangpeng Hao78762352020-11-12 10:24:18 +0800199impl PartialEq for Array {
200 fn eq(&self, other: &Array) -> bool {
201 let Array {
202 bracket: _,
203 inner,
204 semi_token: _,
205 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800206 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800207 } = self;
208 let Array {
209 bracket: _,
210 inner: inner2,
211 semi_token: _,
212 len: len2,
David Tolnayc351dc42020-11-24 20:45:13 -0800213 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800214 } = other;
215 inner == inner2 && len == len2
216 }
217}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800218
Xiangpeng Hao78762352020-11-12 10:24:18 +0800219impl Hash for Array {
220 fn hash<H: Hasher>(&self, state: &mut H) {
221 let Array {
222 bracket: _,
223 inner,
224 semi_token: _,
225 len,
David Tolnayc351dc42020-11-24 20:45:13 -0800226 len_token: _,
Xiangpeng Hao78762352020-11-12 10:24:18 +0800227 } = self;
228 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800229 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800230 }
231}
232
David Tolnay417305a2020-03-18 13:54:00 -0700233impl Eq for Signature {}
234
235impl PartialEq for Signature {
236 fn eq(&self, other: &Signature) -> bool {
237 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700238 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700239 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800240 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700241 receiver,
242 args,
243 ret,
244 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700245 paren_token: _,
246 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700247 } = self;
248 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700249 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700250 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800251 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700252 receiver: receiver2,
253 args: args2,
254 ret: ret2,
255 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700256 paren_token: _,
257 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700258 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700259 unsafety.is_some() == unsafety2.is_some()
260 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700261 && ret == ret2
262 && throws == throws2
263 && args.len() == args2.len()
264 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700265 }
266}
267
268impl Hash for Signature {
269 fn hash<H: Hasher>(&self, state: &mut H) {
270 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700271 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700272 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800273 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700274 receiver,
275 args,
276 ret,
277 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700278 paren_token: _,
279 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700280 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700281 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700282 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700283 for arg in args {
284 arg.hash(state);
285 }
David Tolnay417305a2020-03-18 13:54:00 -0700286 ret.hash(state);
287 throws.hash(state);
288 }
289}
290
291impl Eq for Receiver {}
292
293impl PartialEq for Receiver {
294 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700295 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800296 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700297 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700298 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800299 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700300 var: _,
301 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700302 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800303 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800304 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700305 } = self;
306 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800307 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700308 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700309 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800310 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700311 var: _,
312 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700313 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800314 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800315 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700316 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800317 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700318 }
319}
320
321impl Hash for Receiver {
322 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700323 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800324 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700325 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700326 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800327 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700328 var: _,
329 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700330 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800331 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800332 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700333 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800334 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700335 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800336 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700337 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700338 }
339}
David Tolnay6586c692020-10-03 23:48:19 -0700340
341impl Hash for Impl {
342 fn hash<H: Hasher>(&self, state: &mut H) {
343 let Impl {
344 impl_token: _,
345 ty,
346 brace_token: _,
347 } = self;
348 ty.hash(state);
349 }
350}
351
352impl Eq for Impl {}
353
354impl PartialEq for Impl {
355 fn eq(&self, other: &Impl) -> bool {
356 let Impl {
357 impl_token: _,
358 ty,
359 brace_token: _,
360 } = self;
361 let Impl {
362 impl_token: _,
363 ty: ty2,
364 brace_token: _,
365 } = other;
366 ty == ty2
367 }
368}
369
370impl Borrow<Type> for &Impl {
371 fn borrow(&self) -> &Type {
372 &self.ty
373 }
374}