use crate::{SyntaxKind, SyntaxNode, SyntaxToken};
use super::AstNode;
pub(super) fn child<N: AstNode>(parent: &SyntaxNode) -> Option<N> {
parent.children().find_map(N::cast)
}
pub(super) fn children<N: AstNode>(parent: &SyntaxNode) -> impl Iterator<Item = N> {
parent.children().filter_map(N::cast)
}
pub(super) fn token(parent: &SyntaxNode, kind: SyntaxKind) -> Option<SyntaxToken> {
parent
.children_with_tokens()
.filter_map(rowan::NodeOrToken::into_token)
.find(|tok| tok.kind() == kind)
}
pub(super) fn ident_or_keyword_token(parent: &SyntaxNode) -> Option<SyntaxToken> {
parent
.children_with_tokens()
.filter_map(rowan::NodeOrToken::into_token)
.find(|tok| tok.kind() == SyntaxKind::IDENT || tok.kind().is_keyword())
}
pub(super) fn tokens(parent: &SyntaxNode, kind: SyntaxKind) -> impl Iterator<Item = SyntaxToken> {
parent
.children_with_tokens()
.filter_map(rowan::NodeOrToken::into_token)
.filter(move |tok| tok.kind() == kind)
}