blob: 6a177d52973401a94d12560fa17076e02b7e9f4b [file] [log] [blame]
David Tolnay6586c692020-10-03 23:48:19 -07001use crate::syntax::{ExternFn, Impl, Receiver, Ref, Signature, Slice, Ty1, Type};
2use 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
7impl Deref for ExternFn {
8 type Target = Signature;
9
10 fn deref(&self) -> &Self::Target {
11 &self.sig
12 }
13}
David Tolnayc21b20a2020-03-15 23:25:32 -070014
David Tolnay9bfbea32020-04-22 18:12:43 -070015impl DerefMut for ExternFn {
16 fn deref_mut(&mut self) -> &mut Self::Target {
17 &mut self.sig
18 }
19}
20
David Tolnayc21b20a2020-03-15 23:25:32 -070021impl Hash for Type {
22 fn hash<H: Hasher>(&self, state: &mut H) {
23 mem::discriminant(self).hash(state);
24 match self {
25 Type::Ident(t) => t.hash(state),
26 Type::RustBox(t) => t.hash(state),
27 Type::UniquePtr(t) => t.hash(state),
28 Type::Ref(t) => t.hash(state),
29 Type::Str(t) => t.hash(state),
Myron Ahneba35cf2020-02-05 19:41:51 +070030 Type::RustVec(t) => t.hash(state),
David Tolnay4377a9e2020-04-24 15:20:26 -070031 Type::CxxVector(t) => t.hash(state),
David Tolnay417305a2020-03-18 13:54:00 -070032 Type::Fn(t) => t.hash(state),
Adrian Taylorf5dd5522020-04-13 16:50:14 -070033 Type::Slice(t) => t.hash(state),
34 Type::SliceRefU8(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070035 Type::Void(_) => {}
36 }
37 }
38}
39
40impl Eq for Type {}
41
42impl PartialEq for Type {
43 fn eq(&self, other: &Type) -> bool {
44 match (self, other) {
45 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
46 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
47 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
48 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
49 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070050 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070051 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070052 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
Adrian Taylorf5dd5522020-04-13 16:50:14 -070053 (Type::Slice(lhs), Type::Slice(rhs)) => lhs == rhs,
54 (Type::SliceRefU8(lhs), Type::SliceRefU8(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070055 (Type::Void(_), Type::Void(_)) => true,
56 (_, _) => false,
57 }
58 }
59}
David Tolnay7db73692019-10-20 14:51:12 -040060
61impl Eq for Ty1 {}
62
63impl PartialEq for Ty1 {
64 fn eq(&self, other: &Ty1) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070065 let Ty1 {
66 name,
67 langle: _,
68 inner,
69 rangle: _,
70 } = self;
71 let Ty1 {
72 name: name2,
73 langle: _,
74 inner: inner2,
75 rangle: _,
76 } = other;
77 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -040078 }
79}
80
81impl Hash for Ty1 {
82 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -070083 let Ty1 {
84 name,
85 langle: _,
86 inner,
87 rangle: _,
88 } = self;
89 name.hash(state);
90 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -040091 }
92}
93
94impl Eq for Ref {}
95
96impl PartialEq for Ref {
97 fn eq(&self, other: &Ref) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070098 let Ref {
99 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700100 lifetime,
David Tolnay35c82eb2020-03-18 16:48:28 -0700101 mutability,
102 inner,
103 } = self;
104 let Ref {
105 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700106 lifetime: lifetime2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700107 mutability: mutability2,
108 inner: inner2,
109 } = other;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700110 lifetime == lifetime2 && mutability.is_some() == mutability2.is_some() && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400111 }
112}
113
114impl Hash for Ref {
115 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700116 let Ref {
117 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700118 lifetime,
David Tolnay35c82eb2020-03-18 16:48:28 -0700119 mutability,
120 inner,
121 } = self;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700122 lifetime.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700123 mutability.is_some().hash(state);
124 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400125 }
126}
David Tolnay417305a2020-03-18 13:54:00 -0700127
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700128impl Eq for Slice {}
129
130impl PartialEq for Slice {
131 fn eq(&self, other: &Slice) -> bool {
David Tolnayeb952ba2020-04-14 15:02:24 -0700132 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700133 let Slice {
134 bracket: _,
135 inner: inner2,
136 } = other;
137 inner == inner2
138 }
139}
140
141impl Hash for Slice {
142 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayeb952ba2020-04-14 15:02:24 -0700143 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700144 inner.hash(state);
145 }
146}
147
David Tolnay417305a2020-03-18 13:54:00 -0700148impl Eq for Signature {}
149
150impl PartialEq for Signature {
151 fn eq(&self, other: &Signature) -> bool {
152 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700153 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700154 fn_token: _,
155 receiver,
156 args,
157 ret,
158 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700159 paren_token: _,
160 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700161 } = self;
162 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700163 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700164 fn_token: _,
165 receiver: receiver2,
166 args: args2,
167 ret: ret2,
168 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700169 paren_token: _,
170 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700171 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700172 unsafety.is_some() == unsafety2.is_some()
173 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700174 && ret == ret2
175 && throws == throws2
176 && args.len() == args2.len()
177 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700178 }
179}
180
181impl Hash for Signature {
182 fn hash<H: Hasher>(&self, state: &mut H) {
183 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700184 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700185 fn_token: _,
186 receiver,
187 args,
188 ret,
189 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700190 paren_token: _,
191 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700192 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700193 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700194 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700195 for arg in args {
196 arg.hash(state);
197 }
David Tolnay417305a2020-03-18 13:54:00 -0700198 ret.hash(state);
199 throws.hash(state);
200 }
201}
202
203impl Eq for Receiver {}
204
205impl PartialEq for Receiver {
206 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700207 let Receiver {
David Tolnayfb6e3862020-04-20 01:33:23 -0700208 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700209 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700210 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700211 var: _,
212 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700213 shorthand: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700214 } = self;
215 let Receiver {
216 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700217 lifetime: lifetime2,
David Tolnay417305a2020-03-18 13:54:00 -0700218 mutability: mutability2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700219 var: _,
220 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700221 shorthand: _,
David Tolnay417305a2020-03-18 13:54:00 -0700222 } = other;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700223 lifetime == lifetime2 && mutability.is_some() == mutability2.is_some() && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700224 }
225}
226
227impl Hash for Receiver {
228 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700229 let Receiver {
230 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700231 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700232 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700233 var: _,
234 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700235 shorthand: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700236 } = self;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700237 lifetime.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700238 mutability.is_some().hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700239 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700240 }
241}
David Tolnay6586c692020-10-03 23:48:19 -0700242
243impl Hash for Impl {
244 fn hash<H: Hasher>(&self, state: &mut H) {
245 let Impl {
246 impl_token: _,
247 ty,
248 brace_token: _,
249 } = self;
250 ty.hash(state);
251 }
252}
253
254impl Eq for Impl {}
255
256impl PartialEq for Impl {
257 fn eq(&self, other: &Impl) -> bool {
258 let Impl {
259 impl_token: _,
260 ty,
261 brace_token: _,
262 } = self;
263 let Impl {
264 impl_token: _,
265 ty: ty2,
266 brace_token: _,
267 } = other;
268 ty == ty2
269 }
270}
271
272impl Borrow<Type> for &Impl {
273 fn borrow(&self) -> &Type {
274 &self.ty
275 }
276}