|
1 | | -#![cfg_attr( |
2 | | - not(test), |
3 | | - expect(dead_code, reason = "queries are not used yet"), |
4 | | - expect(unused_imports, reason = "queries are not used yet") |
5 | | -)] |
| 1 | +#![cfg_attr(not(test), expect(dead_code, reason = "queries are not used yet"))] |
6 | 2 |
|
7 | 3 | use crate::prelude::*; |
8 | 4 | use hir::*; |
9 | 5 |
|
| 6 | +#[expect(unused_imports, reason = "queries are not used yet")] |
10 | 7 | pub use self::traits::*; |
11 | 8 |
|
12 | 9 | /// Query builder for searching through the [`Hir`] for some [`Queryable`]. |
@@ -169,148 +166,161 @@ mod traits { |
169 | 166 | true |
170 | 167 | } |
171 | 168 | } |
172 | | -} |
173 | | - |
174 | | -#[cfg(test)] |
175 | | -mod test { |
176 | | - use super::*; |
177 | 169 |
|
178 | | - #[fixture] |
179 | | - fn ctx() -> Ctx { |
180 | | - Ctx::new() |
181 | | - } |
182 | | - |
183 | | - #[fixture] |
184 | | - fn hir() -> Hir { |
185 | | - let mut hir = Hir::default(); |
186 | | - |
187 | | - // Empty trait. |
188 | | - hir.traits.insert(Trait { |
189 | | - name: TraitBindingId::from_id(0), |
190 | | - method_scope: ScopeId::from_id(0), |
191 | | - method_bindings: HashMap::new(), |
192 | | - methods: IndexedVec::new(), |
193 | | - }); |
194 | | - |
195 | | - // Single method trait. |
196 | | - hir.traits.insert(Trait { |
197 | | - name: TraitBindingId::from_id(1), |
198 | | - method_scope: ScopeId::from_id(1), |
199 | | - method_bindings: HashMap::from_iter([( |
200 | | - IdentifierBindingId::from_id(0), |
201 | | - TraitMethodId::from_id(0), |
202 | | - )]), |
203 | | - methods: indexed_vec![FunctionSignature { |
204 | | - parameters: vec![], |
205 | | - return_ty: MaybeSelfType::Type(TypeId::from_id(0)), |
206 | | - }], |
207 | | - }); |
208 | | - |
209 | | - // Single method trait with parameters. |
210 | | - hir.traits.insert(Trait { |
211 | | - name: TraitBindingId::from_id(2), |
212 | | - method_scope: ScopeId::from_id(2), |
213 | | - method_bindings: HashMap::from_iter([( |
214 | | - IdentifierBindingId::from_id(0), |
215 | | - TraitMethodId::from_id(0), |
216 | | - )]), |
217 | | - methods: indexed_vec![FunctionSignature { |
218 | | - parameters: vec![ |
219 | | - (IdentifierBindingId::from_id(1), MaybeSelfType::SelfType), |
220 | | - ( |
221 | | - IdentifierBindingId::from_id(2), |
222 | | - MaybeSelfType::Type(TypeId::from_id(0)) |
223 | | - ), |
224 | | - ], |
225 | | - return_ty: MaybeSelfType::Type(TypeId::from_id(0)), |
226 | | - }], |
227 | | - }); |
228 | | - |
229 | | - // Multi method trait. |
230 | | - hir.traits.insert(Trait { |
231 | | - name: TraitBindingId::from_id(1), |
232 | | - method_scope: ScopeId::from_id(1), |
233 | | - method_bindings: HashMap::from_iter([ |
234 | | - (IdentifierBindingId::from_id(0), TraitMethodId::from_id(0)), |
235 | | - (IdentifierBindingId::from_id(1), TraitMethodId::from_id(1)), |
236 | | - ]), |
237 | | - methods: indexed_vec![ |
238 | | - FunctionSignature { |
| 170 | + #[cfg(test)] |
| 171 | + mod test { |
| 172 | + use super::*; |
| 173 | + |
| 174 | + #[fixture] |
| 175 | + fn hir() -> Hir { |
| 176 | + let mut hir = Hir::default(); |
| 177 | + |
| 178 | + // Empty trait. |
| 179 | + hir.traits.insert(Trait { |
| 180 | + name: TraitBindingId::from_id(0), |
| 181 | + method_scope: ScopeId::from_id(0), |
| 182 | + method_bindings: HashMap::new(), |
| 183 | + methods: IndexedVec::new(), |
| 184 | + }); |
| 185 | + |
| 186 | + // Single method trait. |
| 187 | + hir.traits.insert(Trait { |
| 188 | + name: TraitBindingId::from_id(1), |
| 189 | + method_scope: ScopeId::from_id(1), |
| 190 | + method_bindings: HashMap::from_iter([( |
| 191 | + IdentifierBindingId::from_id(0), |
| 192 | + TraitMethodId::from_id(0), |
| 193 | + )]), |
| 194 | + methods: indexed_vec![FunctionSignature { |
239 | 195 | parameters: vec![], |
240 | 196 | return_ty: MaybeSelfType::Type(TypeId::from_id(0)), |
241 | | - }, |
242 | | - FunctionSignature { |
243 | | - parameters: vec![], |
| 197 | + }], |
| 198 | + }); |
| 199 | + |
| 200 | + // Single method trait with parameters. |
| 201 | + hir.traits.insert(Trait { |
| 202 | + name: TraitBindingId::from_id(2), |
| 203 | + method_scope: ScopeId::from_id(2), |
| 204 | + method_bindings: HashMap::from_iter([( |
| 205 | + IdentifierBindingId::from_id(0), |
| 206 | + TraitMethodId::from_id(0), |
| 207 | + )]), |
| 208 | + methods: indexed_vec![FunctionSignature { |
| 209 | + parameters: vec![ |
| 210 | + (IdentifierBindingId::from_id(1), MaybeSelfType::SelfType), |
| 211 | + ( |
| 212 | + IdentifierBindingId::from_id(2), |
| 213 | + MaybeSelfType::Type(TypeId::from_id(0)) |
| 214 | + ), |
| 215 | + ], |
244 | 216 | return_ty: MaybeSelfType::Type(TypeId::from_id(0)), |
245 | | - } |
246 | | - ], |
247 | | - }); |
| 217 | + }], |
| 218 | + }); |
| 219 | + |
| 220 | + // Multi method trait. |
| 221 | + hir.traits.insert(Trait { |
| 222 | + name: TraitBindingId::from_id(3), |
| 223 | + method_scope: ScopeId::from_id(3), |
| 224 | + method_bindings: HashMap::from_iter([ |
| 225 | + (IdentifierBindingId::from_id(0), TraitMethodId::from_id(0)), |
| 226 | + (IdentifierBindingId::from_id(1), TraitMethodId::from_id(1)), |
| 227 | + ]), |
| 228 | + methods: indexed_vec![ |
| 229 | + FunctionSignature { |
| 230 | + parameters: vec![], |
| 231 | + return_ty: MaybeSelfType::Type(TypeId::from_id(0)), |
| 232 | + }, |
| 233 | + FunctionSignature { |
| 234 | + parameters: vec![], |
| 235 | + return_ty: MaybeSelfType::Type(TypeId::from_id(0)), |
| 236 | + } |
| 237 | + ], |
| 238 | + }); |
248 | 239 |
|
249 | | - hir |
250 | | - } |
| 240 | + hir |
| 241 | + } |
251 | 242 |
|
252 | | - #[rstest] |
253 | | - fn all_traits(hir: Hir) { |
254 | | - assert_eq!(Query::traits().query(&hir).count(), 4); |
255 | | - } |
| 243 | + #[rstest] |
| 244 | + fn all_traits(hir: Hir) { |
| 245 | + assert_eq!(Query::traits().query(&hir).count(), 4); |
| 246 | + } |
256 | 247 |
|
257 | | - #[rstest] |
258 | | - fn single_method_traits(hir: Hir) { |
259 | | - assert_eq!( |
260 | | - Query::traits() |
261 | | - .methods([SignatureFilter::new()]) |
262 | | - .query(&hir) |
263 | | - .count(), |
264 | | - 2 |
265 | | - ); |
266 | | - } |
| 248 | + #[rstest] |
| 249 | + fn single_method_traits(hir: Hir) { |
| 250 | + assert_eq!( |
| 251 | + Query::traits() |
| 252 | + .methods([SignatureFilter::new()]) |
| 253 | + .query(&hir) |
| 254 | + .count(), |
| 255 | + 2 |
| 256 | + ); |
| 257 | + } |
267 | 258 |
|
268 | | - #[rstest] |
269 | | - fn single_method_traits_returning_ty(hir: Hir) { |
270 | | - assert_eq!( |
271 | | - Query::traits() |
272 | | - .methods([SignatureFilter::new().return_ty(TypeId::from_id(0))]) |
273 | | - .query(&hir) |
274 | | - .count(), |
275 | | - 2 |
276 | | - ); |
277 | | - } |
| 259 | + #[rstest] |
| 260 | + fn single_method_traits_returning_ty(hir: Hir) { |
| 261 | + assert_eq!( |
| 262 | + Query::traits() |
| 263 | + .methods([SignatureFilter::new().return_ty(TypeId::from_id(0))]) |
| 264 | + .query(&hir) |
| 265 | + .count(), |
| 266 | + 2 |
| 267 | + ); |
| 268 | + } |
278 | 269 |
|
279 | | - #[rstest] |
280 | | - fn single_method_trait_no_parameters_returning_ty(hir: Hir) { |
281 | | - assert_eq!( |
282 | | - Query::traits() |
283 | | - .methods([SignatureFilter::new() |
284 | | - .parameters([]) |
285 | | - .return_ty(TypeId::from_id(0))]) |
286 | | - .query(&hir) |
287 | | - .count(), |
288 | | - 1 |
289 | | - ); |
290 | | - } |
| 270 | + #[rstest] |
| 271 | + fn single_method_trait_no_parameters_returning_ty(hir: Hir) { |
| 272 | + assert_eq!( |
| 273 | + Query::traits() |
| 274 | + .methods([SignatureFilter::new() |
| 275 | + .parameters([]) |
| 276 | + .return_ty(TypeId::from_id(0))]) |
| 277 | + .query(&hir) |
| 278 | + .count(), |
| 279 | + 1 |
| 280 | + ); |
| 281 | + } |
291 | 282 |
|
292 | | - #[rstest] |
293 | | - fn single_method_trait_with_parameters(hir: Hir) { |
294 | | - assert_eq!( |
295 | | - Query::traits() |
296 | | - .methods([SignatureFilter::new().parameters([ |
297 | | - MaybeSelfType::SelfType, |
298 | | - MaybeSelfType::Type(TypeId::from_id(0)) |
299 | | - ])]) |
300 | | - .query(&hir) |
301 | | - .count(), |
302 | | - 1 |
303 | | - ); |
304 | | - } |
| 283 | + #[rstest] |
| 284 | + fn single_method_trait_with_parameters(hir: Hir) { |
| 285 | + assert_eq!( |
| 286 | + Query::traits() |
| 287 | + .methods([SignatureFilter::new().parameters([ |
| 288 | + MaybeSelfType::SelfType, |
| 289 | + MaybeSelfType::Type(TypeId::from_id(0)) |
| 290 | + ])]) |
| 291 | + .query(&hir) |
| 292 | + .count(), |
| 293 | + 1 |
| 294 | + ); |
| 295 | + } |
| 296 | + |
| 297 | + #[rstest] |
| 298 | + fn multiple_method_trait(hir: Hir) { |
| 299 | + assert_eq!( |
| 300 | + Query::traits() |
| 301 | + .methods([SignatureFilter::new(), SignatureFilter::new()]) |
| 302 | + .query(&hir) |
| 303 | + .count(), |
| 304 | + 1 |
| 305 | + ); |
| 306 | + } |
305 | 307 |
|
306 | | - #[rstest] |
307 | | - fn multiple_method_trait(hir: Hir) { |
308 | | - assert_eq!( |
309 | | - Query::traits() |
310 | | - .methods([SignatureFilter::new(), SignatureFilter::new()]) |
311 | | - .query(&hir) |
312 | | - .count(), |
313 | | - 1 |
314 | | - ); |
| 308 | + #[rstest] |
| 309 | + fn signature_filter_parameter_match() { |
| 310 | + let filter = SignatureFilter::new().parameters([TypeId::from_id(0).into()]); |
| 311 | + assert!(filter.validate(&FunctionSignature { |
| 312 | + parameters: vec![(IdentifierBindingId::from_id(0), TypeId::from_id(0).into())], |
| 313 | + return_ty: TypeId::from_id(0).into(), |
| 314 | + })); |
| 315 | + } |
| 316 | + |
| 317 | + #[rstest] |
| 318 | + fn signature_filter_parameter_mismatch() { |
| 319 | + let filter = SignatureFilter::new().parameters([TypeId::from_id(0).into()]); |
| 320 | + assert!(!filter.validate(&FunctionSignature { |
| 321 | + parameters: vec![(IdentifierBindingId::from_id(0), TypeId::from_id(1).into())], |
| 322 | + return_ty: TypeId::from_id(0).into(), |
| 323 | + })); |
| 324 | + } |
315 | 325 | } |
316 | 326 | } |
0 commit comments