Skip to content

Commit a604e0b

Browse files
authored
Implement stabilization as a separate pass (#57)
2 parents 7f7798c + 6a9fb51 commit a604e0b

Some content is hidden

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

60 files changed

+1159
-1383
lines changed

Cargo.lock

Lines changed: 35 additions & 1 deletion
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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub enum QueryKey {
1111
Content(FileId),
1212
Module(ModuleNameId),
1313
Parsed(FileId),
14+
Stabilized(FileId),
1415
Indexed(FileId),
1516
Lowered(FileId),
1617
Resolved(FileId),

compiler-core/building/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ parking_lot = "0.12.4"
1414
parsing = { version = "0.1.0", path = "../parsing" }
1515
resolving = { version = "0.1.0", path = "../resolving" }
1616
rustc-hash = "2.1.1"
17+
stabilizing = { version = "0.1.0", path = "../stabilizing" }
1718
sugar = { version = "0.1.0", path = "../sugar" }
1819
tempfile = "3.21.0"
1920
thread_local = "1.1.9"

compiler-core/building/src/engine.rs

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@ use std::{
3737
use building_types::{ModuleNameId, ModuleNameInterner, QueryError, QueryKey, QueryResult};
3838
use files::FileId;
3939
use graph::SnapshotGraph;
40-
use indexing::FullIndexedModule;
40+
use indexing::IndexedModule;
4141
use lock_api::{RawRwLock, RawRwLockRecursive};
42-
use lowering::FullLoweredModule;
42+
use lowering::LoweredModule;
4343
use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard};
4444
use parsing::FullParsedModule;
4545
use promise::{Future, Promise};
46-
use resolving::FullResolvedModule;
46+
use resolving::ResolvedModule;
4747
use rustc_hash::{FxHashMap, FxHashSet};
48+
use stabilizing::StabilizedModule;
4849
use thread_local::ThreadLocal;
4950

5051
#[derive(Debug, Clone, Copy)]
@@ -91,9 +92,10 @@ struct InputStorage {
9192
#[derive(Default)]
9293
struct DerivedStorage {
9394
parsed: FxHashMap<FileId, DerivedState<FullParsedModule>>,
94-
indexed: FxHashMap<FileId, DerivedState<Arc<FullIndexedModule>>>,
95-
lowered: FxHashMap<FileId, DerivedState<Arc<FullLoweredModule>>>,
96-
resolved: FxHashMap<FileId, DerivedState<Arc<FullResolvedModule>>>,
95+
stabilized: FxHashMap<FileId, DerivedState<Arc<StabilizedModule>>>,
96+
indexed: FxHashMap<FileId, DerivedState<Arc<IndexedModule>>>,
97+
lowered: FxHashMap<FileId, DerivedState<Arc<LoweredModule>>>,
98+
resolved: FxHashMap<FileId, DerivedState<Arc<ResolvedModule>>>,
9799
}
98100

99101
#[derive(Default)]
@@ -414,6 +416,7 @@ impl QueryEngine {
414416
QueryKey::Content(k) => input_changed!(content, k),
415417
QueryKey::Module(k) => input_changed!(module, k),
416418
QueryKey::Parsed(k) => derived_changed!(parsed, k),
419+
QueryKey::Stabilized(k) => derived_changed!(stabilized, k),
417420
QueryKey::Indexed(k) => derived_changed!(indexed, k),
418421
QueryKey::Lowered(k) => derived_changed!(lowered, k),
419422
QueryKey::Resolved(k) => derived_changed!(resolved, k),
@@ -627,23 +630,37 @@ impl QueryEngine {
627630
)
628631
}
629632

630-
pub fn indexed(&self, id: FileId) -> QueryResult<Arc<FullIndexedModule>> {
633+
pub fn stabilized(&self, id: FileId) -> QueryResult<Arc<StabilizedModule>> {
634+
self.query(
635+
QueryKey::Stabilized(id),
636+
|storage| storage.derived.stabilized.get(&id),
637+
|storage| storage.derived.stabilized.entry(id),
638+
|this| {
639+
let (parsed, _) = this.parsed(id)?;
640+
let node = parsed.syntax_node();
641+
Ok(Arc::new(stabilizing::stabilize_module(&node)))
642+
},
643+
)
644+
}
645+
646+
pub fn indexed(&self, id: FileId) -> QueryResult<Arc<IndexedModule>> {
631647
self.query(
632648
QueryKey::Indexed(id),
633649
|storage| storage.derived.indexed.get(&id),
634650
|storage| storage.derived.indexed.entry(id),
635651
|this| {
636652
let (parsed, _) = this.parsed(id)?;
653+
let stabilized = this.stabilized(id)?;
637654

638655
let module = parsed.cst();
639-
let indexed = indexing::index_module(&module);
656+
let indexed = indexing::index_module(&module, &stabilized);
640657

641658
Ok(Arc::new(indexed))
642659
},
643660
)
644661
}
645662

646-
pub fn lowered(&self, id: FileId) -> QueryResult<Arc<FullLoweredModule>> {
663+
pub fn lowered(&self, id: FileId) -> QueryResult<Arc<LoweredModule>> {
647664
self.query(
648665
QueryKey::Lowered(id),
649666
|storage| storage.derived.lowered.get(&id),
@@ -656,18 +673,20 @@ impl QueryEngine {
656673
this.resolved(prim_id)?
657674
};
658675

676+
let stabilized = this.stabilized(id)?;
659677
let indexed = this.indexed(id)?;
660678
let resolved = this.resolved(id)?;
661679

662680
let module = parsed.cst();
663-
let lowered = lowering::lower_module(&module, &prim, &indexed, &resolved);
681+
let lowered =
682+
lowering::lower_module(&module, &prim, &stabilized, &indexed, &resolved);
664683

665684
Ok(Arc::new(lowered))
666685
},
667686
)
668687
}
669688

670-
pub fn resolved(&self, id: FileId) -> QueryResult<Arc<FullResolvedModule>> {
689+
pub fn resolved(&self, id: FileId) -> QueryResult<Arc<ResolvedModule>> {
671690
self.query(
672691
QueryKey::Resolved(id),
673692
|storage| storage.derived.resolved.get(&id),
@@ -687,11 +706,11 @@ impl QueryEngine {
687706
}
688707

689708
impl resolving::External for QueryEngine {
690-
fn indexed(&self, id: FileId) -> QueryResult<Arc<FullIndexedModule>> {
709+
fn indexed(&self, id: FileId) -> QueryResult<Arc<IndexedModule>> {
691710
QueryEngine::indexed(self, id)
692711
}
693712

694-
fn resolved(&self, id: FileId) -> QueryResult<Arc<FullResolvedModule>> {
713+
fn resolved(&self, id: FileId) -> QueryResult<Arc<ResolvedModule>> {
695714
QueryEngine::resolved(self, id)
696715
}
697716

@@ -701,15 +720,15 @@ impl resolving::External for QueryEngine {
701720
}
702721

703722
impl sugar::External for QueryEngine {
704-
fn indexed(&self, id: FileId) -> QueryResult<Arc<FullIndexedModule>> {
723+
fn indexed(&self, id: FileId) -> QueryResult<Arc<IndexedModule>> {
705724
QueryEngine::indexed(self, id)
706725
}
707726

708-
fn resolved(&self, id: FileId) -> QueryResult<Arc<FullResolvedModule>> {
727+
fn resolved(&self, id: FileId) -> QueryResult<Arc<ResolvedModule>> {
709728
QueryEngine::resolved(self, id)
710729
}
711730

712-
fn lowered(&self, id: FileId) -> QueryResult<Arc<FullLoweredModule>> {
731+
fn lowered(&self, id: FileId) -> QueryResult<Arc<LoweredModule>> {
713732
QueryEngine::lowered(self, id)
714733
}
715734

@@ -728,7 +747,7 @@ mod tests {
728747
use building_types::{QueryError, QueryResult};
729748
use files::{FileId, Files};
730749
use la_arena::RawIdx;
731-
use resolving::FullResolvedModule;
750+
use resolving::ResolvedModule;
732751

733752
use crate::prim;
734753

@@ -825,7 +844,7 @@ mod tests {
825844
assert_trace!(storage, indexed(id) => Trace {
826845
built: 19,
827846
changed: 19,
828-
dependencies: &[QueryKey::Parsed(id)]
847+
dependencies: &[QueryKey::Parsed(id), QueryKey::Stabilized(id)]
829848
});
830849
assert_trace!(storage, resolved(id) => Trace {
831850
built: 19,
@@ -851,8 +870,8 @@ mod tests {
851870
});
852871
assert_trace!(storage, indexed(id) => Trace {
853872
built: 20,
854-
changed: 20,
855-
dependencies: &[QueryKey::Parsed(id)]
873+
changed: 19,
874+
dependencies: &[QueryKey::Parsed(id), QueryKey::Stabilized(id)]
856875
});
857876
assert_trace!(storage, resolved(id) => Trace {
858877
built: 20,
@@ -878,8 +897,8 @@ mod tests {
878897
});
879898
assert_trace!(storage, indexed(id) => Trace {
880899
built: 21,
881-
changed: 20,
882-
dependencies: &[QueryKey::Parsed(id)]
900+
changed: 19,
901+
dependencies: &[QueryKey::Parsed(id), QueryKey::Stabilized(id)]
883902
});
884903
assert_trace!(storage, resolved(id) => Trace {
885904
built: 21,
@@ -888,16 +907,14 @@ mod tests {
888907
});
889908
}
890909

910+
assert!(Arc::ptr_eq(&indexed_a, &indexed_b));
891911
assert!(Arc::ptr_eq(&indexed_b, &indexed_c));
912+
913+
assert!(Arc::ptr_eq(&lowered_a, &lowered_b));
892914
assert!(Arc::ptr_eq(&lowered_b, &lowered_c));
893915

894916
assert!(Arc::ptr_eq(&resolved_a, &resolved_b));
895917
assert!(Arc::ptr_eq(&resolved_b, &resolved_c));
896-
897-
assert!(!Arc::ptr_eq(&indexed_a, &indexed_b));
898-
assert!(!Arc::ptr_eq(&indexed_a, &indexed_c));
899-
assert!(!Arc::ptr_eq(&lowered_a, &lowered_b));
900-
assert!(!Arc::ptr_eq(&lowered_a, &lowered_c));
901918
}
902919

903920
#[test]
@@ -1015,7 +1032,7 @@ mod tests {
10151032
const ID: FileId = FileId::from_raw(RawIdx::from_u32(0));
10161033
const KEY: QueryKey = QueryKey::Resolved(ID);
10171034

1018-
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<FullResolvedModule>> {
1035+
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<ResolvedModule>> {
10191036
engine.query(
10201037
QueryKey::Resolved(ID),
10211038
|storage| storage.derived.resolved.get(&ID),
@@ -1033,7 +1050,7 @@ mod tests {
10331050
fn test_cycle_recovery() {
10341051
const ID: FileId = FileId::from_raw(RawIdx::from_u32(0));
10351052

1036-
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<FullResolvedModule>> {
1053+
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<ResolvedModule>> {
10371054
engine.query(
10381055
QueryKey::Resolved(ID),
10391056
|storage| storage.derived.resolved.get(&ID),
@@ -1052,7 +1069,7 @@ mod tests {
10521069
const ID_A: FileId = FileId::from_raw(RawIdx::from_u32(0));
10531070
const ID_B: FileId = FileId::from_raw(RawIdx::from_u32(1));
10541071

1055-
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<FullResolvedModule>> {
1072+
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<ResolvedModule>> {
10561073
engine.query(
10571074
QueryKey::Resolved(ID_A),
10581075
|storage| storage.derived.resolved.get(&ID_A),
@@ -1061,7 +1078,7 @@ mod tests {
10611078
)
10621079
}
10631080

1064-
fn fake_query_b(engine: &QueryEngine) -> QueryResult<Arc<FullResolvedModule>> {
1081+
fn fake_query_b(engine: &QueryEngine) -> QueryResult<Arc<ResolvedModule>> {
10651082
engine.query(
10661083
QueryKey::Resolved(ID_B),
10671084
|storage| storage.derived.resolved.get(&ID_B),
@@ -1094,7 +1111,7 @@ mod tests {
10941111
const ID_A: FileId = FileId::from_raw(RawIdx::from_u32(0));
10951112
const ID_B: FileId = FileId::from_raw(RawIdx::from_u32(1));
10961113

1097-
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<FullResolvedModule>> {
1114+
fn fake_query_a(engine: &QueryEngine) -> QueryResult<Arc<ResolvedModule>> {
10981115
engine.query(
10991116
QueryKey::Resolved(ID_A),
11001117
|storage| storage.derived.resolved.get(&ID_A),
@@ -1103,7 +1120,7 @@ mod tests {
11031120
)
11041121
}
11051122

1106-
fn fake_query_b(engine: &QueryEngine) -> QueryResult<Arc<FullResolvedModule>> {
1123+
fn fake_query_b(engine: &QueryEngine) -> QueryResult<Arc<ResolvedModule>> {
11071124
engine.query(
11081125
QueryKey::Resolved(ID_B),
11091126
|storage| storage.derived.resolved.get(&ID_B),

0 commit comments

Comments
 (0)