Skip to content

Commit c0e0691

Browse files
authored
Merge pull request #145 from jackh726/alias-eq-predicate
(Mostly) add AliasEq and start porting chalk projection tests
2 parents 557f5f3 + b823f81 commit c0e0691

File tree

13 files changed

+428
-60
lines changed

13 files changed

+428
-60
lines changed

crates/formality-check/src/where_clauses.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ impl super::Check<'_> {
3737
assumptions,
3838
trait_id.with(self_ty, parameters),
3939
),
40+
WhereClauseData::AliasEq(alias_ty, ty) => {
41+
self.prove_parameter_well_formed(in_env, &assumptions, alias_ty)?;
42+
self.prove_parameter_well_formed(in_env, &assumptions, ty)
43+
}
4044
WhereClauseData::Outlives(a, b) => {
4145
self.prove_parameter_well_formed(in_env, &assumptions, a)?;
4246
self.prove_parameter_well_formed(in_env, assumptions, b)

crates/formality-prove/src/prove/prove_wc.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ judgment_fn! {
7878
(prove_wc(decls, env, assumptions, Predicate::NotImplemented(trait_ref)) => c.pop_subst(&subst))
7979
)
8080

81+
(
82+
(prove_eq(decls, env, assumptions, alias_ty, ty) => c)
83+
----------------------------- ("alias eq")
84+
(prove_wc(decls, env, assumptions, Predicate::AliasEq(alias_ty, ty)) => c)
85+
)
86+
8187
(
8288
(decls.trait_invariants() => ti)
8389
(let (env, subst) = env.existential_substitution(&ti.binder))

crates/formality-prove/src/prove/prove_wf.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use formality_types::{
2-
grammar::{ConstData, Parameter, RigidName, RigidTy, UniversalVar, Wcs},
3-
judgment_fn,
2+
grammar::{ConstData, Parameter, RigidName, RigidTy, UniversalVar, Wcs, AliasTy, Parameters, AliasName},
3+
judgment_fn, collections::Set,
44
};
55

66
use crate::{decls::Decls, prove::combinators::for_all};
@@ -39,10 +39,33 @@ judgment_fn! {
3939
(prove_wf(decls, env, assumptions, RigidTy { name: RigidName::ScalarId(_), parameters }) => c)
4040
)
4141

42+
(
43+
(for_all(&decls, &env, &assumptions, &parameters, &prove_wf) => c)
44+
--- ("ADT")
45+
(prove_wf(decls, env, assumptions, RigidTy { name: RigidName::AdtId(_), parameters }) => c)
46+
)
47+
4248
(
4349
(prove_wf(&decls, &env, &assumptions, ty) => c)
4450
--- ("rigid constants")
4551
(prove_wf(decls, env, assumptions, ConstData::Value(_, ty)) => c)
4652
)
53+
54+
(
55+
(prove_alias_wf(&decls, &env, &assumptions, name, parameters) => c)
56+
--- ("aliases")
57+
(prove_wf(decls, env, assumptions, AliasTy { name, parameters }) => c)
58+
)
4759
}
4860
}
61+
62+
pub fn prove_alias_wf(
63+
decls: &Decls,
64+
env: &Env,
65+
assumptions: &Wcs,
66+
_name: AliasName,
67+
parameters: Parameters,
68+
) -> Set<Constraints> {
69+
// FIXME: verify self type implements trait
70+
for_all(decls, env, assumptions, &parameters, &prove_wf)
71+
}

