Skip to content

Commit 3fb223f

Browse files
authored
Implement instance derivation (#81)
2 parents 9c7a310 + 7f57bc3 commit 3fb223f

333 files changed

Lines changed: 10436 additions & 1734 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler-core/building-types/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub enum QueryKey {
1414
Stabilized(FileId),
1515
Indexed(FileId),
1616
Lowered(FileId),
17+
Grouped(FileId),
1718
Resolved(FileId),
1819
Bracketed(FileId),
1920
Sectioned(FileId),
@@ -35,6 +36,7 @@ pub trait QueryProxy {
3536
type Stabilized;
3637
type Indexed;
3738
type Lowered;
39+
type Grouped;
3840
type Resolved;
3941
type Bracketed;
4042
type Sectioned;
@@ -48,6 +50,8 @@ pub trait QueryProxy {
4850

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

53+
fn grouped(&self, id: FileId) -> QueryResult<Self::Grouped>;
54+
5155
fn resolved(&self, id: FileId) -> QueryResult<Self::Resolved>;
5256

5357
fn bracketed(&self, id: FileId) -> QueryResult<Self::Bracketed>;

compiler-core/building/src/engine.rs

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use files::FileId;
3838
use graph::SnapshotGraph;
3939
use indexing::IndexedModule;
4040
use lock_api::{RawRwLock, RawRwLockRecursive};
41-
use lowering::LoweredModule;
41+
use lowering::{GroupedModule, LoweredModule};
4242
use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard};
4343
use parsing::FullParsedModule;
4444
use promise::{Future, Promise};
@@ -94,6 +94,7 @@ struct DerivedStorage {
9494
stabilized: FxHashMap<FileId, DerivedState<Arc<StabilizedModule>>>,
9595
indexed: FxHashMap<FileId, DerivedState<Arc<IndexedModule>>>,
9696
lowered: FxHashMap<FileId, DerivedState<Arc<LoweredModule>>>,
97+
grouped: FxHashMap<FileId, DerivedState<Arc<GroupedModule>>>,
9798
resolved: FxHashMap<FileId, DerivedState<Arc<ResolvedModule>>>,
9899
bracketed: FxHashMap<FileId, DerivedState<Arc<sugar::Bracketed>>>,
99100
sectioned: FxHashMap<FileId, DerivedState<Arc<sugar::Sectioned>>>,
@@ -422,6 +423,7 @@ impl QueryEngine {
422423
QueryKey::Stabilized(k) => derived_changed!(stabilized, k),
423424
QueryKey::Indexed(k) => derived_changed!(indexed, k),
424425
QueryKey::Lowered(k) => derived_changed!(lowered, k),
426+
QueryKey::Grouped(k) => derived_changed!(grouped, k),
425427
QueryKey::Resolved(k) => derived_changed!(resolved, k),
426428
QueryKey::Bracketed(k) => derived_changed!(bracketed, k),
427429
QueryKey::Sectioned(k) => derived_changed!(sectioned, k),
@@ -692,6 +694,20 @@ impl QueryEngine {
692694
)
693695
}
694696

697+
pub fn grouped(&self, id: FileId) -> QueryResult<Arc<GroupedModule>> {
698+
self.query(
699+
QueryKey::Grouped(id),
700+
|storage| storage.derived.grouped.get(&id),
701+
|storage| storage.derived.grouped.entry(id),
702+
|this| {
703+
let lowered = this.lowered(id)?;
704+
let indexed = this.indexed(id)?;
705+
let groups = lowering::group_module(&indexed, &lowered);
706+
Ok(Arc::new(groups))
707+
},
708+
)
709+
}
710+
695711
pub fn resolved(&self, id: FileId) -> QueryResult<Arc<ResolvedModule>> {
696712
self.query(
697713
QueryKey::Resolved(id),
@@ -758,6 +774,8 @@ impl QueryProxy for QueryEngine {
758774

759775
type Lowered = Arc<LoweredModule>;
760776

777+
type Grouped = Arc<GroupedModule>;
778+
761779
type Resolved = Arc<ResolvedModule>;
762780

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

803+
fn grouped(&self, id: FileId) -> QueryResult<Self::Grouped> {
804+
QueryEngine::grouped(self, id)
805+
}
806+
785807
fn resolved(&self, id: FileId) -> QueryResult<Self::Resolved> {
786808
QueryEngine::resolved(self, id)
787809
}
@@ -1266,4 +1288,52 @@ mod tests {
12661288
})
12671289
);
12681290
}
1291+
1292+
#[test]
1293+
fn test_grouped_identity() {
1294+
let mut engine = QueryEngine::default();
1295+
let mut files = Files::default();
1296+
prim::configure(&mut engine, &mut files);
1297+
1298+
let id = files.insert("./src/Main.purs", "module Main where\n\nx = y\ny = 1");
1299+
let content = files.content(id);
1300+
engine.set_content(id, content);
1301+
1302+
let groups_a = engine.grouped(id).unwrap();
1303+
let groups_b = engine.grouped(id).unwrap();
1304+
assert!(Arc::ptr_eq(&groups_a, &groups_b));
1305+
}
1306+
1307+
#[test]
1308+
fn test_lowered_identity() {
1309+
let mut engine = QueryEngine::default();
1310+
let mut files = Files::default();
1311+
prim::configure(&mut engine, &mut files);
1312+
1313+
let id = files.insert("./src/Main.purs", "module Main where\n\nx = 1");
1314+
let content = files.content(id);
1315+
engine.set_content(id, content);
1316+
1317+
let lowered_a = engine.lowered(id).unwrap();
1318+
let lowered_b = engine.lowered(id).unwrap();
1319+
assert!(Arc::ptr_eq(&lowered_a, &lowered_b));
1320+
}
1321+
1322+
#[test]
1323+
fn test_grouped_stable() {
1324+
let mut engine = QueryEngine::default();
1325+
let mut files = Files::default();
1326+
prim::configure(&mut engine, &mut files);
1327+
1328+
let id = files.insert("./src/Main.purs", "module Main where\n\nx = 1");
1329+
engine.set_content(id, files.content(id));
1330+
let groups_a = engine.grouped(id).unwrap();
1331+
1332+
let id = files.insert("./src/Main.purs", "module Main where\n\n\n\nx = 1");
1333+
engine.set_content(id, files.content(id));
1334+
let groups_b = engine.grouped(id).unwrap();
1335+
1336+
assert_eq!(groups_a.term_scc, groups_b.term_scc);
1337+
assert_eq!(groups_a.type_scc, groups_b.type_scc);
1338+
}
12691339
}

0 commit comments

Comments
 (0)