Skip to content

Commit 64c13f8

Browse files
committed
introduce metadata needed by coherence-mode
1 parent a4324cb commit 64c13f8

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

crates/formality-prove/src/decls.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ use formality_types::{
33
cast::Upcast,
44
collections::Set,
55
grammar::{
6-
AliasName, AliasTy, Binder, Parameter, Predicate, Relation, TraitId, TraitRef, Ty, Wc, Wcs,
7-
PR,
6+
AdtId, AliasName, AliasTy, Binder, Parameter, Predicate, Relation, TraitId, TraitRef, Ty,
7+
Wc, Wcs, PR,
88
},
9+
set,
910
};
1011

1112
#[term]
@@ -16,12 +17,22 @@ pub struct Decls {
1617
pub neg_impl_decls: Vec<NegImplDecl>,
1718
pub alias_eq_decls: Vec<AliasEqDecl>,
1819
pub alias_bound_decls: Vec<AliasBoundDecl>,
20+
pub local_trait_ids: Set<TraitId>,
21+
pub local_adt_ids: Set<AdtId>,
1922
}
2023

2124
impl Decls {
2225
/// Max size used in unit tests that are not stress testing maximum size.
2326
pub const DEFAULT_MAX_SIZE: usize = 222;
2427

28+
pub fn is_local_trait_id(&self, trait_id: &TraitId) -> bool {
29+
self.local_trait_ids.contains(trait_id)
30+
}
31+
32+
pub fn is_local_adt_id(&self, adt_id: &AdtId) -> bool {
33+
self.local_adt_ids.contains(adt_id)
34+
}
35+
2536
pub fn impl_decls<'s>(&'s self, trait_id: &'s TraitId) -> impl Iterator<Item = &'s ImplDecl> {
2637
self.impl_decls
2738
.iter()
@@ -78,6 +89,8 @@ impl Decls {
7889
neg_impl_decls: vec![],
7990
alias_eq_decls: vec![],
8091
alias_bound_decls: vec![],
92+
local_trait_ids: set![],
93+
local_adt_ids: set![],
8194
}
8295
}
8396
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,24 @@ use formality_types::{
1313
#[derive(Default, Debug, Clone, Hash, Ord, Eq, PartialEq, PartialOrd)]
1414
pub struct Env {
1515
variables: Vec<Variable>,
16+
coherence_mode: bool,
1617
}
1718

1819
impl Env {
1920
pub fn only_universal_variables(&self) -> bool {
2021
self.variables.iter().all(|v| v.is_universal())
2122
}
23+
24+
pub fn is_coherence_mode(&self) -> bool {
25+
self.coherence_mode
26+
}
27+
28+
pub fn coherence_mode(self) -> Env {
29+
Env {
30+
coherence_mode: true,
31+
..self
32+
}
33+
}
2234
}
2335

2436
cast_impl!(Env);
@@ -199,6 +211,7 @@ impl Env {
199211
.iter()
200212
.map(|&v| vs.map_var(v).unwrap_or(v))
201213
.collect(),
214+
coherence_mode: self.coherence_mode,
202215
}
203216
}
204217

crates/formality-rust/src/prove.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ use crate::grammar::{
77
use formality_prove as prove;
88
use formality_types::{
99
cast::{To, Upcast, Upcasted},
10+
collections::Set,
1011
grammar::{
11-
fresh_bound_var, AliasTy, Binder, ParameterKind, Predicate, Relation, Ty, Wc, Wcs, PR,
12+
fresh_bound_var, AdtId, AliasTy, Binder, ParameterKind, Predicate, Relation, TraitId, Ty,
13+
Wc, Wcs, PR,
1214
},
1315
seq,
1416
};
@@ -22,6 +24,8 @@ impl Program {
2224
neg_impl_decls: self.neg_impl_decls(),
2325
alias_eq_decls: self.alias_eq_decls(),
2426
alias_bound_decls: self.alias_bound_decls(),
27+
local_trait_ids: self.local_trait_ids(),
28+
local_adt_ids: self.local_adt_ids(),
2529
}
2630
}
2731

@@ -53,6 +57,22 @@ impl Program {
5357
.flat_map(|c| c.alias_bound_decls())
5458
.collect()
5559
}
60+
61+
fn local_trait_ids(&self) -> Set<TraitId> {
62+
self.crates
63+
.last()
64+
.into_iter()
65+
.flat_map(|c| c.trait_decls().into_iter().map(|decl| decl.id))
66+
.collect()
67+
}
68+
69+
fn local_adt_ids(&self) -> Set<AdtId> {
70+
self.crates
71+
.last()
72+
.into_iter()
73+
.flat_map(|c| c.adt_ids())
74+
.collect()
75+
}
5676
}
5777

5878
impl Crate {
@@ -261,6 +281,20 @@ impl Crate {
261281
})
262282
.collect()
263283
}
284+
285+
fn adt_ids(&self) -> Set<AdtId> {
286+
self.items
287+
.iter()
288+
.flat_map(|item| match item {
289+
CrateItem::Struct(v) => Some(v.id.clone()),
290+
CrateItem::Enum(v) => Some(v.id.clone()),
291+
CrateItem::Trait(_) => None,
292+
CrateItem::TraitImpl(_) => None,
293+
CrateItem::NegTraitImpl(_) => None,
294+
CrateItem::Fn(_) => None,
295+
})
296+
.collect()
297+
}
264298
}
265299

266300
pub trait ToWcs {

0 commit comments

Comments
 (0)