Skip to content

Commit 7450314

Browse files
committed
Refactor & cleanup
1 parent 5778c3a commit 7450314

File tree

4 files changed

+33
-94
lines changed

4 files changed

+33
-94
lines changed

crates/hir-ty/src/infer.rs

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,13 @@ pub(crate) fn infer_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<Infer
6363
let body = db.body(def);
6464
let mut ctx = InferenceContext::new(db, def, &body, resolver);
6565

66-
crate::tls::set_current_program(db, || {
67-
match def {
68-
DefWithBodyId::ConstId(c) => ctx.collect_const(&db.const_data(c)),
69-
DefWithBodyId::FunctionId(f) => {
70-
eprintln!();
71-
ctx.collect_fn(f);
72-
}
73-
DefWithBodyId::StaticId(s) => ctx.collect_static(&db.static_data(s)),
74-
}
66+
match def {
67+
DefWithBodyId::ConstId(c) => ctx.collect_const(&db.const_data(c)),
68+
DefWithBodyId::FunctionId(f) => ctx.collect_fn(f),
69+
DefWithBodyId::StaticId(s) => ctx.collect_static(&db.static_data(s)),
70+
}
7571

76-
ctx.infer_body();
77-
});
72+
ctx.infer_body();
7873

7974
Arc::new(ctx.resolve_all())
8075
}
@@ -481,46 +476,41 @@ impl<'a> InferenceContext<'a> {
481476
} else {
482477
&*data.ret_type
483478
};
484-
// let return_ty = dbg!(self.make_ty_with_mode(return_ty, ImplTraitLoweringMode::Disallowed)); // FIXME implement RPIT
485479
let return_ty = self.make_ty_with_mode(return_ty, ImplTraitLoweringMode::Opaque);
486480
self.return_ty = return_ty;
487481

