Skip to content

Commit 5e44fa2

Browse files
Making Stable Syntax Pointers just a wrapper around syntax nodes
1 parent 899e353 commit 5e44fa2

File tree

10 files changed

+266
-458
lines changed

10 files changed

+266
-458
lines changed

Cargo.lock

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

crates/cairo-lang-defs/src/cache/mod.rs

Lines changed: 79 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ use cairo_lang_syntax::node::ast::{
1818
use cairo_lang_syntax::node::green::{GreenNode, GreenNodeDetails};
1919
use cairo_lang_syntax::node::ids::{GreenId, SyntaxStablePtrId};
2020
use 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};
2322
use cairo_lang_utils::Intern;
2423
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
2524
use 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<'_> {
244243
pub 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> {
647646
pub 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)]
16381667
struct SyntaxNodeInnerCached {
16391668
green: GreenIdCached,
16401669
offset: TextOffset,
1641-
parent: Option<SyntaxNodeCached>,
1642-
stable_ptr: SyntaxStablePtrIdCached,
1670+
id: SyntaxNodeIdCached,
16431671
}
16441672

16451673
impl 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)]
17881739
enum 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)]
19561930
struct PluginGeneratedFileCached {
19571931
module_id: ModuleIdCached,

0 commit comments

Comments
 (0)