diff options
| author | Shoyu Vanilla <modulo641@gmail.com> | 2024-02-27 00:38:53 +0900 |
|---|---|---|
| committer | Shoyu Vanilla <modulo641@gmail.com> | 2024-02-27 00:38:53 +0900 |
| commit | a4021f6ed5d807e4af98178e4cd2bcf66d8c977f (patch) | |
| tree | 947dfde8f915ec026607e081ef958c2bd365e44b | |
| parent | 46cdce1b53c84e9510728002142d4a4450967226 (diff) | |
| download | rust-a4021f6ed5d807e4af98178e4cd2bcf66d8c977f.tar.gz rust-a4021f6ed5d807e4af98178e4cd2bcf66d8c977f.zip | |
Use lang-item instead of db lookup for `FnTrait` kind
| -rw-r--r-- | crates/hir-ty/src/infer/closure.rs | 10 | ||||
| -rw-r--r-- | crates/hir-ty/src/traits.rs | 9 |
2 files changed, 10 insertions, 9 deletions
diff --git a/crates/hir-ty/src/infer/closure.rs b/crates/hir-ty/src/infer/closure.rs index 62740f354cf..32845ac2e36 100644 --- a/crates/hir-ty/src/infer/closure.rs +++ b/crates/hir-ty/src/infer/closure.rs @@ -177,15 +177,7 @@ impl InferenceContext<'_> { } 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()) - .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!(), - }) + FnTrait::from_lang_item(self.db.lang_attr(trait_id.into())?) } } diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs index b2232b920aa..8b692a1cc12 100644 --- a/crates/hir-ty/src/traits.rs +++ b/crates/hir-ty/src/traits.rs @@ -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 { match self { FnTrait::FnOnce => rust_ir::ClosureKind::FnOnce, |
