Skip to content

Commit ef2bd29

Browse files
Making Stable Syntax Pointers just a wrapper around syntax nodes
1 parent 3b0503b commit ef2bd29

File tree

10 files changed

+246
-435
lines changed

10 files changed

+246
-435
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: 62 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ 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;
2221
use cairo_lang_syntax::node::{SyntaxNode, TypedSyntaxNode, ast};
2322
use cairo_lang_utils::Intern;
2423
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
24+
use itertools::Either;
2525
use salsa::Database;
2626
use 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<'_> {
244244
pub 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> {
647647
pub 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)]
15731573
struct 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

15801581
impl 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)]
17231656
enum 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)]
18911847
struct PluginGeneratedFileCached {
18921848
module_id: ModuleIdCached,

0 commit comments

Comments
 (0)