blob: a624478275948fc131635cf60646f63070b1433e [file] [log] [blame]
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<I: Interner>(
db: &dyn RustIrDatabase<I>,
builder: &mut ClauseBuilder<'_, I>,
self_ty: Ty<I>,
) -> 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(()),
}
}