@@ -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
101105impl < ' 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
219224impl < ' 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