Skip to content

Commit eaa03ef

Browse files
committed
Some more TyBuilder use
1 parent 5d2b488 commit eaa03ef

File tree

2 files changed

+25
-33
lines changed

2 files changed

+25
-33
lines changed

crates/hir_ty/src/infer/expr.rs

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ use crate::{
1919
lower::lower_to_chalk_mutability,
2020
method_resolution, op,
2121
primitive::{self, UintTy},
22-
to_assoc_type_id, to_chalk_trait_id,
22+
to_chalk_trait_id,
2323
traits::{chalk::from_chalk, FnTrait, InEnvironment},
2424
utils::{generics, variant_data, Generics},
25-
AdtId, Binders, CallableDefId, DomainGoal, FnPointer, FnSig, Interner, Rawness, Scalar,
26-
Substitution, TraitRef, Ty, TyBuilder, TyKind,
25+
AdtId, Binders, CallableDefId, FnPointer, FnSig, Interner, Rawness, Scalar, Substitution,
26+
TraitRef, Ty, TyBuilder, TyKind,
2727
};
2828

2929
use super::{
@@ -73,38 +73,34 @@ impl<'a> InferenceContext<'a> {
7373
let fn_once_trait = FnTrait::FnOnce.get_id(self.db, krate)?;
7474
let output_assoc_type =
7575
self.db.trait_data(fn_once_trait).associated_type_by_name(&name![Output])?;
76-
let generic_params = generics(self.db.upcast(), fn_once_trait.into());
77-
if generic_params.len() != 2 {
78-
return None;
79-
}
8076

81-
let mut param_builder = Substitution::builder(num_args);
8277
let mut arg_tys = vec![];
83-
for _ in 0..num_args {
84-
let arg = self.table.new_type_var();
85-
param_builder = param_builder.push(arg.clone());
86-
arg_tys.push(arg);
87-
}
88-
let parameters = param_builder.build();
78+
let parameters = Substitution::builder(num_args)
79+
.fill(repeat_with(|| {
80+
let arg = self.table.new_type_var();
81+
arg_tys.push(arg.clone());
82+
arg
83+
}))
84+
.build();
8985
let arg_ty = TyKind::Tuple(num_args, parameters).intern(&Interner);
90-
let substs =
91-
Substitution::build_for_generics(&generic_params).push(ty.clone()).push(arg_ty).build();
86+
87+
let projection = {
88+
let b = TyBuilder::assoc_type_projection(self.db, output_assoc_type);
89+
if b.remaining() != 2 {
90+
return None;
91+
}
92+
b.push(ty.clone()).push(arg_ty).build()
93+
};
9294

9395
let trait_env = self.trait_env.env.clone();
94-
let implements_fn_trait: DomainGoal =
95-
TraitRef { trait_id: to_chalk_trait_id(fn_once_trait), substitution: substs.clone() }
96-
.cast(&Interner);
97-
let goal = self.canonicalizer().canonicalize_obligation(InEnvironment {
98-
goal: implements_fn_trait.clone(),
96+
let obligation = InEnvironment {
97+
goal: projection.trait_ref(self.db).cast(&Interner),
9998
environment: trait_env,
100-
});
101-
if self.db.trait_solve(krate, goal.value).is_some() {
102-
self.push_obligation(implements_fn_trait);
103-
let output_proj_ty = crate::ProjectionTy {
104-
associated_ty_id: to_assoc_type_id(output_assoc_type),
105-
substitution: substs,
106-
};
107-
let return_ty = self.normalize_projection_ty(output_proj_ty);
99+
};
100+
let canonical = self.canonicalizer().canonicalize_obligation(obligation.clone());
101+
if self.db.trait_solve(krate, canonical.value).is_some() {
102+
self.push_obligation(obligation.goal);
103+
let return_ty = self.normalize_projection_ty(projection);
108104
Some((arg_tys, return_ty))
109105
} else {
110106
None

crates/hir_ty/src/lib.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,10 +493,6 @@ impl Substitution {
493493
)
494494
}
495495

496-
pub(crate) fn build_for_generics(generic_params: &Generics) -> SubstsBuilder {
497-
Substitution::builder(generic_params.len())
498-
}
499-
500496
fn builder(param_count: usize) -> SubstsBuilder {
501497
SubstsBuilder { vec: Vec::with_capacity(param_count), param_count }
502498
}

0 commit comments

Comments
 (0)