Use lang-item instead of db lookup for FnTrait kind

This commit is contained in:
Shoyu Vanilla 2024-02-27 00:38:53 +09:00
parent 46cdce1b53
commit a4021f6ed5
2 changed files with 10 additions and 9 deletions

View file

@ -177,15 +177,7 @@ impl InferenceContext<'_> {
} }
fn fn_trait_kind_from_trait_id(&self, trait_id: hir_def::TraitId) -> Option<FnTrait> { fn fn_trait_kind_from_trait_id(&self, trait_id: hir_def::TraitId) -> Option<FnTrait> {
utils::fn_traits(self.db.upcast(), self.owner.module(self.db.upcast()).krate()) FnTrait::from_lang_item(self.db.lang_attr(trait_id.into())?)
.enumerate()
.find_map(|(i, t)| (t == trait_id).then_some(i))
.map(|i| match i {
0 => FnTrait::Fn,
1 => FnTrait::FnMut,
2 => FnTrait::FnOnce,
_ => unreachable!(),
})
} }
} }

View file

@ -217,6 +217,15 @@ impl FnTrait {
} }
} }
pub const fn from_lang_item(lang_item: LangItem) -> Option<Self> {
match lang_item {
LangItem::FnOnce => Some(FnTrait::FnOnce),
LangItem::FnMut => Some(FnTrait::FnMut),
LangItem::Fn => Some(FnTrait::Fn),
_ => None,
}
}
pub const fn to_chalk_ir(self) -> rust_ir::ClosureKind { pub const fn to_chalk_ir(self) -> rust_ir::ClosureKind {
match self { match self {
FnTrait::FnOnce => rust_ir::ClosureKind::FnOnce, FnTrait::FnOnce => rust_ir::ClosureKind::FnOnce,