Skip to content

Commit 2099cb1

Browse files
committed
thread impl ToWcs and not &[WhereClause]
this will let us add other things that are not syntactically valid where clauses
1 parent d3ac315 commit 2099cb1

File tree

3 files changed

+53
-33
lines changed

3 files changed

+53
-33
lines changed

crates/formality-check/src/fns.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
use formality_prove::Env;
2-
use formality_rust::grammar::{Fn, FnBoundData, WhereClause};
3-
use formality_types::{cast::Upcast, grammar::Fallible};
2+
use formality_rust::{
3+
grammar::{Fn, FnBoundData},
4+
prove::ToWcs,
5+
};
6+
use formality_types::{
7+
grammar::{Fallible, Wcs},
8+
};
49

510
use crate::Check;
611

712
impl Check<'_> {
8-
pub(crate) fn check_free_fn(&self, _f: &Fn) -> Fallible<()> {
9-
todo!()
13+
pub(crate) fn check_free_fn(&self, f: &Fn) -> Fallible<()> {
14+
self.check_fn(&Env::default(), Wcs::t(), f)
1015
}
1116

1217
pub(crate) fn check_fn(
1318
&self,
1419
in_env: &Env,
15-
in_assumptions: &[WhereClause],
20+
in_assumptions: impl ToWcs,
1621
f: &Fn,
1722
) -> Fallible<()> {
23+
let in_assumptions = in_assumptions.to_wcs();
24+
assert!(in_env.only_universal_variables() && in_env.encloses((&in_assumptions, f)));
25+
1826
let mut env = in_env.clone();
1927

2028
let Fn { id: _, binder } = f;
@@ -26,15 +34,15 @@ impl Check<'_> {
2634
body: _,
2735
} = env.instantiate_universally(binder);
2836

29-
let assumptions: Vec<WhereClause> = (in_assumptions, &where_clauses).upcast();
37+
let fn_assumptions: Wcs = (in_assumptions, &where_clauses).to_wcs();
3038

31-
self.prove_where_clauses_well_formed(&env, &assumptions, &where_clauses)?;
39+
self.prove_where_clauses_well_formed(&env, &fn_assumptions, &where_clauses)?;
3240

3341
for input_ty in &input_tys {
34-
self.prove_goal(&env, &assumptions, input_ty.well_formed())?;
42+
self.prove_goal(&env, &fn_assumptions, input_ty.well_formed())?;
3543
}
3644

37-
self.prove_goal(&env, &assumptions, output_ty.well_formed())?;
45+
self.prove_goal(&env, &fn_assumptions, output_ty.well_formed())?;
3846

3947
Ok(())
4048
}

crates/formality-check/src/impls.rs

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use anyhow::bail;
2-
use contracts::requires;
2+
33
use fn_error_context::context;
44
use formality_prove::Env;
5-
use formality_rust::grammar::{
6-
AssociatedTy, AssociatedTyBoundData, AssociatedTyValue, AssociatedTyValueBoundData, Fn,
7-
FnBoundData, ImplItem, NegTraitImpl, NegTraitImplBoundData, TraitBoundData, TraitImpl,
8-
TraitImplBoundData, TraitItem, WhereClause,
5+
use formality_rust::{
6+
grammar::{
7+
AssociatedTy, AssociatedTyBoundData, AssociatedTyValue, AssociatedTyValueBoundData, Fn,
8+
FnBoundData, ImplItem, NegTraitImpl, NegTraitImplBoundData, TraitBoundData, TraitImpl,
9+
TraitImplBoundData, TraitItem,
10+
},
11+
prove::ToWcs,
912
};
1013
use formality_types::{
1114
cast::Downcasted,
1215
grammar::{Binder, Fallible, Relation, Substitution, Wcs},
1316
term::Term,
14-
visit::Visit,
1517
};
1618

1719
impl super::Check<'_> {
@@ -69,16 +71,20 @@ impl super::Check<'_> {
6971
Ok(())
7072
}
7173

