## 2023-07-19
* Have another person on board doing some conversion work (Eric Martin)
* Making pretty good progress overall
*
## 2023-07-05
```rust
pub struct Decls {
pub max_size: usize,
pub trait_decls: Vec<TraitDecl>,
pub impl_decls: Vec<ImplDecl>,
pub neg_impl_decls: Vec<NegImplDecl>,
pub alias_eq_decls: Vec<AliasEqDecl>,
pub alias_bound_decls: Vec<AliasBoundDecl>,
pub local_trait_ids: Set<TraitId>,
pub local_adt_ids: Set<AdtId>,
}
```
We would need:
```
Ty {
RigidTy(RigidTy),
AliasTy(AliasTy),
PredicateTy(PredicateTy),
Variable(Variable),
}
TraitDecl
-> TraitId
-> Ty | Lt
-> Set(Predicate | Relation | ForAll | Implies)
-> Predicate -> (IsImplemented | NotImplemented | WellFormedTraitRef | IsLocal) + TraitRef
-> Relation -> (Equals | Sub | Outlives | WellFormed) + (Parameter(Ty | Lt), Parameter(Ty | Lt))
-> ForAll(Binder<Wc>)
-> Implies(Wcs, Wc)
ImplDecl
-> Binder(Ty|Lt)
-> TraitRef
-> Wcs
NegImplDecl
-> Binder(Ty|Lt)
-> TraitRef
-> Wcs
AliasEqDecl
-> Binder(Ty|Lt)
-> AliasTy(AliasName, Parameters(Ty|Lt))
-> Ty
-> Wcs
AliasBoundDecl
-> AliasTy
-> Binder<Wc>
-> Wcs
```
To understand the role of each formality declaration, start here:
* [the `Program::to_prove_decls` method](https://github.com/nikomatsakis/a-mir-formality/blob/ca14d9941244eefc472a24895515cc278244534f/crates/formality-rust/src/prove.rs#L19)
* e.g. alias bound decls are [created here](https://github.com/nikomatsakis/a-mir-formality/blob/ca14d9941244eefc472a24895515cc278244534f/crates/formality-rust/src/prove.rs#L223)
Maybe we want to create these [rust-like structure](https://github.com/nikomatsakis/a-mir-formality/blob/ca14d9941244eefc472a24895515cc278244534f/crates/formality-rust/src/grammar.rs#L47-L67)?
doesn't have predicates, has [where clauses](https://github.com/nikomatsakis/a-mir-formality/blob/ca14d9941244eefc472a24895515cc278244534f/crates/formality-rust/src/grammar.rs#L338-L348)
e.g, instead of alias bound decl we have [this](https://github.com/nikomatsakis/a-mir-formality/blob/ca14d9941244eefc472a24895515cc278244534f/crates/formality-rust/src/grammar.rs#L236-L243)
want code that does:
```rust!
let compiler = Compiler::new(input_source_file)?;
let mut all_crates = vec![];
for crate in compiler.crates() {
let mut current_crate = vec![];
for item in crate.items() {
match item {
Struct => {
let formality_struct = StructItem { ... };
current_crate.push(formality_struct.upcast());
}
}
}
all_crates.push(Crate { items: current_crate });
}
formality_check::check(Program { crates: all_crates })
```
what might be helpful for types is [the `Ty` parser impl](https://github.com/nikomatsakis/a-mir-formality/blob/ca14d9941244eefc472a24895515cc278244534f/crates/formality-types/src/grammar/ty/parse_impls.rs#L14-L56), which parses rust-like syntax.
## 2023-06-28
* what do we need from SMIR for a-mir-formality?
* [x] types
* [x] MIR
* [ ] predicates
* [ ] generics
* [ ] list all trait declarations of a crate
* do what we do for listing all def ids of all things with bodies
* [ ] list all trait impls of a crate
* [ ] constants
https://github.com/rust-lang/a-mir-formality
https://github.com/rust-lang/a-mir-formality/blob/main/crates/formality-prove/src/decls.rs
https://github.com/rust-lang/a-mir-formality/blob/ca14d9941244eefc472a24895515cc278244534f/crates/formality-prove/src/decls.rs#L13-L22
goal for next meeting:
* go through the decls declaration from a-mir-formality to enumerate exactly what info is needed about each of the kinds of items, along with what items we need
* maybe add some of those items
```rust
trait Foo { }
impl Foo for u32 { }
```
* July 12 -- niko is in seattle
* July 19 -- niko is flying on an airplane to France :snake: :airplane:
*