Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
2ab08ef
Parse json output from cargo insta
purefunctor Jan 6, 2026
4800657
Move class globalization to quantify
purefunctor Jan 6, 2026
dffdba3
Generalise class and instance declarations
purefunctor Jan 6, 2026
66baf5b
Add newtype_token to DeriveDeclaration
purefunctor Jan 7, 2026
d70eecb
Add newtype field to TermItemIr::Derive
purefunctor Jan 7, 2026
9292b25
Add resolution field to TermItemIr::Derive
purefunctor Jan 7, 2026
b6883e4
Add and use InstanceKind
purefunctor Jan 7, 2026
3c0f9a5
Add skeleton for derive checking
purefunctor Jan 7, 2026
5c95de1
Fix implicit variable resolution
purefunctor Jan 7, 2026
835d36b
Add unification rule Implicit and Bound
purefunctor Jan 7, 2026
516eca4
Remove erroneous fix for unifying instance head kinds
purefunctor Jan 7, 2026
6f03623
Identify compiler-known types like Eq and Eq1
purefunctor Jan 10, 2026
fa09001
Collect quantified variable count for data-like
purefunctor Jan 11, 2026
f9bad12
Completely rework checking for type items
purefunctor Jan 12, 2026
32a0e03
Rework value group checking to use commit
purefunctor Jan 12, 2026
d813761
Implement derive for Eq and Ord
purefunctor Jan 12, 2026
3643aac
Initial implementation for 'derive newtype'
purefunctor Jan 13, 2026
37fe6d8
Initial derive for Functor and Bifunctor
purefunctor Jan 13, 2026
f2e68b7
Extract shared utils to derive::tools
purefunctor Jan 13, 2026
1d8474c
Initial derive for Contravariant and Profunctor
purefunctor Jan 13, 2026
395a10b
Use an enum for DerivedSkolems
purefunctor Jan 13, 2026
11a4e66
Perform kind checking on 'derive instance'
purefunctor Jan 13, 2026
2c85a66
Fix clippy
purefunctor Jan 13, 2026
daf85d8
Initial derive for Foldable and Bifoldable
purefunctor Jan 13, 2026
f9b014b
Add prelude folder for checking fixtures
purefunctor Jan 13, 2026
b7a3fcc
Initial derive for Traversable and Bitraversable
purefunctor Jan 13, 2026
dd70932
Stylistic import changes
purefunctor Jan 13, 2026
d210b0a
Consider superclass constraints when deriving
purefunctor Jan 13, 2026
3d262f4
Remove Variable::Implicit and fix invalid levels
purefunctor Jan 13, 2026
aeae163
Remove ShiftImplicit
purefunctor Jan 13, 2026
99c6e4f
Deduplicate test code
purefunctor Jan 13, 2026
9d860a8
Avoid recursing into constructor fields for Class1
purefunctor Jan 13, 2026
6a8dfde
Implement derive for Eq1 and Ord1
purefunctor Jan 13, 2026
61aaa38
Generate unification variables for wildcard types
purefunctor Jan 13, 2026
6845bff
Add subtyping rule for constrained types
purefunctor Jan 13, 2026
7c97466
Add placeholder solver for Coercible
purefunctor Jan 13, 2026
7fc60e9
Implement initial derive for Newtype and Generic
purefunctor Jan 13, 2026
6241d17
Extract binding group computation to a query
purefunctor Jan 14, 2026
fd2e2e6
Fix formatting
purefunctor Jan 14, 2026
7b5f509
Add core::Role type
purefunctor Jan 15, 2026
3fd53a7
Add roles map to CheckedModule
purefunctor Jan 15, 2026
66725c1
Implement role inference and checking
purefunctor Jan 15, 2026
96d6906
Insert roles in prim_checked
purefunctor Jan 15, 2026
e03722a
Add resolved and prim_resolved to CheckContext
purefunctor Jan 15, 2026
f93c810
Implement is_term_in_scope
purefunctor Jan 15, 2026
9368372
Use filter for snapshots
purefunctor Jan 15, 2026
a9fda05
Initial constraint solver implementation
purefunctor Jan 15, 2026
26c45f3
Implement higher kinded coercion
purefunctor Jan 15, 2026
79d3775
Implement transitive solving for Prim.Int.Compare
purefunctor Jan 15, 2026
bb8a265
Implement solving for IsSymbol and Reflectable
purefunctor Jan 15, 2026
070af88
Format files
purefunctor Jan 15, 2026
9c96f01
Format imports
purefunctor Jan 15, 2026
a04fcdc
Reduce super:: usage
purefunctor Jan 15, 2026
ffea447
Implement compiler-solved Warn and Fail
purefunctor Jan 16, 2026
757a675
Move compiler-solved classes into submodules
purefunctor Jan 16, 2026
3a1e53d
Move shared utilities to toolkit
purefunctor Jan 16, 2026
0f17953
Reduce duplicated work for instantiate_constructor_fields
purefunctor Jan 16, 2026
2bf4dde
Clippy lints
purefunctor Jan 16, 2026
b33aecf
Format files
purefunctor Jan 16, 2026
f68e65c
Macro for derive dispatch
purefunctor Jan 16, 2026
4362908
Define constraint_application from extract_type_application
purefunctor Jan 16, 2026
7f57bc3
Use macro for compiler-solved classes
purefunctor Jan 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions compiler-core/building-types/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub enum QueryKey {
Stabilized(FileId),
Indexed(FileId),
Lowered(FileId),
Grouped(FileId),
Resolved(FileId),
Bracketed(FileId),
Sectioned(FileId),
Expand All @@ -35,6 +36,7 @@ pub trait QueryProxy {
type Stabilized;
type Indexed;
type Lowered;
type Grouped;
type Resolved;
type Bracketed;
type Sectioned;
Expand All @@ -48,6 +50,8 @@ pub trait QueryProxy {

fn lowered(&self, id: FileId) -> QueryResult<Self::Lowered>;

fn grouped(&self, id: FileId) -> QueryResult<Self::Grouped>;

fn resolved(&self, id: FileId) -> QueryResult<Self::Resolved>;

fn bracketed(&self, id: FileId) -> QueryResult<Self::Bracketed>;
Expand Down
72 changes: 71 additions & 1 deletion compiler-core/building/src/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ use files::FileId;
use graph::SnapshotGraph;
use indexing::IndexedModule;
use lock_api::{RawRwLock, RawRwLockRecursive};
use lowering::LoweredModule;
use lowering::{GroupedModule, LoweredModule};
use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard};
use parsing::FullParsedModule;
use promise::{Future, Promise};
Expand Down Expand Up @@ -94,6 +94,7 @@ struct DerivedStorage {
stabilized: FxHashMap<FileId, DerivedState<Arc<StabilizedModule>>>,
indexed: FxHashMap<FileId, DerivedState<Arc<IndexedModule>>>,
lowered: FxHashMap<FileId, DerivedState<Arc<LoweredModule>>>,
grouped: FxHashMap<FileId, DerivedState<Arc<GroupedModule>>>,
resolved: FxHashMap<FileId, DerivedState<Arc<ResolvedModule>>>,
bracketed: FxHashMap<FileId, DerivedState<Arc<sugar::Bracketed>>>,
sectioned: FxHashMap<FileId, DerivedState<Arc<sugar::Sectioned>>>,
Expand Down Expand Up @@ -422,6 +423,7 @@ impl QueryEngine {
QueryKey::Stabilized(k) => derived_changed!(stabilized, k),
QueryKey::Indexed(k) => derived_changed!(indexed, k),
QueryKey::Lowered(k) => derived_changed!(lowered, k),
QueryKey::Grouped(k) => derived_changed!(grouped, k),
QueryKey::Resolved(k) => derived_changed!(resolved, k),
QueryKey::Bracketed(k) => derived_changed!(bracketed, k),
QueryKey::Sectioned(k) => derived_changed!(sectioned, k),
Expand Down Expand Up @@ -692,6 +694,20 @@ impl QueryEngine {
)
}

pub fn grouped(&self, id: FileId) -> QueryResult<Arc<GroupedModule>> {
self.query(
QueryKey::Grouped(id),
|storage| storage.derived.grouped.get(&id),
|storage| storage.derived.grouped.entry(id),
|this| {
let lowered = this.lowered(id)?;
let indexed = this.indexed(id)?;
let groups = lowering::group_module(&indexed, &lowered);
Ok(Arc::new(groups))
},
)
}

pub fn resolved(&self, id: FileId) -> QueryResult<Arc<ResolvedModule>> {
self.query(
QueryKey::Resolved(id),
Expand Down Expand Up @@ -758,6 +774,8 @@ impl QueryProxy for QueryEngine {

type Lowered = Arc<LoweredModule>;

type Grouped = Arc<GroupedModule>;

type Resolved = Arc<ResolvedModule>;

type Bracketed = Arc<sugar::Bracketed>;
Expand All @@ -782,6 +800,10 @@ impl QueryProxy for QueryEngine {
QueryEngine::lowered(self, id)
}

fn grouped(&self, id: FileId) -> QueryResult<Self::Grouped> {
QueryEngine::grouped(self, id)
}

fn resolved(&self, id: FileId) -> QueryResult<Self::Resolved> {
QueryEngine::resolved(self, id)
}
Expand Down Expand Up @@ -1266,4 +1288,52 @@ mod tests {
})
);
}

#[test]
fn test_grouped_identity() {
let mut engine = QueryEngine::default();
let mut files = Files::default();
prim::configure(&mut engine, &mut files);

let id = files.insert("./src/Main.purs", "module Main where\n\nx = y\ny = 1");
let content = files.content(id);
engine.set_content(id, content);

let groups_a = engine.grouped(id).unwrap();
let groups_b = engine.grouped(id).unwrap();
assert!(Arc::ptr_eq(&groups_a, &groups_b));
}

#[test]
fn test_lowered_identity() {
let mut engine = QueryEngine::default();
let mut files = Files::default();
prim::configure(&mut engine, &mut files);

let id = files.insert("./src/Main.purs", "module Main where\n\nx = 1");
let content = files.content(id);
engine.set_content(id, content);

let lowered_a = engine.lowered(id).unwrap();
let lowered_b = engine.lowered(id).unwrap();
assert!(Arc::ptr_eq(&lowered_a, &lowered_b));
}

#[test]
fn test_grouped_stable() {
let mut engine = QueryEngine::default();
let mut files = Files::default();
prim::configure(&mut engine, &mut files);

let id = files.insert("./src/Main.purs", "module Main where\n\nx = 1");
engine.set_content(id, files.content(id));
let groups_a = engine.grouped(id).unwrap();

let id = files.insert("./src/Main.purs", "module Main where\n\n\n\nx = 1");
engine.set_content(id, files.content(id));
let groups_b = engine.grouped(id).unwrap();

assert_eq!(groups_a.term_scc, groups_b.term_scc);
assert_eq!(groups_a.type_scc, groups_b.type_scc);
}
}
Loading