72-
#[requires(assumptions.iter().all(|a| a.references_only_placeholder_variables()))]
7374
fn check_trait_impl_item(
7475
&self,
7576
env: &Env,
76-
assumptions: &[WhereClause],
77+
assumptions: impl ToWcs,
7778
trait_items: &[TraitItem],
7879
impl_item: &ImplItem,
7980
) -> Fallible<()> {
81+
let assumptions: Wcs = assumptions.to_wcs();
82+
assert!(
83+
env.only_universal_variables() && env.encloses((&assumptions, trait_items, impl_item))
84+
);
85+
8086
match impl_item {
81-
ImplItem::Fn(v) => self.check_fn_in_impl(env, assumptions, trait_items, v),
87+
ImplItem::Fn(v) => self.check_fn_in_impl(env, &assumptions, trait_items, v),
8288
ImplItem::AssociatedTyValue(v) => {
8389
self.check_associated_ty_value(env, assumptions, trait_items, v)
8490
}
@@ -88,12 +94,13 @@ impl super::Check<'_> {
8894
fn check_fn_in_impl(
8995
&self,
9096
env: &Env,
91-
impl_assumptions: &[WhereClause],
97+
impl_assumptions: impl ToWcs,
9298
trait_items: &[TraitItem],
9399
ii_fn: &Fn,
94100
) -> Fallible<()> {
101+
let impl_assumptions: Wcs = impl_assumptions.to_wcs();
95102
assert!(
96-
env.only_universal_variables() && env.encloses((impl_assumptions, trait_items, ii_fn))
103+
env.only_universal_variables() && env.encloses((&impl_assumptions, trait_items, ii_fn))
97104
);
98105

99106
// Find the corresponding function from the trait:
@@ -108,7 +115,7 @@ impl super::Check<'_> {
108115

109116
tracing::debug!(?ti_fn);
110117

111-
self.check_fn(env, impl_assumptions, ii_fn)?;
118+
self.check_fn(env, &impl_assumptions, ii_fn)?;
112119

113120
let mut env = env.clone();
114121
let (
@@ -128,7 +135,7 @@ impl super::Check<'_> {
128135

129136
self.prove_goal(
130137
&env,
131-
(impl_assumptions, &ti_where_clauses),
138+
(&impl_assumptions, &ti_where_clauses),
132139
&ii_where_clauses,
133140
)?;
134141

@@ -143,14 +150,14 @@ impl super::Check<'_> {
143150
for (ii_input_ty, ti_input_ty) in ii_input_tys.iter().zip(&ti_input_tys) {
144151
self.prove_goal(
145152
&env,
146-
(impl_assumptions, &ii_where_clauses),
153+
(&impl_assumptions, &ii_where_clauses),
147154
Relation::sub(ti_input_ty, ii_input_ty),
148155
)?;
149156
}
150157

151158
self.prove_goal(
152159
&env,
153-
(impl_assumptions, &ii_where_clauses),
160+
(&impl_assumptions, &ii_where_clauses),
154161
Relation::sub(ii_output_ty, ti_output_ty),
155162
)?;
156163

@@ -161,10 +168,17 @@ impl super::Check<'_> {
161168
fn check_associated_ty_value(
162169
&self,
163170
impl_env: &Env,
164-
impl_assumptions: &[WhereClause],
171+
impl_assumptions: impl ToWcs,
165172
trait_items: &[TraitItem],
166173
impl_value: &AssociatedTyValue,
167174
) -> Fallible<()> {
175+
let impl_assumptions: Wcs = impl_assumptions.to_wcs();
176+
177+
assert!(
178+
impl_env.only_universal_variables()
179+
&& impl_env.encloses((&impl_assumptions, trait_items, impl_value))
180+
);
181+
168182
let AssociatedTyValue { id, binder } = impl_value;
169183

170184
let trait_associated_ty = match trait_items
@@ -191,24 +205,24 @@ impl super::Check<'_> {
191205

192206
self.prove_where_clauses_well_formed(
193207
&env,
194-
(impl_assumptions, &ii_where_clauses),
208+
(&impl_assumptions, &ii_where_clauses),
195209
&ii_where_clauses,
196210
)?;
197211

198212
self.prove_goal(
199213
&env,
200-
(impl_assumptions, &ti_where_clauses),
214+
(&impl_assumptions, &ti_where_clauses),
201215
&ii_where_clauses,
202216
)?;
203217

204218
self.prove_goal(
205219
&env,
206-
(impl_assumptions, &ii_where_clauses),
220+
(&impl_assumptions, &ii_where_clauses),
207221
ii_ty.well_formed(),
208222
)?;
209223

210224
let ensures: Wcs = ti_ensures.iter().map(|e| e.to_wc(&ii_ty)).collect();
211-
self.prove_goal(&env, (impl_assumptions, &ii_where_clauses), ensures)?;
225+
self.prove_goal(&env, (&impl_assumptions, &ii_where_clauses), ensures)?;
212226

213227
Ok(())
214228
}

crates/formality-check/src/where_clauses.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ impl super::Check<'_> {
1212
pub(crate) fn prove_where_clauses_well_formed(
1313
&self,
1414
env: &Env,
15-
assumptions: impl Upcast<Vec<WhereClause>>,
15+
assumptions: impl ToWcs,
1616
where_clauses: &[WhereClause],
1717
) -> Fallible<()> {
18-
let assumptions: Vec<WhereClause> = assumptions.upcast();
1918
for where_clause in where_clauses {
2019
self.prove_where_clause_well_formed(env, &assumptions, where_clause)?;
2120
}
@@ -25,10 +24,9 @@ impl super::Check<'_> {
2524
fn prove_where_clause_well_formed(
2625
&self,
2726
in_env: &Env,
28-
assumptions: impl Upcast<Vec<WhereClause>>,
27+
assumptions: impl ToWcs,
2928
where_clause: &WhereClause,
3029
) -> Fallible<()> {
31-
let assumptions: Vec<WhereClause> = assumptions.upcast();
3230
match where_clause.data() {
3331
WhereClauseData::IsImplemented(self_ty, trait_id, parameters) => self
3432
.prove_trait_ref_well_formed(

0 commit comments

Comments
 (0)