Skip to content

Commit 9786367

Browse files
committed
Elaborate AliasEq goals
1 parent 027c4fd commit 9786367

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

chalk-solve/src/clauses/env_elaborator.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use super::program_clauses::ToProgramClauses;
22
use crate::clauses::builder::ClauseBuilder;
33
use crate::clauses::{match_alias_ty, match_type_name};
4+
use crate::AliasEq;
45
use crate::DomainGoal;
56
use crate::FromEnv;
67
use crate::ProgramClause;
78
use crate::RustIrDatabase;
89
use crate::Ty;
10+
use crate::WhereClause;
911
use crate::{debug_span, TyData};
1012
use chalk_ir::interner::Interner;
1113
use chalk_ir::visit::{Visit, Visitor};
@@ -83,25 +85,32 @@ impl<'me, I: Interner> Visitor<'me, I> for EnvElaborator<'me, I> {
8385
}
8486

8587
fn visit_domain_goal(&mut self, domain_goal: &DomainGoal<I>, outer_binder: DebruijnIndex) {
86-
if let DomainGoal::FromEnv(from_env) = domain_goal {
87-
debug_span!("visit_domain_goal", ?from_env);
88-
match from_env {
89-
FromEnv::Trait(trait_ref) => {
90-
let trait_datum = self.db.trait_datum(trait_ref.trait_id);
88+
match domain_goal {
89+
DomainGoal::FromEnv(from_env) => {
90+
debug_span!("visit_domain_goal", ?from_env);
91+
match from_env {
92+
FromEnv::Trait(trait_ref) => {
93+
let trait_datum = self.db.trait_datum(trait_ref.trait_id);
9194

92-
trait_datum.to_program_clauses(&mut self.builder, self.environment);
95+
trait_datum.to_program_clauses(&mut self.builder, self.environment);
9396

94-
// If we know that `T: Iterator`, then we also know
95-
// things about `<T as Iterator>::Item`, so push those
96-
// implied bounds too:
97-
for &associated_ty_id in &trait_datum.associated_ty_ids {
98-
self.db
99-
.associated_ty_data(associated_ty_id)
100-
.to_program_clauses(&mut self.builder, self.environment);
97+
// If we know that `T: Iterator`, then we also know
98+
// things about `<T as Iterator>::Item`, so push those
99+
// implied bounds too:
100+
for &associated_ty_id in &trait_datum.associated_ty_ids {
101+
self.db
102+
.associated_ty_data(associated_ty_id)
103+
.to_program_clauses(&mut self.builder, self.environment);
104+
}
101105
}
106+
FromEnv::Ty(ty) => ty.visit_with(self, outer_binder),
102107
}
103-
FromEnv::Ty(ty) => ty.visit_with(self, outer_binder),
104108
}
109+
DomainGoal::Holds(WhereClause::AliasEq(AliasEq { alias, ty })) => {
110+
match_alias_ty(&mut self.builder, self.environment, alias);
111+
ty.visit_with(self, outer_binder);
112+
}
113+
_ => {}
105114
}
106115
}
107116
}

0 commit comments

Comments
 (0)