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}