@@ -148,27 +148,64 @@ impl<L: Language> SyntaxNode<L> {
148
148
pub fn first_child ( & self ) -> Option < SyntaxNode < L > > {
149
149
self . raw . first_child ( ) . map ( Self :: from)
150
150
}
151
+
152
+ pub fn first_child_by_kind ( & self , matcher : & impl Fn ( L :: Kind ) -> bool ) -> Option < SyntaxNode < L > > {
153
+ self . raw
154
+ . first_child_by_kind ( & |raw_kind| matcher ( L :: kind_from_raw ( raw_kind) ) )
155
+ . map ( Self :: from)
156
+ }
157
+
151
158
pub fn last_child ( & self ) -> Option < SyntaxNode < L > > {
152
159
self . raw . last_child ( ) . map ( Self :: from)
153
160
}
154
161
155
162
pub fn first_child_or_token ( & self ) -> Option < SyntaxElement < L > > {
156
163
self . raw . first_child_or_token ( ) . map ( NodeOrToken :: from)
157
164
}
165
+
166
+ pub fn first_child_or_token_by_kind (
167
+ & self ,
168
+ matcher : & impl Fn ( L :: Kind ) -> bool ,
169
+ ) -> Option < SyntaxElement < L > > {
170
+ self . raw
171
+ . first_child_or_token_by_kind ( & |raw_kind| matcher ( L :: kind_from_raw ( raw_kind) ) )
172
+ . map ( NodeOrToken :: from)
173
+ }
174
+
158
175
pub fn last_child_or_token ( & self ) -> Option < SyntaxElement < L > > {
159
176
self . raw . last_child_or_token ( ) . map ( NodeOrToken :: from)
160
177
}
161
178
162
179
pub fn next_sibling ( & self ) -> Option < SyntaxNode < L > > {
163
180
self . raw . next_sibling ( ) . map ( Self :: from)
164
181
}
182
+
183
+ pub fn next_sibling_by_kind (
184
+ & self ,
185
+ matcher : & impl Fn ( L :: Kind ) -> bool ,
186
+ ) -> Option < SyntaxNode < L > > {
187
+ self . raw
188
+ . next_sibling_by_kind ( & |raw_kind| matcher ( L :: kind_from_raw ( raw_kind) ) )
189
+ . map ( Self :: from)
190
+ }
191
+
165
192
pub fn prev_sibling ( & self ) -> Option < SyntaxNode < L > > {
166
193
self . raw . prev_sibling ( ) . map ( Self :: from)
167
194
}
168
195
169
196
pub fn next_sibling_or_token ( & self ) -> Option < SyntaxElement < L > > {
170
197
self . raw . next_sibling_or_token ( ) . map ( NodeOrToken :: from)
171
198
}
199
+
200
+ pub fn next_sibling_or_token_by_kind (
201
+ & self ,
202
+ matcher : & impl Fn ( L :: Kind ) -> bool ,
203
+ ) -> Option < SyntaxElement < L > > {
204
+ self . raw
205
+ . next_sibling_or_token_by_kind ( & |raw_kind| matcher ( L :: kind_from_raw ( raw_kind) ) )
206
+ . map ( NodeOrToken :: from)
207
+ }
208
+
172
209
pub fn prev_sibling_or_token ( & self ) -> Option < SyntaxElement < L > > {
173
210
self . raw . prev_sibling_or_token ( ) . map ( NodeOrToken :: from)
174
211
}
@@ -403,6 +440,15 @@ impl<L: Language> Iterator for SyntaxNodeChildren<L> {
403
440
}
404
441
}
405
442
443
+ impl < L : Language > SyntaxNodeChildren < L > {
444
+ pub fn by_kind ( self , matcher : impl Fn ( L :: Kind ) -> bool ) -> impl Iterator < Item = SyntaxNode < L > > {
445
+ self . raw
446
+ . by_kind ( move |raw_kind| matcher ( L :: kind_from_raw ( raw_kind) ) )
447
+ . into_iter ( )
448
+ . map ( SyntaxNode :: from)
449
+ }
450
+ }
451
+
406
452
#[ derive( Debug , Clone ) ]
407
453
pub struct SyntaxElementChildren < L : Language > {
408
454
raw : cursor:: SyntaxElementChildren ,
@@ -416,6 +462,15 @@ impl<L: Language> Iterator for SyntaxElementChildren<L> {
416
462
}
417
463
}
418
464
465
+ impl < L : Language > SyntaxElementChildren < L > {
466
+ pub fn by_kind (
467
+ self ,
468
+ matcher : impl Fn ( L :: Kind ) -> bool ,
469
+ ) -> impl Iterator < Item = SyntaxElement < L > > {
470
+ self . raw . by_kind ( move |raw_kind| matcher ( L :: kind_from_raw ( raw_kind) ) ) . map ( NodeOrToken :: from)
471
+ }
472
+ }
473
+
419
474
pub struct Preorder < L : Language > {
420
475
raw : cursor:: Preorder ,
421
476
_p : PhantomData < L > ,
0 commit comments