blob: ef3ba8f58ae26294bf6d7fbc174f14d79a8303e8 [file] [log] [blame]
Xiangpeng Hao78762352020-11-12 10:24:18 +08001use crate::syntax::{Array, ExternFn, Impl, Include, Receiver, Ref, Signature, Slice, Ty1, Type};
David Tolnay6586c692020-10-03 23:48:19 -07002use std::borrow::Borrow;
David Tolnay7db73692019-10-20 14:51:12 -04003use std::hash::{Hash, Hasher};
David Tolnayc21b20a2020-03-15 23:25:32 -07004use std::mem;
David Tolnay9bfbea32020-04-22 18:12:43 -07005use std::ops::{Deref, DerefMut};
David Tolnay16448732020-03-18 12:39:36 -07006
David Tolnayb0cd3272020-10-27 21:32:54 -07007impl PartialEq for Include {
8 fn eq(&self, other: &Include) -> bool {
9 let Include {
10 path,
11 kind,
12 begin_span: _,
13 end_span: _,
14 } = self;
15 let Include {
16 path: path2,
17 kind: kind2,
18 begin_span: _,
19 end_span: _,
20 } = other;
21 path == path2 && kind == kind2
22 }
23}
24
David Tolnay16448732020-03-18 12:39:36 -070025impl Deref for ExternFn {
26 type Target = Signature;
27
28 fn deref(&self) -> &Self::Target {
29 &self.sig
30 }
31}
David Tolnayc21b20a2020-03-15 23:25:32 -070032
David Tolnay9bfbea32020-04-22 18:12:43 -070033impl DerefMut for ExternFn {
34 fn deref_mut(&mut self) -> &mut Self::Target {
35 &mut self.sig
36 }
37}
38
David Tolnayc21b20a2020-03-15 23:25:32 -070039impl Hash for Type {
40 fn hash<H: Hasher>(&self, state: &mut H) {
41 mem::discriminant(self).hash(state);
42 match self {
43 Type::Ident(t) => t.hash(state),
44 Type::RustBox(t) => t.hash(state),
45 Type::UniquePtr(t) => t.hash(state),
46 Type::Ref(t) => t.hash(state),
47 Type::Str(t) => t.hash(state),
Myron Ahneba35cf2020-02-05 19:41:51 +070048 Type::RustVec(t) => t.hash(state),
David Tolnay4377a9e2020-04-24 15:20:26 -070049 Type::CxxVector(t) => t.hash(state),
David Tolnay417305a2020-03-18 13:54:00 -070050 Type::Fn(t) => t.hash(state),
Adrian Taylorf5dd5522020-04-13 16:50:14 -070051 Type::Slice(t) => t.hash(state),
52 Type::SliceRefU8(t) => t.hash(state),
Xiangpeng Hao78762352020-11-12 10:24:18 +080053 Type::Array(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070054 Type::Void(_) => {}
55 }
56 }
57}
58
59impl Eq for Type {}
60
61impl PartialEq for Type {
62 fn eq(&self, other: &Type) -> bool {
63 match (self, other) {
64 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
65 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
66 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
67 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
68 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070069 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070070 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070071 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
Adrian Taylorf5dd5522020-04-13 16:50:14 -070072 (Type::Slice(lhs), Type::Slice(rhs)) => lhs == rhs,
73 (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
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700157impl Eq for Slice {}
158
159impl PartialEq for Slice {
160 fn eq(&self, other: &Slice) -> bool {
David Tolnayeb952ba2020-04-14 15:02:24 -0700161 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700162 let Slice {
163 bracket: _,
164 inner: inner2,
165 } = other;
166 inner == inner2
167 }
168}
169
170impl Hash for Slice {
171 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayeb952ba2020-04-14 15:02:24 -0700172 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700173 inner.hash(state);
174 }
175}
176
Xiangpeng Hao78762352020-11-12 10:24:18 +0800177impl Eq for Array {}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800178
Xiangpeng Hao78762352020-11-12 10:24:18 +0800179impl PartialEq for Array {
180 fn eq(&self, other: &Array) -> bool {
181 let Array {
182 bracket: _,
183 inner,
184 semi_token: _,
185 len,
186 } = self;
187 let Array {
188 bracket: _,
189 inner: inner2,
190 semi_token: _,
191 len: len2,
192 } = other;
193 inner == inner2 && len == len2
194 }
195}
David Tolnaye8b1bb42020-11-24 20:37:37 -0800196
Xiangpeng Hao78762352020-11-12 10:24:18 +0800197impl Hash for Array {
198 fn hash<H: Hasher>(&self, state: &mut H) {
199 let Array {
200 bracket: _,
201 inner,
202 semi_token: _,
203 len,
204 } = self;
205 inner.hash(state);
David Tolnaye8b1bb42020-11-24 20:37:37 -0800206 len.hash(state);
Xiangpeng Hao78762352020-11-12 10:24:18 +0800207 }
208}
209
David Tolnay417305a2020-03-18 13:54:00 -0700210impl Eq for Signature {}
211
212impl PartialEq for Signature {
213 fn eq(&self, other: &Signature) -> bool {
214 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700215 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700216 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800217 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700218 receiver,
219 args,
220 ret,
221 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700222 paren_token: _,
223 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700224 } = self;
225 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700226 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700227 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800228 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700229 receiver: receiver2,
230 args: args2,
231 ret: ret2,
232 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700233 paren_token: _,
234 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700235 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700236 unsafety.is_some() == unsafety2.is_some()
237 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700238 && ret == ret2
239 && throws == throws2
240 && args.len() == args2.len()
241 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700242 }
243}
244
245impl Hash for Signature {
246 fn hash<H: Hasher>(&self, state: &mut H) {
247 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700248 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700249 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800250 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700251 receiver,
252 args,
253 ret,
254 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700255 paren_token: _,
256 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700257 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700258 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700259 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700260 for arg in args {
261 arg.hash(state);
262 }
David Tolnay417305a2020-03-18 13:54:00 -0700263 ret.hash(state);
264 throws.hash(state);
265 }
266}
267
268impl Eq for Receiver {}
269
270impl PartialEq for Receiver {
271 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700272 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800273 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700274 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700275 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800276 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700277 var: _,
278 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700279 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800280 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800281 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700282 } = self;
283 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800284 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700285 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700286 lifetime: lifetime2,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800287 mutable: mutable2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700288 var: _,
289 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700290 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800291 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800292 mutability: _,
David Tolnay417305a2020-03-18 13:54:00 -0700293 } = other;
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800294 pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700295 }
296}
297
298impl Hash for Receiver {
299 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700300 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800301 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700302 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700303 lifetime,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800304 mutable,
David Tolnay05e11cc2020-04-20 02:13:56 -0700305 var: _,
306 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700307 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800308 pin_tokens: _,
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800309 mutability: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700310 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800311 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700312 lifetime.hash(state);
David Tolnay9c4ac2e2020-11-15 21:14:03 -0800313 mutable.hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700314 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700315 }
316}
David Tolnay6586c692020-10-03 23:48:19 -0700317
318impl Hash for Impl {
319 fn hash<H: Hasher>(&self, state: &mut H) {
320 let Impl {
321 impl_token: _,
322 ty,
323 brace_token: _,
324 } = self;
325 ty.hash(state);
326 }
327}
328
329impl Eq for Impl {}
330
331impl PartialEq for Impl {
332 fn eq(&self, other: &Impl) -> bool {
333 let Impl {
334 impl_token: _,
335 ty,
336 brace_token: _,
337 } = self;
338 let Impl {
339 impl_token: _,
340 ty: ty2,
341 brace_token: _,
342 } = other;
343 ty == ty2
344 }
345}
346
347impl Borrow<Type> for &Impl {
348 fn borrow(&self) -> &Type {
349 &self.ty
350 }
351}