use crate::clauses::ClauseBuilder; use crate::rust_ir::WellKnownTrait; use crate::{Interner, RustIrDatabase, TraitRef}; use chalk_ir::{Floundered, Substitution, Ty, TyKind}; /// Add implicit impl for the `Tuple` trait for all tuples pub fn add_tuple_program_clauses( db: &dyn RustIrDatabase, builder: &mut ClauseBuilder<'_, I>, self_ty: Ty, ) -> Result<(), Floundered> { let interner = db.interner(); match self_ty.kind(interner) { TyKind::Tuple(..) => { let trait_id = db.well_known_trait_id(WellKnownTrait::Tuple).unwrap(); builder.push_fact(TraitRef { trait_id, substitution: Substitution::from1(interner, self_ty), }); Ok(()) } // Tuple trait is non-enumerable TyKind::InferenceVar(..) | TyKind::BoundVar(_) | TyKind::Alias(..) => Err(Floundered), _ => Ok(()), } }