yul_parser/
syntax_kind.rs1use crate::{Node, Token};
2use num_traits::{FromPrimitive, ToPrimitive};
3use rowan;
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Copy, PartialEq, Serialize, Deserialize)]
7pub enum SyntaxKind {
8 Token(Token),
9 Node(Node),
10}
11
12impl core::fmt::Debug for SyntaxKind {
13 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
14 match self {
15 SyntaxKind::Token(token) => token.fmt(f),
16 SyntaxKind::Node(node) => node.fmt(f),
17 }
18 }
19}
20
21impl ToPrimitive for SyntaxKind {
22 fn to_u64(&self) -> Option<u64> {
23 match self {
24 SyntaxKind::Token(token) => token.to_u64().map(|n| 2 * n),
25 SyntaxKind::Node(node) => node.to_u64().map(|n| 2 * n + 1),
26 }
27 }
28
29 fn to_i64(&self) -> Option<i64> {
30 match self {
31 SyntaxKind::Token(token) => token.to_i64().map(|n| 2 * n),
32 SyntaxKind::Node(node) => node.to_i64().map(|n| 2 * n + 1),
33 }
34 }
35}
36
37impl FromPrimitive for SyntaxKind {
38 fn from_i64(n: i64) -> std::option::Option<Self> {
39 match (n & 1, n / 2) {
40 (0, n) => Token::from_i64(n).map(SyntaxKind::Token),
41 (1, n) => Node::from_i64(n).map(SyntaxKind::Node),
42 _ => unreachable!(),
43 }
44 }
45
46 fn from_u64(n: u64) -> std::option::Option<Self> {
47 match (n & 1, n / 2) {
48 (0, n) => Token::from_u64(n).map(SyntaxKind::Token),
49 (1, n) => Node::from_u64(n).map(SyntaxKind::Node),
50 _ => unreachable!(),
51 }
52 }
53}
54
55#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
56pub enum YulLanguage {}
57
58impl rowan::Language for YulLanguage {
59 type Kind = SyntaxKind;
60
61 fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
62 Self::Kind::from_u16(raw.0).unwrap()
63 }
64
65 fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
66 rowan::SyntaxKind(kind.to_u16().unwrap())
67 }
68}
69
70pub type SyntaxNode = rowan::SyntaxNode<YulLanguage>;