1use oak_core::{Token, TokenType, UniversalTokenRole};
4
5pub type PythonToken = Token<PythonTokenType>;
7
8impl PythonTokenType {
9 pub fn is_keyword(&self) -> bool {
11 matches!(
12 self,
13 Self::AndKeyword
14 | Self::AsKeyword
15 | Self::AssertKeyword
16 | Self::AsyncKeyword
17 | Self::AwaitKeyword
18 | Self::BreakKeyword
19 | Self::ClassKeyword
20 | Self::ContinueKeyword
21 | Self::DefKeyword
22 | Self::DelKeyword
23 | Self::ElifKeyword
24 | Self::ElseKeyword
25 | Self::ExceptKeyword
26 | Self::FalseKeyword
27 | Self::FinallyKeyword
28 | Self::ForKeyword
29 | Self::FromKeyword
30 | Self::GlobalKeyword
31 | Self::IfKeyword
32 | Self::ImportKeyword
33 | Self::InKeyword
34 | Self::IsKeyword
35 | Self::LambdaKeyword
36 | Self::NoneKeyword
37 | Self::NonlocalKeyword
38 | Self::NotKeyword
39 | Self::OrKeyword
40 | Self::PassKeyword
41 | Self::RaiseKeyword
42 | Self::ReturnKeyword
43 | Self::TrueKeyword
44 | Self::TryKeyword
45 | Self::WhileKeyword
46 | Self::WithKeyword
47 | Self::YieldKeyword
48 )
49 }
50}
51
52impl PythonTokenType {
53 pub fn is_trivia(&self) -> bool {
55 matches!(self, Self::Whitespace | Self::Comment)
56 }
57}
58
59impl TokenType for PythonTokenType {
60 type Role = UniversalTokenRole;
61 const END_OF_STREAM: Self = Self::Error;
62
63 fn is_ignored(&self) -> bool {
64 self.is_trivia()
65 }
66
67 fn role(&self) -> Self::Role {
68 match self {
69 _ => UniversalTokenRole::None,
70 }
71 }
72}
73
74#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
76#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
77#[repr(u16)]
78pub enum PythonTokenType {
79 Whitespace,
81 Comment,
83 Identifier,
85
86 Number,
88 String,
90 Bytes,
92 FString,
94
95 AndKeyword,
97 AsKeyword,
99 AssertKeyword,
101 AsyncKeyword,
103 AwaitKeyword,
105 BreakKeyword,
107 ClassKeyword,
109 ContinueKeyword,
111 DefKeyword,
113 DelKeyword,
115 ElifKeyword,
117 ElseKeyword,
119 ExceptKeyword,
121 FalseKeyword,
123 FinallyKeyword,
125 ForKeyword,
127 FromKeyword,
129 GlobalKeyword,
131 IfKeyword,
133 ImportKeyword,
135 InKeyword,
137 IsKeyword,
139 LambdaKeyword,
141 NoneKeyword,
143 NonlocalKeyword,
145 NotKeyword,
147 OrKeyword,
149 PassKeyword,
151 RaiseKeyword,
153 ReturnKeyword,
155 TrueKeyword,
157 TryKeyword,
159 WhileKeyword,
161 WithKeyword,
163 YieldKeyword,
165
166 Plus,
168 Minus,
170 Star,
172 DoubleStar,
174 Slash,
176 DoubleSlash,
178 Percent,
180 At,
182 LeftShift,
184 RightShift,
186 Ampersand,
188 Pipe,
190 Caret,
192 Tilde,
194 Less,
196 Greater,
198 LessEqual,
200 GreaterEqual,
202 Equal,
204 NotEqual,
206
207 Assign,
209 PlusAssign,
211 MinusAssign,
213 StarAssign,
215 DoubleStarAssign,
217 SlashAssign,
219 DoubleSlashAssign,
221 PercentAssign,
223 AtAssign,
225 AmpersandAssign,
227 PipeAssign,
229 CaretAssign,
231 LeftShiftAssign,
233 RightShiftAssign,
235
236 LeftParen,
238 RightParen,
240 LeftBracket,
242 RightBracket,
244 LeftBrace,
246 RightBrace,
248 Comma,
250 Colon,
252 Semicolon,
254 Dot,
256 Arrow,
258 Ellipsis,
260
261 Newline,
263 Indent,
265 Dedent,
267 Eof,
269 Error,
271}
272
273impl From<PythonTokenType> for u16 {
274 fn from(k: PythonTokenType) -> u16 {
275 k as u16
276 }
277}
278
279impl From<u16> for PythonTokenType {
280 fn from(d: u16) -> PythonTokenType {
281 unsafe { core::mem::transmute::<u16, PythonTokenType>(d) }
282 }
283}