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