Skip to main content

arity_parser/ast/
kinds.rs

1//! Shared [`SyntaxKind`] predicates for the AST-wrapper layer and its
2//! consumers. Kept in one place so node/token accessors and the linter's
3//! matchers agree on what counts as a binary operator, a unary operator, or
4//! trivia.
5
6use crate::syntax::SyntaxKind;
7
8/// Whitespace trivia. Does **not** include comments — callers that also want to
9/// skip comments test `is_trivia(k) || k == SyntaxKind::COMMENT`, the idiom used
10/// throughout the wrapper accessors.
11pub fn is_trivia(kind: SyntaxKind) -> bool {
12    matches!(kind, SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE)
13}
14
15/// A binary-operator token that can head a `BINARY_EXPR` (including the
16/// namespace operators `::`/`:::` and the access operators `$`/`@`).
17pub fn is_binary_operator(kind: SyntaxKind) -> bool {
18    matches!(
19        kind,
20        SyntaxKind::PLUS
21            | SyntaxKind::MINUS
22            | SyntaxKind::STAR
23            | SyntaxKind::SLASH
24            | SyntaxKind::CARET
25            | SyntaxKind::PIPE
26            | SyntaxKind::COLON
27            | SyntaxKind::COLON2
28            | SyntaxKind::COLON3
29            | SyntaxKind::DOLLAR
30            | SyntaxKind::AT
31            | SyntaxKind::OR
32            | SyntaxKind::OR2
33            | SyntaxKind::AND
34            | SyntaxKind::AND2
35            | SyntaxKind::EQUAL2
36            | SyntaxKind::NOT_EQUAL
37            | SyntaxKind::LESS_THAN
38            | SyntaxKind::LESS_THAN_OR_EQUAL
39            | SyntaxKind::GREATER_THAN
40            | SyntaxKind::GREATER_THAN_OR_EQUAL
41            | SyntaxKind::USER_OP
42            | SyntaxKind::TILDE
43            | SyntaxKind::QUESTION
44    )
45}
46
47/// A prefix unary-operator token that can head a `UNARY_EXPR`
48/// (`-`, `+`, `!`, `~`, `?`).
49pub fn is_unary_operator(kind: SyntaxKind) -> bool {
50    matches!(
51        kind,
52        SyntaxKind::MINUS
53            | SyntaxKind::PLUS
54            | SyntaxKind::BANG
55            | SyntaxKind::TILDE
56            | SyntaxKind::QUESTION
57    )
58}