@@ -18,10 +18,10 @@ 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 ; 
2221use  cairo_lang_syntax:: node:: { SyntaxNode ,  TypedSyntaxNode ,  ast} ; 
2322use  cairo_lang_utils:: Intern ; 
2423use  cairo_lang_utils:: ordered_hash_map:: OrderedHashMap ; 
24+ use  itertools:: Either ; 
2525use  salsa:: Database ; 
2626use  serde:: { Deserialize ,  Serialize } ; 
2727
@@ -178,8 +178,8 @@ impl<'db> DefCacheLoadingContext<'db> {
178178        for  id in  0 ..self . lookups . crate_ids_lookup . len ( )  { 
179179            CrateIdCached :: Other ( id) . embed ( self ) ; 
180180        } 
181-         for  id in  0 ..self . lookups . syntax_stable_ptr_ids_lookup . len ( )  { 
182-             SyntaxStablePtrIdCached ( id) . embed ( self ) ; 
181+         for  id in  0 ..self . lookups . syntax_node_lookup . len ( )  { 
182+             SyntaxNodeCached ( id) . embed ( self ) ; 
183183        } 
184184        for  id in  0 ..self . lookups . submodule_ids_lookup . len ( )  { 
185185            SubmoduleIdCached ( id) . embed ( self ) ; 
@@ -244,7 +244,7 @@ impl DerefMut for DefCacheLoadingContext<'_> {
244244pub  struct  DefCacheLoadingData < ' db >  { 
245245    green_ids :  OrderedHashMap < GreenIdCached ,  GreenId < ' db > > , 
246246    crate_ids :  OrderedHashMap < CrateIdCached ,  CrateId < ' db > > , 
247-     syntax_stable_ptr_ids :  OrderedHashMap < SyntaxStablePtrIdCached ,   SyntaxStablePtrId < ' db > > , 
247+     syntax_nodes :  OrderedHashMap < SyntaxNodeCached ,   SyntaxNode < ' db > > , 
248248    submodule_ids :  OrderedHashMap < SubmoduleIdCached ,  SubmoduleId < ' db > > , 
249249    constant_ids :  OrderedHashMap < ConstantIdCached ,  ConstantId < ' db > > , 
250250    use_ids :  OrderedHashMap < UseIdCached ,  UseId < ' db > > , 
@@ -270,7 +270,7 @@ impl<'db> DefCacheLoadingData<'db> {
270270    fn  new ( lookups :  DefCacheLookups ,  self_crate_id :  CrateId < ' db > )  -> Self  { 
271271        Self  { 
272272            green_ids :  OrderedHashMap :: default ( ) , 
273-             syntax_stable_ptr_ids :  OrderedHashMap :: default ( ) , 
273+             syntax_nodes :  OrderedHashMap :: default ( ) , 
274274            crate_ids :  OrderedHashMap :: default ( ) , 
275275            submodule_ids :  OrderedHashMap :: default ( ) , 
276276            constant_ids :  OrderedHashMap :: default ( ) , 
@@ -359,7 +359,7 @@ pub struct DefCacheSavingData<'db> {
359359    macro_declaration_ids :  OrderedHashMap < MacroDeclarationId < ' db > ,  MacroDeclarationIdCached > , 
360360    macro_call_ids :  OrderedHashMap < MacroCallId < ' db > ,  MacroCallIdCached > , 
361361
362-     syntax_stable_ptr_ids :  OrderedHashMap < SyntaxStablePtrId < ' db > ,  SyntaxStablePtrIdCached > , 
362+     syntax_nodes :  OrderedHashMap < SyntaxNode < ' db > ,  SyntaxNodeCached > , 
363363    file_ids :  OrderedHashMap < FileId < ' db > ,  FileIdCached > , 
364364
365365    pub  lookups :  DefCacheLookups , 
@@ -647,7 +647,6 @@ impl<'db> ModuleDataCached<'db> {
647647pub  struct  DefCacheLookups  { 
648648    green_ids_lookup :  Vec < GreenNodeCached > , 
649649    crate_ids_lookup :  Vec < CrateCached > , 
650-     syntax_stable_ptr_ids_lookup :  Vec < SyntaxStablePtrCached > , 
651650    submodule_ids_lookup :  Vec < SubmoduleCached > , 
652651    constant_ids_lookup :  Vec < ConstantCached > , 
653652    use_ids_lookup :  Vec < UseCached > , 
@@ -664,6 +663,7 @@ pub struct DefCacheLookups {
664663    macro_declaration_ids_lookup :  Vec < MacroDeclarationCached > , 
665664    macro_call_ids_lookup :  Vec < MacroCallCached > , 
666665
666+     syntax_node_lookup :  Vec < SyntaxNodeInnerCached > , 
667667    file_ids_lookup :  Vec < FileCached > , 
668668} 
669669
@@ -1566,34 +1566,53 @@ impl GlobalUseIdCached {
15661566    } 
15671567} 
15681568
1569- #[ derive( Serialize ,  Deserialize ,  Clone ,  Hash ,  Eq ,  PartialEq ) ]  
1570- struct  SyntaxNodeCached ( Box < SyntaxNodeInnerCached > ) ; 
1569+ #[ derive( Serialize ,  Deserialize ,  Clone ,  Copy ,   Hash ,  Eq ,  PartialEq ,  salsa :: Update ) ]  
1570+ struct  SyntaxNodeCached ( usize ) ; 
15711571
1572- #[ derive( Serialize ,  Deserialize ,  Clone ,  Hash ,  Eq ,  PartialEq ) ]  
1572+ #[ derive( Serialize ,  Deserialize ,  Clone ,  Hash ,  Eq ,  PartialEq ,  salsa :: Update ) ]  
15731573struct  SyntaxNodeInnerCached  { 
15741574    green :  GreenIdCached , 
15751575    offset :  TextOffset , 
1576-     parent :  Option < SyntaxNodeCached > , 
1577-     stable_ptr :  SyntaxStablePtrIdCached , 
1576+     // TODO(eytan-starkware): Using result for serde implementation. Change this to Either. 
1577+     parent :  Result < SyntaxNodeCached ,  FileIdCached > , 
1578+     index :  usize , 
15781579} 
15791580
15801581impl  SyntaxNodeCached  { 
15811582    fn  new < ' db > ( syntax_node :  SyntaxNode < ' db > ,  ctx :  & mut  DefCacheSavingContext < ' db > )  -> Self  { 
15821583        let  db = ctx. db ; 
15831584        let  green = GreenIdCached :: new ( syntax_node. green_node ( db) . clone ( ) . intern ( db) ,  ctx) ; 
1584-         let  parent = syntax_node. parent ( db) . map ( |it| Self :: new ( it,  ctx) ) ; 
1585-         let  stable_ptr = SyntaxStablePtrIdCached :: new ( syntax_node. stable_ptr ( db) ,  ctx) ; 
1585+         let  parent = syntax_node. raw_parent ( db) ; 
1586+         let  parent_res = match  parent { 
1587+             Either :: Left ( parent)  => Ok ( SyntaxNodeCached :: new ( parent,  ctx) ) , 
1588+             Either :: Right ( file_id)  => Err ( FileIdCached :: new ( file_id,  ctx) ) , 
1589+         } ; 
15861590        let  offset = syntax_node. offset ( db) ; 
1587-         let  inner = SyntaxNodeInnerCached  {  green,  offset,  parent,  stable_ptr } ; 
1588-         SyntaxNodeCached ( Box :: new ( inner) ) 
1591+         let  index = syntax_node. index ( db) ; 
1592+         let  inner = SyntaxNodeInnerCached  {  green,  offset,  parent :  parent_res,  index } ; 
1593+         let  cached_node = SyntaxNodeCached ( ctx. syntax_node_lookup . len ( ) ) ; 
1594+         ctx. syntax_node_lookup . push ( inner) ; 
1595+         ctx. syntax_nodes . insert ( syntax_node,  cached_node) ; 
1596+         cached_node
15891597    } 
15901598    fn  embed < ' db > ( & self ,  ctx :  & mut  DefCacheLoadingContext < ' db > )  -> SyntaxNode < ' db >  { 
1591-         let  inner = self . 0 . as_ref ( ) ; 
1599+         if  let  Some ( node)  = ctx. syntax_nodes . get ( self )  { 
1600+             return  * node; 
1601+         } 
1602+         let  inner = ctx. syntax_node_lookup [ self . 0 ] . clone ( ) ; 
15921603        let  green = inner. green . embed ( ctx) ; 
1593-         let  parent = inner. parent . as_ref ( ) . map ( |it| it. embed ( ctx) ) ; 
1594-         let  stable_ptr = inner. stable_ptr . embed ( ctx) ; 
1604+         let  parent = match  & inner. parent  { 
1605+             Ok ( parent)  => Either :: Left ( parent. embed ( ctx) ) , 
1606+             Err ( file_id)  => Either :: Right ( file_id. embed ( ctx) ) , 
1607+         } ; 
15951608        let  offset = inner. offset ; 
1596-         SyntaxNode :: new_with_inner ( ctx. db ,  green,  offset,  parent,  stable_ptr) 
1609+         let  index = inner. index ; 
1610+         let  node = SyntaxNode :: new_with_inner ( ctx. db ,  green,  offset,  parent,  index) ; 
1611+         ctx. syntax_nodes . insert ( * self ,  node) ; 
1612+         node
1613+     } 
1614+     fn  get_embedded < ' db > ( & self ,  data :  & Arc < DefCacheLoadingData < ' db > > )  -> SyntaxNode < ' db >  { 
1615+         data. syntax_nodes [ self ] 
15971616    } 
15981617} 
15991618
@@ -1633,92 +1652,6 @@ impl LanguageElementCached {
16331652    } 
16341653} 
16351654
1636- #[ derive( Serialize ,  Deserialize ,  Clone ,  PartialEq ,  Eq ) ]  
1637- enum  SyntaxStablePtrCached  { 
1638-     /// The root node of the tree. 
1639- Root ( FileIdCached ,  GreenIdCached ) , 
1640-     /// A child node. 
1641- Child  { 
1642-         /// The parent of the node. 
1643- parent :  SyntaxStablePtrIdCached , 
1644-         /// The SyntaxKind of the node. 
1645- kind :  SyntaxKind , 
1646-         /// A list of field values for this node, to index by. 
1647- /// Which fields are used is determined by each SyntaxKind. 
1648- /// For example, a function item might use the name of the function. 
1649- key_fields :  Vec < GreenIdCached > , 
1650-         /// Chronological index among all nodes with the same (parent, kind, key_fields). 
1651- index :  usize , 
1652-     } , 
1653- } 
1654- 
1655- impl  SyntaxStablePtrCached  { 
1656-     fn  new < ' db > ( 
1657-         syntax_stable_ptr :  SyntaxStablePtr < ' db > , 
1658-         ctx :  & mut  DefCacheSavingContext < ' db > , 
1659-     )  -> Self  { 
1660-         match  syntax_stable_ptr { 
1661-             SyntaxStablePtr :: Root ( root,  green_id)  => SyntaxStablePtrCached :: Root ( 
1662-                 FileIdCached :: new ( root,  ctx) , 
1663-                 GreenIdCached :: new ( green_id,  ctx) , 
1664-             ) , 
1665-             SyntaxStablePtr :: Child  {  parent,  kind,  key_fields,  index }  => { 
1666-                 SyntaxStablePtrCached :: Child  { 
1667-                     parent :  SyntaxStablePtrIdCached :: new ( parent,  ctx) , 
1668-                     kind, 
1669-                     key_fields :  key_fields
1670-                         . iter ( ) 
1671-                         . map ( |field| GreenIdCached :: new ( * field,  ctx) ) 
1672-                         . collect ( ) , 
1673-                     index, 
1674-                 } 
1675-             } 
1676-         } 
1677-     } 
1678-     fn  embed < ' db > ( self ,  ctx :  & mut  DefCacheLoadingContext < ' db > )  -> SyntaxStablePtr < ' db >  { 
1679-         match  self  { 
1680-             SyntaxStablePtrCached :: Root ( file,  green_id)  => { 
1681-                 SyntaxStablePtr :: Root ( file. embed ( ctx) ,  green_id. embed ( ctx) ) 
1682-             } 
1683-             SyntaxStablePtrCached :: Child  {  parent,  kind,  key_fields,  index }  => { 
1684-                 SyntaxStablePtr :: Child  { 
1685-                     parent :  parent. embed ( ctx) , 
1686-                     kind, 
1687-                     key_fields :  key_fields. into_iter ( ) . map ( |field| field. embed ( ctx) ) . collect ( ) , 
1688-                     index, 
1689-                 } 
1690-             } 
1691-         } 
1692-     } 
1693- } 
1694- 
1695- #[ derive( Serialize ,  Deserialize ,  Copy ,  Clone ,  PartialEq ,  Eq ,  Hash ,  salsa:: Update ) ]  
1696- pub  struct  SyntaxStablePtrIdCached ( usize ) ; 
1697- impl  SyntaxStablePtrIdCached  { 
1698-     pub  fn  new < ' db > ( id :  SyntaxStablePtrId < ' db > ,  ctx :  & mut  DefCacheSavingContext < ' db > )  -> Self  { 
1699-         if  let  Some ( cached_id)  = ctx. syntax_stable_ptr_ids . get ( & id)  { 
1700-             return  * cached_id; 
1701-         } 
1702-         let  cached = SyntaxStablePtrCached :: new ( id. long ( ctx. db ) . clone ( ) ,  ctx) ; 
1703-         let  cached_id = SyntaxStablePtrIdCached ( ctx. syntax_stable_ptr_ids_lookup . len ( ) ) ; 
1704-         ctx. syntax_stable_ptr_ids_lookup . push ( cached) ; 
1705-         ctx. syntax_stable_ptr_ids . insert ( id,  cached_id) ; 
1706-         cached_id
1707-     } 
1708-     fn  embed < ' db > ( self ,  ctx :  & mut  DefCacheLoadingContext < ' db > )  -> SyntaxStablePtrId < ' db >  { 
1709-         if  let  Some ( id)  = ctx. syntax_stable_ptr_ids . get ( & self )  { 
1710-             return  * id; 
1711-         } 
1712-         let  cached = ctx. syntax_stable_ptr_ids_lookup [ self . 0 ] . clone ( ) ; 
1713-         let  id = cached. embed ( ctx) . intern ( ctx. db ) ; 
1714-         ctx. syntax_stable_ptr_ids . insert ( self ,  id) ; 
1715-         id
1716-     } 
1717-     pub  fn  get_embedded < ' db > ( self ,  data :  & Arc < DefCacheLoadingData < ' db > > )  -> SyntaxStablePtrId < ' db >  { 
1718-         data. syntax_stable_ptr_ids [ & self ] 
1719-     } 
1720- } 
1721- 
17221655#[ derive( Serialize ,  Deserialize ,  Clone ,  PartialEq ,  Eq ) ]  
17231656enum  GreenNodeDetailsCached  { 
17241657    Token ( String ) , 
@@ -1887,6 +1820,29 @@ impl VirtualFileCached {
18871820    } 
18881821} 
18891822
1823+ #[ derive( Serialize ,  Deserialize ,  Clone ,  Copy ,  Eq ,  Hash ,  PartialEq ,  salsa:: Update ) ]  
1824+ pub  struct  SyntaxStablePtrIdCached ( SyntaxNodeCached ) ; 
1825+ 
1826+ impl  SyntaxStablePtrIdCached  { 
1827+     pub  fn  new < ' db > ( 
1828+         stable_ptr :  SyntaxStablePtrId < ' db > , 
1829+         ctx :  & mut  DefCacheSavingContext < ' db > , 
1830+     )  -> Self  { 
1831+         Self ( SyntaxNodeCached :: new ( stable_ptr. 0 ,  ctx) ) 
1832+     } 
1833+ 
1834+     fn  embed < ' db > ( self ,  ctx :  & mut  DefCacheLoadingContext < ' db > )  -> SyntaxStablePtrId < ' db >  { 
1835+         SyntaxStablePtrId ( self . 0 . embed ( ctx) ) 
1836+     } 
1837+ 
1838+     pub  fn  get_embedded < ' db > ( 
1839+         & self , 
1840+         data :  & Arc < DefCacheLoadingData < ' db > > , 
1841+     )  -> SyntaxStablePtrId < ' db >  { 
1842+         SyntaxStablePtrId ( self . 0 . get_embedded ( data) ) 
1843+     } 
1844+ } 
1845+ 
18901846#[ derive( Serialize ,  Deserialize ,  Clone ,  PartialEq ,  Eq ) ]  
18911847struct  PluginGeneratedFileCached  { 
18921848    module_id :  ModuleIdCached , 
0 commit comments