]>
Commit | Line | Data |
---|---|---|
487cf647 FG |
1 | use crate::clauses::ClauseBuilder; |
2 | use crate::rust_ir::WellKnownTrait; | |
3 | use crate::{Interner, RustIrDatabase, TraitRef}; | |
4 | use chalk_ir::{Floundered, Substitution, Ty, TyKind}; | |
5 | ||
6 | /// Add implicit impl for the `Tuple` trait for all tuples | |
7 | pub fn add_tuple_program_clauses<I: Interner>( | |
8 | db: &dyn RustIrDatabase<I>, | |
9 | builder: &mut ClauseBuilder<'_, I>, | |
10 | self_ty: Ty<I>, | |
11 | ) -> Result<(), Floundered> { | |
12 | let interner = db.interner(); | |
13 | ||
14 | match self_ty.kind(interner) { | |
15 | TyKind::Tuple(..) => { | |
16 | let trait_id = db.well_known_trait_id(WellKnownTrait::Tuple).unwrap(); | |
17 | ||
18 | builder.push_fact(TraitRef { | |
19 | trait_id, | |
20 | substitution: Substitution::from1(interner, self_ty), | |
21 | }); | |
22 | ||
23 | Ok(()) | |
24 | } | |
25 | ||
26 | // Tuple trait is non-enumerable | |
27 | TyKind::InferenceVar(..) | TyKind::BoundVar(_) | TyKind::Alias(..) => Err(Floundered), | |
28 | _ => Ok(()), | |
29 | } | |
30 | } |