Skip to content

Commit 38f6cdb

Browse files
committed
Make get_fn_trait a method of FnTrait
1 parent cf870af commit 38f6cdb

File tree

3 files changed

+21
-21
lines changed

3 files changed

+21
-21
lines changed

crates/ra_hir_ty/src/infer/expr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use ra_syntax::ast::RangeOp;
1515

1616
use crate::{
1717
autoderef, method_resolution, op,
18-
traits::{builtin::get_fn_trait, FnTrait, InEnvironment, SolutionVariables},
18+
traits::{FnTrait, InEnvironment, SolutionVariables},
1919
utils::{generics, variant_data, Generics},
2020
ApplicationTy, Binders, CallableDef, FnSig, InferTy, IntTy, Mutability, Obligation, Rawness,
2121
Substs, TraitRef, Ty, TypeCtor,
@@ -67,7 +67,7 @@ impl<'a> InferenceContext<'a> {
6767
if let Some(krate) = self.resolver.krate() {
6868
let fn_traits: Vec<crate::TraitId> = [FnTrait::FnOnce, FnTrait::FnMut, FnTrait::Fn]
6969
.iter()
70-
.filter_map(|f| get_fn_trait(self.db, krate, *f))
70+
.filter_map(|f| f.get_id(self.db, krate))
7171
.collect();
7272
for fn_trait in fn_traits {
7373
let fn_trait_data = self.db.trait_data(fn_trait);

crates/ra_hir_ty/src/traits.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
use std::{panic, sync::Arc};
33

44
use chalk_ir::cast::Cast;
5-
use hir_def::{expr::ExprId, DefWithBodyId, ImplId, TraitId, TypeAliasId};
5+
use hir_def::{
6+
expr::ExprId, lang_item::LangItemTarget, DefWithBodyId, ImplId, TraitId, TypeAliasId,
7+
};
68
use ra_db::{impl_intern_key, salsa, CrateId};
79
use ra_prof::profile;
810
use rustc_hash::FxHashSet;
@@ -14,7 +16,7 @@ use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty,
1416
use self::chalk::{from_chalk, Interner, ToChalk};
1517

1618
pub(crate) mod chalk;
17-
pub(crate) mod builtin;
19+
mod builtin;
1820

1921
// This controls the maximum size of types Chalk considers. If we set this too
2022
// high, we can run into slow edge cases; if we set it too low, Chalk won't
@@ -298,6 +300,14 @@ impl FnTrait {
298300
FnTrait::Fn => "fn",
299301
}
300302
}
303+
304+
pub fn get_id(&self, db: &dyn HirDatabase, krate: CrateId) -> Option<TraitId> {
305+
let target = db.lang_item(krate, self.lang_item_name().into())?;
306+
match target {
307+
LangItemTarget::TraitId(t) => Some(t),
308+
_ => None,
309+
}
310+
}
301311
}
302312

303313
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]

crates/ra_hir_ty/src/traits/builtin.rs

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub(super) fn get_builtin_impls(
4040
if let Ty::Apply(ApplicationTy { ctor: TypeCtor::Closure { def, expr }, .. }) = ty {
4141
for &fn_trait in [super::FnTrait::FnOnce, super::FnTrait::FnMut, super::FnTrait::Fn].iter()
4242
{
43-
if let Some(actual_trait) = get_fn_trait(db, krate, fn_trait) {
43+
if let Some(actual_trait) = fn_trait.get_id(db, krate) {
4444
if trait_ == actual_trait {
4545
let impl_ = super::ClosureFnTraitImplData { def: *def, expr: *expr, fn_trait };
4646
if check_closure_fn_trait_impl_prerequisites(db, krate, impl_) {
@@ -128,15 +128,15 @@ fn check_closure_fn_trait_impl_prerequisites(
128128
data: super::ClosureFnTraitImplData,
129129
) -> bool {
130130
// the respective Fn/FnOnce/FnMut trait needs to exist
131-
if get_fn_trait(db, krate, data.fn_trait).is_none() {
131+
if data.fn_trait.get_id(db, krate).is_none() {
132132
return false;
133133
}
134134

135135
// FIXME: there are more assumptions that we should probably check here:
136136
// the traits having no type params, FnOnce being a supertrait
137137

138138
// the FnOnce trait needs to exist and have an assoc type named Output
139-
let fn_once_trait = match get_fn_trait(db, krate, super::FnTrait::FnOnce) {
139+
let fn_once_trait = match (super::FnTrait::FnOnce).get_id(db, krate) {
140140
Some(t) => t,
141141
None => return false,
142142
};
@@ -151,7 +151,9 @@ fn closure_fn_trait_impl_datum(
151151
// for some closure |X, Y| -> Z:
152152
// impl<T, U, V> Fn<(T, U)> for closure<fn(T, U) -> V> { Output = V }
153153

154-
let trait_ = get_fn_trait(db, krate, data.fn_trait) // get corresponding fn trait
154+
let trait_ = data
155+
.fn_trait
156+
.get_id(db, krate) // get corresponding fn trait
155157
// the existence of the Fn trait has been checked before
156158
.expect("fn trait for closure impl missing");
157159

@@ -211,7 +213,7 @@ fn closure_fn_trait_output_assoc_ty_value(
211213
let output_ty = Ty::Bound(BoundVar::new(DebruijnIndex::INNERMOST, num_args.into()));
212214

213215
let fn_once_trait =
214-
get_fn_trait(db, krate, super::FnTrait::FnOnce).expect("assoc ty value should not exist");
216+
(super::FnTrait::FnOnce).get_id(db, krate).expect("assoc ty value should not exist");
215217

216218
let output_ty_id = db
217219
.trait_data(fn_once_trait)
@@ -360,18 +362,6 @@ fn super_trait_object_unsize_impl_datum(
360362
BuiltinImplData { num_vars, trait_ref, where_clauses: Vec::new(), assoc_ty_values: Vec::new() }
361363
}
362364

363-
pub fn get_fn_trait(
364-
db: &dyn HirDatabase,
365-
krate: CrateId,
366-
fn_trait: super::FnTrait,
367-
) -> Option<TraitId> {
368-
let target = db.lang_item(krate, fn_trait.lang_item_name().into())?;
369-
match target {
370-
LangItemTarget::TraitId(t) => Some(t),
371-
_ => None,
372-
}
373-
}
374-
375365
fn get_unsize_trait(db: &dyn HirDatabase, krate: CrateId) -> Option<TraitId> {
376366
let target = db.lang_item(krate, "unsize".into())?;
377367
match target {

0 commit comments

Comments
 (0)