Skip to content

Commit 2fb49ce

Browse files
Keeping SyntaNode's kind and parent kind for optimization
1 parent c071884 commit 2fb49ce

File tree

2 files changed

+26
-11
lines changed
  • crates
    • cairo-lang-defs/src/cache
    • cairo-lang-syntax/src/node

2 files changed

+26
-11
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1680,7 +1680,8 @@ impl SyntaxNodeCached {
16801680
let green = inner.green.embed(ctx);
16811681
let id = inner.id.embed(ctx);
16821682
let offset = inner.offset;
1683-
let node = new_syntax_node(ctx.db, green, offset, id);
1683+
let kind = green.long(ctx.db).kind;
1684+
let node = new_syntax_node(ctx.db, green, offset, id, kind);
16841685
ctx.syntax_nodes.insert(*self, node);
16851686
node
16861687
}

crates/cairo-lang-syntax/src/node/mod.rs

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ pub struct SyntaxNode<'a> {
9696
data: SyntaxNodeData<'a>,
9797
/// Cached parent data to avoid database lookups. None for root nodes.
9898
parent: Option<SyntaxNodeData<'a>>,
99+
/// Cached kind to avoid database lookups.
100+
kind: SyntaxKind,
101+
/// Cached parent kind to avoid database lookups. None for root nodes.
102+
parent_kind: Option<SyntaxKind>,
99103
}
100104

101105
impl<'db> std::fmt::Debug for SyntaxNode<'db> {
@@ -206,20 +210,22 @@ pub fn new_syntax_node<'db>(
206210
green: GreenId<'db>,
207211
offset: TextOffset,
208212
id: SyntaxNodeId<'db>,
213+
kind: SyntaxKind,
209214
) -> SyntaxNode<'db> {
210-
let parent = match &id {
211-
SyntaxNodeId::Child { parent, .. } => Some(parent.data),
212-
SyntaxNodeId::Root(_) => None,
215+
let (parent, parent_kind) = match &id {
216+
SyntaxNodeId::Child { parent, .. } => (Some(parent.data), Some(parent.kind)),
217+
SyntaxNodeId::Root(_) => (None, None),
213218
};
214219
let data = SyntaxNodeData::new(db, green, offset, id);
215-
SyntaxNode { data, parent }
220+
SyntaxNode { data, parent, kind, parent_kind }
216221
}
217222

218223
// Construction methods
219224
impl<'a> SyntaxNode<'a> {
220225
/// Create a new root syntax node.
221226
pub fn new_root(db: &'a dyn Database, file_id: FileId<'a>, green: GreenId<'a>) -> Self {
222-
new_syntax_node(db, green, TextOffset::START, SyntaxNodeId::Root(file_id))
227+
let kind = green.long(db).kind;
228+
new_syntax_node(db, green, TextOffset::START, SyntaxNodeId::Root(file_id), kind)
223229
}
224230

225231
/// Create a new root syntax node with a custom initial offset.
@@ -229,7 +235,14 @@ impl<'a> SyntaxNode<'a> {
229235
green: GreenId<'a>,
230236
initial_offset: Option<TextOffset>,
231237
) -> Self {
232-
new_syntax_node(db, green, initial_offset.unwrap_or_default(), SyntaxNodeId::Root(file_id))
238+
let kind = green.long(db).kind;
239+
new_syntax_node(
240+
db,
241+
green,
242+
initial_offset.unwrap_or_default(),
243+
SyntaxNodeId::Root(file_id),
244+
kind,
245+
)
233246
}
234247

235248
// Basic accessors
@@ -240,8 +253,8 @@ impl<'a> SyntaxNode<'a> {
240253
}
241254

242255
/// Get the syntax kind of this node.
243-
pub fn kind(&self, db: &dyn Database) -> SyntaxKind {
244-
self.green_node(db).kind
256+
pub fn kind(&self, _db: &dyn Database) -> SyntaxKind {
257+
self.kind
245258
}
246259

247260
/// Get the span of this syntax node.
@@ -310,6 +323,7 @@ impl<'a> SyntaxNode<'a> {
310323
*green_id,
311324
offset,
312325
SyntaxNodeId::Child { parent: *self, index, key_fields: Box::from(key_fields) },
326+
kind,
313327
));
314328

315329
offset = offset.add_width(width);
@@ -553,8 +567,8 @@ impl<'a> SyntaxNode<'a> {
553567
}
554568

555569
/// Gets the kind of the given node's parent if it exists.
556-
pub fn parent_kind(&self, db: &dyn Database) -> Option<SyntaxKind> {
557-
Some(self.parent?.green(db).long(db).kind)
570+
pub fn parent_kind(&self, _db: &dyn Database) -> Option<SyntaxKind> {
571+
self.parent_kind
558572
}
559573

560574
/// Gets the kind of the given node's grandparent if it exists.

0 commit comments

Comments
 (0)