use tree_sitter::Node;
fn children_all_pure(n: Node, purity: fn(Node) -> bool) -> bool {
n.children(&mut n.walk())
.filter(|ch| ch.is_named())
.all(|ch| purity(ch))
}
fn children_without_substitution(n: Node, purity: fn(Node) -> bool) -> bool {
n.children(&mut n.walk())
.filter(|ch| ch.is_named())
.all(|ch| ch.kind() != "substitution" && purity(ch))
}
pub(super) fn js_pure(n: Node) -> bool {
match n.kind() {
"number" | "string" | "true" | "false" | "null" | "undefined" => {
children_without_substitution(n, js_pure)
}
"template_string" => children_without_substitution(n, js_pure),
"parenthesized_expression"
| "binary_expression"
| "unary_expression"
| "typeof_expression" => children_all_pure(n, js_pure),
_ => false,
}
}
pub(super) fn swift_pure(n: Node) -> bool {
match n.kind() {
"integer_literal"
| "float_literal"
| "boolean_literal"
| "nil"
| "line_string_literal"
| "array_literal"
| "dictionary_literal"
| "prefix_expression"
| "infix_expression" => children_all_pure(n, swift_pure),
_ => false,
}
}
pub(super) fn c_like_pure(n: Node) -> bool {
match n.kind() {
"number_literal"
| "string_literal"
| "char_literal"
| "concatenated_string"
| "true"
| "false"
| "null"
| "nil"
| "nullptr" => children_all_pure(n, c_like_pure),
"parenthesized_expression" | "binary_expression" | "unary_expression" => {
children_all_pure(n, c_like_pure)
}
_ => false,
}
}