@@ -18,8 +18,7 @@ use cairo_lang_syntax::node::ast::{
1818use cairo_lang_syntax:: node:: green:: { GreenNode , GreenNodeDetails } ;
1919use cairo_lang_syntax:: node:: ids:: { GreenId , SyntaxStablePtrId } ;
2020use cairo_lang_syntax:: node:: kind:: SyntaxKind ;
21- use cairo_lang_syntax:: node:: stable_ptr:: SyntaxStablePtr ;
22- use cairo_lang_syntax:: node:: { SyntaxNode , TypedSyntaxNode , ast} ;
21+ use cairo_lang_syntax:: node:: { SyntaxNode , SyntaxNodeId , TypedSyntaxNode , ast, new_syntax_node} ;
2322use cairo_lang_utils:: Intern ;
2423use cairo_lang_utils:: ordered_hash_map:: OrderedHashMap ;
2524use salsa:: Database ;
@@ -178,8 +177,8 @@ impl<'db> DefCacheLoadingContext<'db> {
178177 for id in 0 ..self . lookups . crate_ids_lookup . len ( ) {
179178 CrateIdCached :: Other ( id) . embed ( self ) ;
180179 }
181- for id in 0 ..self . lookups . syntax_stable_ptr_ids_lookup . len ( ) {
182- SyntaxStablePtrIdCached ( id) . embed ( self ) ;
180+ for id in 0 ..self . lookups . syntax_node_lookup . len ( ) {
181+ SyntaxNodeCached ( id) . embed ( self ) ;
183182 }
184183 for id in 0 ..self . lookups . submodule_ids_lookup . len ( ) {
185184 SubmoduleIdCached ( id) . embed ( self ) ;
@@ -244,7 +243,7 @@ impl DerefMut for DefCacheLoadingContext<'_> {
244243pub struct DefCacheLoadingData < ' db > {
245244 green_ids : OrderedHashMap < GreenIdCached , GreenId < ' db > > ,
246245 crate_ids : OrderedHashMap < CrateIdCached , CrateId < ' db > > ,
247- syntax_stable_ptr_ids : OrderedHashMap < SyntaxStablePtrIdCached , SyntaxStablePtrId < ' db > > ,
246+ syntax_nodes : OrderedHashMap < SyntaxNodeCached , SyntaxNode < ' db > > ,
248247 submodule_ids : OrderedHashMap < SubmoduleIdCached , SubmoduleId < ' db > > ,
249248 constant_ids : OrderedHashMap < ConstantIdCached , ConstantId < ' db > > ,
250249 use_ids : OrderedHashMap < UseIdCached , UseId < ' db > > ,
@@ -270,7 +269,7 @@ impl<'db> DefCacheLoadingData<'db> {
270269 fn new ( lookups : DefCacheLookups , self_crate_id : CrateId < ' db > ) -> Self {
271270 Self {
272271 green_ids : OrderedHashMap :: default ( ) ,
273- syntax_stable_ptr_ids : OrderedHashMap :: default ( ) ,
272+ syntax_nodes : OrderedHashMap :: default ( ) ,
274273 crate_ids : OrderedHashMap :: default ( ) ,
275274 submodule_ids : OrderedHashMap :: default ( ) ,
276275 constant_ids : OrderedHashMap :: default ( ) ,
@@ -359,7 +358,7 @@ pub struct DefCacheSavingData<'db> {
359358 macro_declaration_ids : OrderedHashMap < MacroDeclarationId < ' db > , MacroDeclarationIdCached > ,
360359 macro_call_ids : OrderedHashMap < MacroCallId < ' db > , MacroCallIdCached > ,
361360
362- syntax_stable_ptr_ids : OrderedHashMap < SyntaxStablePtrId < ' db > , SyntaxStablePtrIdCached > ,
361+ syntax_nodes : OrderedHashMap < SyntaxNode < ' db > , SyntaxNodeCached > ,
363362 file_ids : OrderedHashMap < FileId < ' db > , FileIdCached > ,
364363
365364 pub lookups : DefCacheLookups ,
@@ -647,7 +646,6 @@ impl<'db> ModuleDataCached<'db> {
647646pub struct DefCacheLookups {
648647 green_ids_lookup : Vec < GreenNodeCached > ,
649648 crate_ids_lookup : Vec < CrateCached > ,
650- syntax_stable_ptr_ids_lookup : Vec < SyntaxStablePtrCached > ,
651649 submodule_ids_lookup : Vec < SubmoduleCached > ,
652650 constant_ids_lookup : Vec < ConstantCached > ,
653651 use_ids_lookup : Vec < UseCached > ,
@@ -664,6 +662,7 @@ pub struct DefCacheLookups {
664662 macro_declaration_ids_lookup : Vec < MacroDeclarationCached > ,
665663 macro_call_ids_lookup : Vec < MacroCallCached > ,
666664
665+ syntax_node_lookup : Vec < SyntaxNodeInnerCached > ,
667666 file_ids_lookup : Vec < FileCached > ,
668667}
669668
@@ -1631,34 +1630,72 @@ impl GlobalUseIdCached {
16311630 }
16321631}
16331632
1633+ #[ derive( Serialize , Deserialize , Clone , Copy , Hash , Eq , PartialEq , salsa:: Update ) ]
1634+ struct SyntaxNodeCached ( usize ) ;
1635+
16341636#[ derive( Serialize , Deserialize , Clone , Hash , Eq , PartialEq ) ]
1635- struct SyntaxNodeCached ( Box < SyntaxNodeInnerCached > ) ;
1637+ enum SyntaxNodeIdCached {
1638+ Root ( FileIdCached ) ,
1639+ Child { parent : SyntaxNodeCached , key_fields : Vec < GreenIdCached > , index : usize } ,
1640+ }
1641+
1642+ impl SyntaxNodeIdCached {
1643+ fn new < ' db > ( ctx : & mut DefCacheSavingContext < ' db > , id : & SyntaxNodeId < ' db > ) -> Self {
1644+ match id {
1645+ SyntaxNodeId :: Root ( file_id) => Self :: Root ( FileIdCached :: new ( * file_id, ctx) ) ,
1646+ SyntaxNodeId :: Child { parent, key_fields, index } => Self :: Child {
1647+ parent : SyntaxNodeCached :: new ( * parent, ctx) ,
1648+ key_fields : key_fields. into_iter ( ) . map ( |id| GreenIdCached :: new ( * id, ctx) ) . collect ( ) ,
1649+ index : * index,
1650+ } ,
1651+ }
1652+ }
1653+
1654+ fn embed < ' db > ( & self , ctx : & mut DefCacheLoadingContext < ' db > ) -> SyntaxNodeId < ' db > {
1655+ match self {
1656+ SyntaxNodeIdCached :: Root ( file_id) => SyntaxNodeId :: Root ( file_id. embed ( ctx) ) ,
1657+ SyntaxNodeIdCached :: Child { parent, key_fields, index } => SyntaxNodeId :: Child {
1658+ parent : parent. embed ( ctx) ,
1659+ key_fields : Box :: from_iter ( key_fields. iter ( ) . map ( |id| id. embed ( ctx) ) ) ,
1660+ index : * index,
1661+ } ,
1662+ }
1663+ }
1664+ }
16361665
16371666#[ derive( Serialize , Deserialize , Clone , Hash , Eq , PartialEq ) ]
16381667struct SyntaxNodeInnerCached {
16391668 green : GreenIdCached ,
16401669 offset : TextOffset ,
1641- parent : Option < SyntaxNodeCached > ,
1642- stable_ptr : SyntaxStablePtrIdCached ,
1670+ id : SyntaxNodeIdCached ,
16431671}
16441672
16451673impl SyntaxNodeCached {
16461674 fn new < ' db > ( syntax_node : SyntaxNode < ' db > , ctx : & mut DefCacheSavingContext < ' db > ) -> Self {
16471675 let db = ctx. db ;
16481676 let green = GreenIdCached :: new ( syntax_node. green_node ( db) . clone ( ) . intern ( db) , ctx) ;
1649- let parent = syntax_node. parent ( db) . map ( |it| Self :: new ( it, ctx) ) ;
1650- let stable_ptr = SyntaxStablePtrIdCached :: new ( syntax_node. stable_ptr ( db) , ctx) ;
1677+ let id = SyntaxNodeIdCached :: new ( ctx, syntax_node. raw_id ( db) ) ;
16511678 let offset = syntax_node. offset ( db) ;
1652- let inner = SyntaxNodeInnerCached { green, offset, parent, stable_ptr } ;
1653- SyntaxNodeCached ( Box :: new ( inner) )
1679+ let inner = SyntaxNodeInnerCached { green, offset, id } ;
1680+ let cached_node = SyntaxNodeCached ( ctx. syntax_node_lookup . len ( ) ) ;
1681+ ctx. syntax_node_lookup . push ( inner) ;
1682+ ctx. syntax_nodes . insert ( syntax_node, cached_node) ;
1683+ cached_node
16541684 }
16551685 fn embed < ' db > ( & self , ctx : & mut DefCacheLoadingContext < ' db > ) -> SyntaxNode < ' db > {
1656- let inner = self . 0 . as_ref ( ) ;
1686+ if let Some ( node) = ctx. syntax_nodes . get ( self ) {
1687+ return * node;
1688+ }
1689+ let inner = ctx. syntax_node_lookup [ self . 0 ] . clone ( ) ;
16571690 let green = inner. green . embed ( ctx) ;
1658- let parent = inner. parent . as_ref ( ) . map ( |it| it. embed ( ctx) ) ;
1659- let stable_ptr = inner. stable_ptr . embed ( ctx) ;
1691+ let id = inner. id . embed ( ctx) ;
16601692 let offset = inner. offset ;
1661- SyntaxNode :: new_with_inner ( ctx. db , green, offset, parent, stable_ptr)
1693+ let node = new_syntax_node ( ctx. db , green, offset, id) ;
1694+ ctx. syntax_nodes . insert ( * self , node) ;
1695+ node
1696+ }
1697+ fn get_embedded < ' db > ( & self , data : & Arc < DefCacheLoadingData < ' db > > ) -> SyntaxNode < ' db > {
1698+ data. syntax_nodes [ self ]
16621699 }
16631700}
16641701
@@ -1698,92 +1735,6 @@ impl LanguageElementCached {
16981735 }
16991736}
17001737
1701- #[ derive( Serialize , Deserialize , Clone , PartialEq , Eq ) ]
1702- enum SyntaxStablePtrCached {
1703- /// The root node of the tree.
1704- Root ( FileIdCached , GreenIdCached ) ,
1705- /// A child node.
1706- Child {
1707- /// The parent of the node.
1708- parent : SyntaxStablePtrIdCached ,
1709- /// The SyntaxKind of the node.
1710- kind : SyntaxKind ,
1711- /// A list of field values for this node, to index by.
1712- /// Which fields are used is determined by each SyntaxKind.
1713- /// For example, a function item might use the name of the function.
1714- key_fields : Vec < GreenIdCached > ,
1715- /// Chronological index among all nodes with the same (parent, kind, key_fields).
1716- index : usize ,
1717- } ,
1718- }
1719-
1720- impl SyntaxStablePtrCached {
1721- fn new < ' db > (
1722- syntax_stable_ptr : SyntaxStablePtr < ' db > ,
1723- ctx : & mut DefCacheSavingContext < ' db > ,
1724- ) -> Self {
1725- match syntax_stable_ptr {
1726- SyntaxStablePtr :: Root ( root, green_id) => SyntaxStablePtrCached :: Root (
1727- FileIdCached :: new ( root, ctx) ,
1728- GreenIdCached :: new ( green_id, ctx) ,
1729- ) ,
1730- SyntaxStablePtr :: Child { parent, kind, key_fields, index } => {
1731- SyntaxStablePtrCached :: Child {
1732- parent : SyntaxStablePtrIdCached :: new ( parent, ctx) ,
1733- kind,
1734- key_fields : key_fields
1735- . iter ( )
1736- . map ( |field| GreenIdCached :: new ( * field, ctx) )
1737- . collect ( ) ,
1738- index,
1739- }
1740- }
1741- }
1742- }
1743- fn embed < ' db > ( self , ctx : & mut DefCacheLoadingContext < ' db > ) -> SyntaxStablePtr < ' db > {
1744- match self {
1745- SyntaxStablePtrCached :: Root ( file, green_id) => {
1746- SyntaxStablePtr :: Root ( file. embed ( ctx) , green_id. embed ( ctx) )
1747- }
1748- SyntaxStablePtrCached :: Child { parent, kind, key_fields, index } => {
1749- SyntaxStablePtr :: Child {
1750- parent : parent. embed ( ctx) ,
1751- kind,
1752- key_fields : key_fields. into_iter ( ) . map ( |field| field. embed ( ctx) ) . collect ( ) ,
1753- index,
1754- }
1755- }
1756- }
1757- }
1758- }
1759-
1760- #[ derive( Serialize , Deserialize , Copy , Clone , PartialEq , Eq , Hash , salsa:: Update ) ]
1761- pub struct SyntaxStablePtrIdCached ( usize ) ;
1762- impl SyntaxStablePtrIdCached {
1763- pub fn new < ' db > ( id : SyntaxStablePtrId < ' db > , ctx : & mut DefCacheSavingContext < ' db > ) -> Self {
1764- if let Some ( cached_id) = ctx. syntax_stable_ptr_ids . get ( & id) {
1765- return * cached_id;
1766- }
1767- let cached = SyntaxStablePtrCached :: new ( id. long ( ctx. db ) . clone ( ) , ctx) ;
1768- let cached_id = SyntaxStablePtrIdCached ( ctx. syntax_stable_ptr_ids_lookup . len ( ) ) ;
1769- ctx. syntax_stable_ptr_ids_lookup . push ( cached) ;
1770- ctx. syntax_stable_ptr_ids . insert ( id, cached_id) ;
1771- cached_id
1772- }
1773- fn embed < ' db > ( self , ctx : & mut DefCacheLoadingContext < ' db > ) -> SyntaxStablePtrId < ' db > {
1774- if let Some ( id) = ctx. syntax_stable_ptr_ids . get ( & self ) {
1775- return * id;
1776- }
1777- let cached = ctx. syntax_stable_ptr_ids_lookup [ self . 0 ] . clone ( ) ;
1778- let id = cached. embed ( ctx) . intern ( ctx. db ) ;
1779- ctx. syntax_stable_ptr_ids . insert ( self , id) ;
1780- id
1781- }
1782- pub fn get_embedded < ' db > ( self , data : & Arc < DefCacheLoadingData < ' db > > ) -> SyntaxStablePtrId < ' db > {
1783- data. syntax_stable_ptr_ids [ & self ]
1784- }
1785- }
1786-
17871738#[ derive( Serialize , Deserialize , Clone , PartialEq , Eq ) ]
17881739enum GreenNodeDetailsCached {
17891740 Token ( String ) ,
@@ -1952,6 +1903,29 @@ impl VirtualFileCached {
19521903 }
19531904}
19541905
1906+ #[ derive( Serialize , Deserialize , Clone , Copy , Eq , Hash , PartialEq , salsa:: Update ) ]
1907+ pub struct SyntaxStablePtrIdCached ( SyntaxNodeCached ) ;
1908+
1909+ impl SyntaxStablePtrIdCached {
1910+ pub fn new < ' db > (
1911+ stable_ptr : SyntaxStablePtrId < ' db > ,
1912+ ctx : & mut DefCacheSavingContext < ' db > ,
1913+ ) -> Self {
1914+ Self ( SyntaxNodeCached :: new ( stable_ptr. 0 , ctx) )
1915+ }
1916+
1917+ fn embed < ' db > ( self , ctx : & mut DefCacheLoadingContext < ' db > ) -> SyntaxStablePtrId < ' db > {
1918+ SyntaxStablePtrId ( self . 0 . embed ( ctx) )
1919+ }
1920+
1921+ pub fn get_embedded < ' db > (
1922+ & self ,
1923+ data : & Arc < DefCacheLoadingData < ' db > > ,
1924+ ) -> SyntaxStablePtrId < ' db > {
1925+ SyntaxStablePtrId ( self . 0 . get_embedded ( data) )
1926+ }
1927+ }
1928+
19551929#[ derive( Serialize , Deserialize , Clone , PartialEq , Eq ) ]
19561930struct PluginGeneratedFileCached {
19571931 module_id : ModuleIdCached ,
0 commit comments