@@ -37,14 +37,15 @@ use std::{
3737use building_types:: { ModuleNameId , ModuleNameInterner , QueryError , QueryKey , QueryResult } ;
3838use files:: FileId ;
3939use graph:: SnapshotGraph ;
40- use indexing:: FullIndexedModule ;
40+ use indexing:: IndexedModule ;
4141use lock_api:: { RawRwLock , RawRwLockRecursive } ;
42- use lowering:: FullLoweredModule ;
42+ use lowering:: LoweredModule ;
4343use parking_lot:: { Mutex , RwLock , RwLockUpgradableReadGuard } ;
4444use parsing:: FullParsedModule ;
4545use promise:: { Future , Promise } ;
46- use resolving:: FullResolvedModule ;
46+ use resolving:: ResolvedModule ;
4747use rustc_hash:: { FxHashMap , FxHashSet } ;
48+ use stabilizing:: StabilizedModule ;
4849use thread_local:: ThreadLocal ;
4950
5051#[ derive( Debug , Clone , Copy ) ]
@@ -91,9 +92,10 @@ struct InputStorage {
9192#[ derive( Default ) ]
9293struct 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
689708impl 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
703722impl 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