Skip to content

Commit 4bc8ba0

Browse files
authored
Merge pull request #171 from milianw/optimize-children-iteration
Optimize children iteration by reusing NodeData if possible
2 parents ee37be7 + ab5463e commit 4bc8ba0

File tree

2 files changed

+368
-11
lines changed

2 files changed

+368
-11
lines changed

src/api.rs

+55
Original file line numberDiff line numberDiff line change
@@ -148,27 +148,64 @@ impl<L: Language> SyntaxNode<L> {
148148
pub fn first_child(&self) -> Option<SyntaxNode<L>> {
149149
self.raw.first_child().map(Self::from)
150150
}
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+
151158
pub fn last_child(&self) -> Option<SyntaxNode<L>> {
152159
self.raw.last_child().map(Self::from)
153160
}
154161

155162
pub fn first_child_or_token(&self) -> Option<SyntaxElement<L>> {
156163
self.raw.first_child_or_token().map(NodeOrToken::from)
157164
}
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+
158175
pub fn last_child_or_token(&self) -> Option<SyntaxElement<L>> {
159176
self.raw.last_child_or_token().map(NodeOrToken::from)
160177
}
161178

162179
pub fn next_sibling(&self) -> Option<SyntaxNode<L>> {
163180
self.raw.next_sibling().map(Self::from)
164181
}
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+
165192
pub fn prev_sibling(&self) -> Option<SyntaxNode<L>> {
166193
self.raw.prev_sibling().map(Self::from)
167194
}
168195

169196
pub fn next_sibling_or_token(&self) -> Option<SyntaxElement<L>> {
170197
self.raw.next_sibling_or_token().map(NodeOrToken::from)
171198
}
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+
172209
pub fn prev_sibling_or_token(&self) -> Option<SyntaxElement<L>> {
173210
self.raw.prev_sibling_or_token().map(NodeOrToken::from)
174211
}
@@ -403,6 +440,15 @@ impl<L: Language> Iterator for SyntaxNodeChildren<L> {
403440
}
404441
}
405442

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+
406452
#[derive(Debug, Clone)]
407453
pub struct SyntaxElementChildren<L: Language> {
408454
raw: cursor::SyntaxElementChildren,
@@ -416,6 +462,15 @@ impl<L: Language> Iterator for SyntaxElementChildren<L> {
416462
}
417463
}
418464

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+
419474
pub struct Preorder<L: Language> {
420475
raw: cursor::Preorder,
421476
_p: PhantomData<L>,

0 commit comments

Comments
 (0)