crates/formality-rust/src/grammar.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use formality_types::{
55
cast::Upcast,
66
grammar::{
77
AdtId, AssociatedItemId, Binder, Const, CrateId, Fallible, FieldId, FnId, Lt, Parameter,
8-
TraitId, TraitRef, Ty, Wc,
8+
TraitId, TraitRef, Ty, Wc, AliasTy,
99
},
1010
term::Term,
1111
};
@@ -325,6 +325,7 @@ impl WhereClause {
325325
.not_implemented()
326326
.upcast(),
327327
),
328+
WhereClauseData::AliasEq(_, _) => None,
328329
WhereClauseData::Outlives(_, _) => None,
329330
WhereClauseData::ForAll(binder) => {
330331
let (vars, where_clause) = binder.open();
@@ -341,6 +342,9 @@ pub enum WhereClauseData {
341342
#[grammar($v0 : $v1 < $,v2 >)]
342343
IsImplemented(Ty, TraitId, Vec<Parameter>),
343344

345+
#[grammar($v0 => $v1)]
346+
AliasEq(AliasTy, Ty),
347+
344348
#[grammar($v0 : $v1)]
345349
Outlives(Parameter, Lt),
346350

crates/formality-rust/src/prove.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,9 @@ impl ToWcs for WhereClause {
377377
WhereClauseData::IsImplemented(self_ty, trait_id, parameters) => {
378378
trait_id.with(self_ty, parameters).upcast()
379379
}
380+
WhereClauseData::AliasEq(alias_ty, ty) => {
381+
Predicate::AliasEq(alias_ty.clone(), ty.clone()).upcast()
382+
}
380383
WhereClauseData::Outlives(a, b) => Relation::outlives(a, b).upcast(),
381384
WhereClauseData::ForAll(binder) => {
382385
let (vars, wc) = binder.open();

crates/formality-types/src/grammar/consts.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ impl Const {
4141
}
4242
}
4343

44-
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Visit)]
44+
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Visit)]
4545
pub enum ConstData {
4646
Value(ValTree, Ty),
4747
Variable(Variable),

crates/formality-types/src/grammar/formulas.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use crate::cast::To;
44
use crate::cast::Upcast;
55
use crate::cast_impl;
66

7+
use super::AliasName;
8+
use super::AliasTy;
79
use super::Const;
810
use super::Parameter;
911
use super::Parameters;
@@ -23,6 +25,9 @@ pub enum Predicate {
2325
#[grammar(!$v0)]
2426
NotImplemented(TraitRef),
2527

28+
#[cast]
29+
AliasEq(AliasTy, Ty),
30+
2631
#[grammar(@WellFormedTraitRef($v0))]
2732
WellFormedTraitRef(TraitRef),
2833

@@ -80,6 +85,7 @@ impl Parameter {
8085
pub enum Skeleton {
8186
IsImplemented(TraitId),
8287
NotImplemented(TraitId),
88+
AliasEq(AliasName),
8389
WellFormed,
8490
WellFormedTraitRef(TraitId),
8591
IsLocal(TraitId),
@@ -110,6 +116,15 @@ impl Predicate {
110116
Skeleton::NotImplemented(trait_id.clone()),
111117
parameters.clone(),
112118
),
119+
Predicate::AliasEq(AliasTy { name, parameters }, ty) => {
120+
let mut params = parameters.clone();
121+
params.push(ty.clone().upcast());
122+
(
123+
Skeleton::AliasEq(name.clone()),
124+
params,
125+
)
126+
127+
}
113128
Predicate::WellFormedTraitRef(TraitRef {
114129
trait_id,
115130
parameters,

fixme_tests/basic--where-clauses.rs

Lines changed: 0 additions & 51 deletions
This file was deleted.

src/lib.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ pub fn test_program_ok(input: &str) -> anyhow::Result<()> {
4545
}
4646

4747
pub fn test_where_clause(program: &str, assertion: &str) -> anyhow::Result<Set<Constraints>> {
48-
let program: Program = try_term(program)?;
49-
check_all_crates(&program)?;
50-
let assertion: Arc<TestAssertion> = try_term(assertion)?;
51-
let decls = program.to_prove_decls();
52-
Ok(formality_prove::test_util::test_prove(decls, assertion))
48+
formality_core::with_tracing_logs(|| {
49+
let program: Program = try_term(program)?;
50+
check_all_crates(&program)?;
51+
let assertion: Arc<TestAssertion> = try_term(assertion)?;
52+
let decls = program.to_prove_decls();
53+
Ok(formality_prove::test_util::test_prove(decls, assertion))
54+
})
5355
}

0 commit comments

Comments
 (0)