use cairo_lang_defs::ids::{ImplDefId, TraitTypeId};
use cairo_lang_diagnostics::Maybe;
use salsa::Database;
use crate::TypeId;
use crate::items::imp::ImplSemantic;
fn trait_type_implized_by_context<'db>(
db: &'db dyn Database,
trait_type_id: TraitTypeId<'db>,
impl_def_id: ImplDefId<'db>,
) -> Maybe<TypeId<'db>> {
let impl_type_def_id = db.impl_type_by_trait_type(impl_def_id, trait_type_id)?;
db.impl_type_def_resolved_type(impl_type_def_id)
}
#[salsa::tracked(cycle_result=trait_type_implized_by_context_cycle)]
fn trait_type_implized_by_context_tracked<'db>(
db: &'db dyn Database,
trait_type_id: TraitTypeId<'db>,
impl_def_id: ImplDefId<'db>,
) -> Maybe<TypeId<'db>> {
trait_type_implized_by_context(db, trait_type_id, impl_def_id)
}
fn trait_type_implized_by_context_cycle<'db>(
db: &'db dyn Database,
_id: salsa::Id,
trait_type_id: TraitTypeId<'db>,
impl_def_id: ImplDefId<'db>,
) -> Maybe<TypeId<'db>> {
trait_type_implized_by_context(db, trait_type_id, impl_def_id)
}
pub trait ImplizationSemantic<'db>: Database {
fn trait_type_implized_by_context(
&'db self,
trait_type_def_id: TraitTypeId<'db>,
impl_def_id: ImplDefId<'db>,
) -> Maybe<TypeId<'db>> {
trait_type_implized_by_context_tracked(
self.as_dyn_database(),
trait_type_def_id,
impl_def_id,
)
}
}
impl<'db, T: Database + ?Sized> ImplizationSemantic<'db> for T {}