yul_parser/
syntax_kind.rs

1use 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>;