blob: a4b393aec4d037c7b241f40b1134484abdb786fc [file] [log] [blame]
David Tolnayb0cd3272020-10-27 21:32:54 -07001use 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 {
84 name,
85 langle: _,
86 inner,
87 rangle: _,
88 } = self;
89 let Ty1 {
90 name: name2,
91 langle: _,
92 inner: inner2,
93 rangle: _,
94 } = other;
95 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -040096 }
97}
98
99impl Hash for Ty1 {
100 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700101 let Ty1 {
102 name,
103 langle: _,
104 inner,
105 rangle: _,
106 } = self;
107 name.hash(state);
108 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400109 }
110}
111
112impl Eq for Ref {}
113
114impl PartialEq for Ref {
115 fn eq(&self, other: &Ref) -> bool {
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;
122 let Ref {
123 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700124 lifetime: lifetime2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700125 mutability: mutability2,
126 inner: inner2,
127 } = other;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700128 lifetime == lifetime2 && mutability.is_some() == mutability2.is_some() && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400129 }
130}
131
132impl Hash for Ref {
133 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700134 let Ref {
135 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700136 lifetime,
David Tolnay35c82eb2020-03-18 16:48:28 -0700137 mutability,
138 inner,
139 } = self;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700140 lifetime.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700141 mutability.is_some().hash(state);
142 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400143 }
144}
David Tolnay417305a2020-03-18 13:54:00 -0700145
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700146impl Eq for Slice {}
147
148impl PartialEq for Slice {
149 fn eq(&self, other: &Slice) -> bool {
David Tolnayeb952ba2020-04-14 15:02:24 -0700150 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700151 let Slice {
152 bracket: _,
153 inner: inner2,
154 } = other;
155 inner == inner2
156 }
157}
158
159impl Hash for Slice {
160 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayeb952ba2020-04-14 15:02:24 -0700161 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700162 inner.hash(state);
163 }
164}
165
David Tolnay417305a2020-03-18 13:54:00 -0700166impl Eq for Signature {}
167
168impl PartialEq for Signature {
169 fn eq(&self, other: &Signature) -> bool {
170 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700171 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700172 fn_token: _,
173 receiver,
174 args,
175 ret,
176 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700177 paren_token: _,
178 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700179 } = self;
180 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700181 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700182 fn_token: _,
183 receiver: receiver2,
184 args: args2,
185 ret: ret2,
186 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700187 paren_token: _,
188 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700189 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700190 unsafety.is_some() == unsafety2.is_some()
191 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700192 && ret == ret2
193 && throws == throws2
194 && args.len() == args2.len()
195 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700196 }
197}
198
199impl Hash for Signature {
200 fn hash<H: Hasher>(&self, state: &mut H) {
201 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700202 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700203 fn_token: _,
204 receiver,
205 args,
206 ret,
207 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700208 paren_token: _,
209 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700210 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700211 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700212 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700213 for arg in args {
214 arg.hash(state);
215 }
David Tolnay417305a2020-03-18 13:54:00 -0700216 ret.hash(state);
217 throws.hash(state);
218 }
219}
220
221impl Eq for Receiver {}
222
223impl PartialEq for Receiver {
224 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700225 let Receiver {
David Tolnayfb6e3862020-04-20 01:33:23 -0700226 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700227 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700228 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700229 var: _,
230 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700231 shorthand: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700232 } = self;
233 let Receiver {
234 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700235 lifetime: lifetime2,
David Tolnay417305a2020-03-18 13:54:00 -0700236 mutability: mutability2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700237 var: _,
238 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700239 shorthand: _,
David Tolnay417305a2020-03-18 13:54:00 -0700240 } = other;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700241 lifetime == lifetime2 && mutability.is_some() == mutability2.is_some() && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700242 }
243}
244
245impl Hash for Receiver {
246 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700247 let Receiver {
248 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700249 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700250 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700251 var: _,
252 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700253 shorthand: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700254 } = self;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700255 lifetime.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700256 mutability.is_some().hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700257 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700258 }
259}
David Tolnay6586c692020-10-03 23:48:19 -0700260
261impl Hash for Impl {
262 fn hash<H: Hasher>(&self, state: &mut H) {
263 let Impl {
264 impl_token: _,
265 ty,
266 brace_token: _,
267 } = self;
268 ty.hash(state);
269 }
270}
271
272impl Eq for Impl {}
273
274impl PartialEq for Impl {
275 fn eq(&self, other: &Impl) -> bool {
276 let Impl {
277 impl_token: _,
278 ty,
279 brace_token: _,
280 } = self;
281 let Impl {
282 impl_token: _,
283 ty: ty2,
284 brace_token: _,
285 } = other;
286 ty == ty2
287 }
288}
289
290impl Borrow<Type> for &Impl {
291 fn borrow(&self) -> &Type {
292 &self.ty
293 }
294}