blob: 318cfaeb06f55aa0fa44fff69f95bde57fcdfc45 [file] [log] [blame]
David Tolnay60e7aa62020-11-01 12:34:51 -08001use crate::syntax::{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),
David Tolnayc21b20a2020-03-15 23:25:32 -070053 Type::Void(_) => {}
54 }
55 }
56}
57
58impl Eq for Type {}
59
60impl PartialEq for Type {
61 fn eq(&self, other: &Type) -> bool {
62 match (self, other) {
63 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
64 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
65 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
66 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
67 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070068 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070069 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070070 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
Adrian Taylorf5dd5522020-04-13 16:50:14 -070071 (Type::Slice(lhs), Type::Slice(rhs)) => lhs == rhs,
72 (Type::SliceRefU8(lhs), Type::SliceRefU8(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070073 (Type::Void(_), Type::Void(_)) => true,
74 (_, _) => false,
75 }
76 }
77}
David Tolnay7db73692019-10-20 14:51:12 -040078
79impl Eq for Ty1 {}
80
81impl PartialEq for Ty1 {
82 fn eq(&self, other: &Ty1) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070083 let Ty1 {
David Tolnayc94035a2020-11-15 16:49:18 -080084 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -070085 name,
86 langle: _,
87 inner,
88 rangle: _,
David Tolnayc94035a2020-11-15 16:49:18 -080089 pin_tokens: _,
David Tolnay35c82eb2020-03-18 16:48:28 -070090 } = self;
91 let Ty1 {
David Tolnayc94035a2020-11-15 16:49:18 -080092 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -070093 name: name2,
94 langle: _,
95 inner: inner2,
96 rangle: _,
David Tolnayc94035a2020-11-15 16:49:18 -080097 pin_tokens: _,
David Tolnay35c82eb2020-03-18 16:48:28 -070098 } = other;
David Tolnayc94035a2020-11-15 16:49:18 -080099 pinned == pinned2 && name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400100 }
101}
102
103impl Hash for Ty1 {
104 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700105 let Ty1 {
David Tolnayc94035a2020-11-15 16:49:18 -0800106 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700107 name,
108 langle: _,
109 inner,
110 rangle: _,
David Tolnayc94035a2020-11-15 16:49:18 -0800111 pin_tokens: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700112 } = self;
David Tolnayc94035a2020-11-15 16:49:18 -0800113 pinned.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700114 name.hash(state);
115 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400116 }
117}
118
119impl Eq for Ref {}
120
121impl PartialEq for Ref {
122 fn eq(&self, other: &Ref) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -0700123 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800124 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700125 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700126 lifetime,
David Tolnay35c82eb2020-03-18 16:48:28 -0700127 mutability,
128 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800129 pin_tokens: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700130 } = self;
131 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800132 pinned: pinned2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700133 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700134 lifetime: lifetime2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700135 mutability: mutability2,
136 inner: inner2,
David Tolnayb27f7872020-11-15 15:07:04 -0800137 pin_tokens: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700138 } = other;
David Tolnayb27f7872020-11-15 15:07:04 -0800139 pinned == pinned2
140 && lifetime == lifetime2
141 && mutability.is_some() == mutability2.is_some()
142 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400143 }
144}
145
146impl Hash for Ref {
147 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700148 let Ref {
David Tolnayb27f7872020-11-15 15:07:04 -0800149 pinned,
David Tolnay35c82eb2020-03-18 16:48:28 -0700150 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700151 lifetime,
David Tolnay35c82eb2020-03-18 16:48:28 -0700152 mutability,
153 inner,
David Tolnayb27f7872020-11-15 15:07:04 -0800154 pin_tokens: _,
David Tolnay35c82eb2020-03-18 16:48:28 -0700155 } = self;
David Tolnayb27f7872020-11-15 15:07:04 -0800156 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700157 lifetime.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700158 mutability.is_some().hash(state);
159 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400160 }
161}
David Tolnay417305a2020-03-18 13:54:00 -0700162
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700163impl Eq for Slice {}
164
165impl PartialEq for Slice {
166 fn eq(&self, other: &Slice) -> bool {
David Tolnayeb952ba2020-04-14 15:02:24 -0700167 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700168 let Slice {
169 bracket: _,
170 inner: inner2,
171 } = other;
172 inner == inner2
173 }
174}
175
176impl Hash for Slice {
177 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayeb952ba2020-04-14 15:02:24 -0700178 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700179 inner.hash(state);
180 }
181}
182
David Tolnay417305a2020-03-18 13:54:00 -0700183impl Eq for Signature {}
184
185impl PartialEq for Signature {
186 fn eq(&self, other: &Signature) -> bool {
187 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700188 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700189 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800190 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700191 receiver,
192 args,
193 ret,
194 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700195 paren_token: _,
196 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700197 } = self;
198 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700199 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700200 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800201 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700202 receiver: receiver2,
203 args: args2,
204 ret: ret2,
205 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700206 paren_token: _,
207 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700208 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700209 unsafety.is_some() == unsafety2.is_some()
210 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700211 && ret == ret2
212 && throws == throws2
213 && args.len() == args2.len()
214 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700215 }
216}
217
218impl Hash for Signature {
219 fn hash<H: Hasher>(&self, state: &mut H) {
220 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700221 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700222 fn_token: _,
David Tolnay9938b642020-11-15 18:11:40 -0800223 generics: _,
David Tolnay417305a2020-03-18 13:54:00 -0700224 receiver,
225 args,
226 ret,
227 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700228 paren_token: _,
229 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700230 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700231 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700232 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700233 for arg in args {
234 arg.hash(state);
235 }
David Tolnay417305a2020-03-18 13:54:00 -0700236 ret.hash(state);
237 throws.hash(state);
238 }
239}
240
241impl Eq for Receiver {}
242
243impl PartialEq for Receiver {
244 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700245 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800246 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700247 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700248 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700249 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700250 var: _,
251 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700252 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800253 pin_tokens: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700254 } = self;
255 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800256 pinned: pinned2,
David Tolnayfb6e3862020-04-20 01:33:23 -0700257 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700258 lifetime: lifetime2,
David Tolnay417305a2020-03-18 13:54:00 -0700259 mutability: mutability2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700260 var: _,
261 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700262 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800263 pin_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700264 } = other;
David Tolnay9c76c392020-11-15 16:07:08 -0800265 pinned == pinned2
266 && lifetime == lifetime2
267 && mutability.is_some() == mutability2.is_some()
268 && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700269 }
270}
271
272impl Hash for Receiver {
273 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700274 let Receiver {
David Tolnay9c76c392020-11-15 16:07:08 -0800275 pinned,
David Tolnayfb6e3862020-04-20 01:33:23 -0700276 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700277 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700278 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700279 var: _,
280 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700281 shorthand: _,
David Tolnay9c76c392020-11-15 16:07:08 -0800282 pin_tokens: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700283 } = self;
David Tolnay9c76c392020-11-15 16:07:08 -0800284 pinned.hash(state);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700285 lifetime.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700286 mutability.is_some().hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700287 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700288 }
289}
David Tolnay6586c692020-10-03 23:48:19 -0700290
291impl Hash for Impl {
292 fn hash<H: Hasher>(&self, state: &mut H) {
293 let Impl {
294 impl_token: _,
295 ty,
296 brace_token: _,
297 } = self;
298 ty.hash(state);
299 }
300}
301
302impl Eq for Impl {}
303
304impl PartialEq for Impl {
305 fn eq(&self, other: &Impl) -> bool {
306 let Impl {
307 impl_token: _,
308 ty,
309 brace_token: _,
310 } = self;
311 let Impl {
312 impl_token: _,
313 ty: ty2,
314 brace_token: _,
315 } = other;
316 ty == ty2
317 }
318}
319
320impl Borrow<Type> for &Impl {
321 fn borrow(&self) -> &Type {
322 &self.ty
323 }
324}