oak_clojure/lexer/
token_type.rs1use oak_core::{TokenType, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
6pub enum ClojureTokenType {
7 Whitespace,
10 Newline,
12 Comment,
14
15 StringLiteral,
18 CharacterLiteral,
20 NumberLiteral,
22 BooleanLiteral,
24 NilLiteral,
26 KeywordLiteral,
28
29 Symbol,
32 Keyword,
34
35 ListStart,
38 ListEnd,
40 VectorStart,
42 VectorEnd,
44 MapStart,
46 MapEnd,
48 SetStart,
50
51 Quote,
54 Unquote,
56 UnquoteSplice,
58 Deref,
60 Meta,
62 Dispatch,
64
65 ReaderMacro,
68
69 RegexLiteral,
72
73 AnonFnStart,
76 AnonFnArg,
78
79 Error,
82 Eof,
84}
85
86impl TokenType for ClojureTokenType {
87 type Role = UniversalTokenRole;
88 const END_OF_STREAM: Self = Self::Eof;
89
90 fn is_ignored(&self) -> bool {
91 self.is_whitespace() || self.is_comment()
92 }
93
94 fn is_comment(&self) -> bool {
95 matches!(self, Self::Comment)
96 }
97
98 fn is_whitespace(&self) -> bool {
99 matches!(self, Self::Whitespace | Self::Newline)
100 }
101
102 fn role(&self) -> Self::Role {
103 match self {
104 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
105 Self::Comment => UniversalTokenRole::Comment,
106 Self::StringLiteral | Self::CharacterLiteral | Self::NumberLiteral | Self::BooleanLiteral | Self::NilLiteral | Self::KeywordLiteral | Self::RegexLiteral => UniversalTokenRole::Literal,
107 Self::Symbol | Self::Keyword | Self::AnonFnArg => UniversalTokenRole::Name,
108 Self::ListStart
109 | Self::ListEnd
110 | Self::VectorStart
111 | Self::VectorEnd
112 | Self::MapStart
113 | Self::MapEnd
114 | Self::SetStart
115 | Self::Quote
116 | Self::Unquote
117 | Self::UnquoteSplice
118 | Self::Deref
119 | Self::Meta
120 | Self::Dispatch
121 | Self::ReaderMacro
122 | Self::AnonFnStart => UniversalTokenRole::Punctuation,
123 Self::Error => UniversalTokenRole::Error,
124 Self::Eof => UniversalTokenRole::None,
125 }
126 }
127}