488-
if let Some(rpits) = dbg!(self.db.return_type_impl_traits(func)) {
489-
let mut rpit_vars = Vec::new();
482+
if let Some(rpits) = self.db.return_type_impl_traits(func) {
490483
// RPIT opaque types use substitution of their parent function.
491-
let fn_placeholders = dbg!(TyBuilder::placeholder_subst(self.db, func));
492-
let rpits = dbg!((&*rpits).clone().substitute(Interner, &fn_placeholders));
493-
for rpit in rpits.impl_traits {
494-
let var = self.table.new_type_var();
495-
rpit_vars.push(var.clone());
496-
let self_var = Substitution::from1(Interner, var);
497-
for predicate in dbg!(rpit.bounds.substitute(Interner, &self_var)) {
498-
let (predicate, binders) = predicate.into_value_and_skipped_binders();
499-
always!(binders.len(Interner) == 0); // quantified where clauses not yet handled
500-
self.push_obligation(predicate.cast(Interner));
501-
}
502-
}
503-
484+
let fn_placeholders = TyBuilder::placeholder_subst(self.db, func);
504485
self.return_ty = fold_tys(
505-
dbg!(self.return_ty.clone()),
506-
|ty, _outer_binder| match *ty.kind(Interner) {
507-
TyKind::OpaqueType(opaque_ty_id, _) => {
508-
let impl_trait_id =
509-
self.db.lookup_intern_impl_trait_id(opaque_ty_id.into());
510-
match impl_trait_id {
511-
ImplTraitId::ReturnTypeImplTrait(_, idx) => {
512-
rpit_vars[idx as usize].clone()
513-
}
514-
_ => unreachable!(),
515-
}
486+
self.return_ty.clone(),
487+
|ty, _| {
488+
let opaque_ty_id = match ty.kind(Interner) {
489+
TyKind::OpaqueType(opaque_ty_id, _) => *opaque_ty_id,
490+
_ => return ty,
491+
};
492+
let idx = match self.db.lookup_intern_impl_trait_id(opaque_ty_id.into()) {
493+
ImplTraitId::ReturnTypeImplTrait(_, idx) => idx,
494+
_ => unreachable!(),
495+
};
496+
let bounds = (*rpits).map_ref(|rpits| {
497+
rpits.impl_traits[idx as usize].bounds.map_ref(|it| it.into_iter())
498+
});
499+
let var = self.table.new_type_var();
500+
let self_var = Substitution::from1(Interner, var.clone());
501+
for bound in bounds {
502+
let predicate =
503+
bound.map(|it| it.cloned()).substitute(Interner, &fn_placeholders);
504+
let (var_predicate, binders) = predicate
505+
.substitute(Interner, &self_var)
506+
.into_value_and_skipped_binders();
507+
always!(binders.len(Interner) == 0); // quantified where clauses not yet handled
508+
self.push_obligation(var_predicate.cast(Interner));
516509
}
517-
_ => ty,
510+
var
518511
},
519512
DebruijnIndex::INNERMOST,
520513
);
521-
dbg!(&self.return_ty);
522-
dbg!(&self.table);
523-
compile_error!("skip ci build");
524514
}
525515
}
526516

crates/hir-ty/src/infer/unify.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -623,10 +623,7 @@ impl<'a> InferenceTable<'a> {
623623

624624
impl<'a> fmt::Debug for InferenceTable<'a> {
625625
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
626-
f.debug_struct("InferenceTable")
627-
.field("num_vars", &self.type_variable_table.len())
628-
.field("pending_obligations", &self.pending_obligations)
629-
.finish()
626+
f.debug_struct("InferenceTable").field("num_vars", &self.type_variable_table.len()).finish()
630627
}
631628
}
632629

crates/hir-ty/src/lib.rs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -522,27 +522,3 @@ where
522522
});
523523
Canonical { value, binders: chalk_ir::CanonicalVarKinds::from_iter(Interner, kinds) }
524524
}
525-
526-
impl Fold<Interner> for ReturnTypeImplTrait {
527-
type Result = ReturnTypeImplTrait;
528-
529-
fn fold_with<E>(
530-
self,
531-
folder: &mut dyn chalk_ir::fold::Folder<Interner, Error = E>,
532-
outer_binder: DebruijnIndex,
533-
) -> Result<Self::Result, E> {
534-
Ok(ReturnTypeImplTrait { bounds: self.bounds.fold_with(folder, outer_binder)? })
535-
}
536-
}
537-
538-
impl Fold<Interner> for ReturnTypeImplTraits {
539-
type Result = ReturnTypeImplTraits;
540-
541-
fn fold_with<E>(
542-
self,
543-
folder: &mut dyn chalk_ir::fold::Folder<Interner, Error = E>,
544-
outer_binder: DebruijnIndex,
545-
) -> Result<Self::Result, E> {
546-
Ok(ReturnTypeImplTraits { impl_traits: self.impl_traits.fold_with(folder, outer_binder)? })
547-
}
548-
}

crates/hir-ty/src/tests/traits.rs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,30 +1281,6 @@ fn foo<const C: u8, T>() -> (impl FnOnce(&str, T), impl Trait<u8>) {
12811281
);
12821282
}
12831283

1284-
#[test]
1285-
fn playground() {
1286-
check_infer_with_mismatches(
1287-
r#"
1288-
//- minicore: fn, sized, iterator
1289-
trait Trait<T> {}
1290-
struct Bar<T>(T);
1291-
impl<T> Trait<T> for Bar<T> {}
1292-
struct Foo<F>;
1293-
impl<F> Foo<F> {
1294-
fn foo<const C: u8, T: Trait<T>, U>(t: T) -> (T, impl Fn(T), impl Trait<u8>) {
1295-
(t, |input| {}, Bar(C))
1296-
}
1297-
}
1298-
// fn bar() {
1299-
// struct Bar;
1300-
// foo::<1, Bar>(Bar);
1301-
// }
1302-
fn qwe<const C: u8, T, U>() -> impl Iterator<Item = impl Trait<u8>> {}
1303-
"#,
1304-
expect![[]],
1305-
);
1306-
}
1307-
13081284
#[test]
13091285
fn dyn_trait() {
13101286
check_infer(

0 commit comments

Comments
 (0)