1use crate::span::Span;
2use serde::Serialize;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
5pub struct Token {
6 pub kind: TokenKind,
7 pub span: Span,
8}
9
10impl Token {
11 pub fn text<'a>(&self, source: &'a [u8]) -> &'a [u8] {
12 self.span.as_str(source)
13 }
14
15 pub fn line(&self, source: &[u8]) -> usize {
16 source
17 .get(..self.span.start)
18 .unwrap_or_default()
19 .iter()
20 .filter(|&&b| b == b'\n')
21 .count()
22 + 1
23 }
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize)]
27pub enum TokenKind {
28 Function,
30 Class,
31 Interface,
32 Trait,
33 Extends,
34 Implements,
35 Enum,
36 If,
37 Else,
38 ElseIf,
39 EndIf,
40 Return,
41 Echo,
42 Print,
43 While,
44 Do,
45 For,
46 Foreach,
47 EndWhile,
48 EndFor,
49 EndForeach,
50 As,
51 Switch,
52 EndSwitch,
53 Case,
54 Default,
55 Break,
56 Continue,
57 Goto,
58 Insteadof,
59 Try,
60 Catch,
61 Finally,
62 Throw,
63 Public,
64 Protected,
65 Private,
66 Static,
67 Abstract,
68 Final,
69 Readonly,
70 PublicSet,
71 ProtectedSet,
72 PrivateSet,
73 Namespace,
74 Use,
75 Global,
76 New,
77 Clone,
78 InstanceOf,
79 Array,
80 Const,
81 Include,
82 IncludeOnce,
83 Require,
84 RequireOnce,
85 Eval,
86 Exit,
87 Die,
88 Empty,
89 Isset,
90 Unset,
91 List,
92 Yield,
93 YieldFrom,
94 Declare,
95 EndDeclare,
96 Match,
97 Fn,
98 HaltCompiler, Attribute, Line,
103 File,
104 Dir,
105 ClassC,
106 TraitC,
107 MethodC,
108 FuncC,
109 NsC,
110 PropertyC,
111
112 TypeBool,
114 TypeInt,
115 TypeFloat,
116 TypeString,
117 TypeObject,
118 TypeVoid,
119 TypeIterable,
120 TypeCallable,
121 TypeMixed,
122 TypeNever,
123 TypeNull,
124 TypeFalse,
125 TypeTrue,
126
127 IntCast,
129 FloatCast,
130 StringCast,
131 ArrayCast,
132 ObjectCast,
133 BoolCast,
134 UnsetCast,
135 VoidCast,
136
137 Identifier,
139 LNumber,
140 DNumber,
141 StringLiteral,
142 NumString, StringVarname, Variable,
145 InlineHtml,
146 EncapsedAndWhitespace,
147 DollarOpenCurlyBraces, CurlyOpen, Backtick, DoubleQuote, StartHeredoc, EndHeredoc, Dollar, NsSeparator, Comment,
158 DocComment,
159
160 Arrow, NullSafeArrow, DoubleArrow, DoubleColon, Ellipsis, Plus,
168 Minus,
169 Asterisk,
170 Slash,
171 Percent,
172 Dot,
173 Pow, Inc,
175 Dec, Eq, PlusEq,
179 MinusEq,
180 MulEq,
181 DivEq,
182 ModEq,
183 ConcatEq,
184 PowEq,
185 AndEq,
186 OrEq,
187 XorEq,
188 SlEq,
189 SrEq,
190 CoalesceEq,
191
192 EqEq, EqEqEq, Bang, BangEq, BangEqEq, Lt, LtEq, Gt, GtEq, Spaceship, Ampersand, AmpersandFollowedByVarOrVararg,
205 AmpersandNotFollowedByVarOrVararg,
206 Pipe, Caret, BitNot, Sl, Sr, AmpersandAmpersand, PipePipe, LogicalAnd, LogicalOr, LogicalXor, Question, Coalesce, At, SemiColon,
222 Colon,
223 Comma,
224 OpenBrace,
225 CloseBrace,
226 OpenParen,
227 CloseParen,
228 OpenBracket,
229 CloseBracket,
230
231 OpenTag, OpenTagEcho, CloseTag, Eof,
236
237 Error,
239 AmpersandFollowedByVar,
240 AmpersandNotFollowedByVar,
241}
242
243impl TokenKind {
244 pub fn is_semi_reserved(self) -> bool {
245 matches!(
246 self,
247 TokenKind::New
248 | TokenKind::Static
249 | TokenKind::Class
250 | TokenKind::Trait
251 | TokenKind::Interface
252 | TokenKind::Extends
253 | TokenKind::Implements
254 | TokenKind::Enum
255 | TokenKind::Namespace
256 | TokenKind::TypeInt
257 | TokenKind::TypeFloat
258 | TokenKind::TypeBool
259 | TokenKind::TypeString
260 | TokenKind::TypeVoid
261 | TokenKind::TypeNever
262 | TokenKind::TypeNull
263 | TokenKind::TypeFalse
264 | TokenKind::TypeTrue
265 | TokenKind::TypeMixed
266 | TokenKind::TypeIterable
267 | TokenKind::TypeObject
268 | TokenKind::TypeCallable
269 | TokenKind::LogicalOr
270 | TokenKind::Insteadof
271 | TokenKind::LogicalAnd
272 | TokenKind::LogicalXor
273 | TokenKind::As
274 | TokenKind::Empty
275 | TokenKind::Isset
276 | TokenKind::Default
277 | TokenKind::Switch
278 | TokenKind::Case
279 | TokenKind::For
280 | TokenKind::Foreach
281 | TokenKind::While
282 | TokenKind::Do
283 | TokenKind::If
284 | TokenKind::Else
285 | TokenKind::ElseIf
286 | TokenKind::EndIf
287 | TokenKind::Try
288 | TokenKind::Catch
289 | TokenKind::Finally
290 | TokenKind::Throw
291 | TokenKind::Return
292 | TokenKind::Break
293 | TokenKind::Continue
294 | TokenKind::Goto
295 | TokenKind::Echo
296 | TokenKind::Print
297 | TokenKind::List
298 | TokenKind::Clone
299 | TokenKind::Include
300 | TokenKind::IncludeOnce
301 | TokenKind::Require
302 | TokenKind::RequireOnce
303 | TokenKind::Global
304 | TokenKind::Unset
305 | TokenKind::Exit
306 | TokenKind::Die
307 | TokenKind::Eval
308 | TokenKind::Yield
309 | TokenKind::YieldFrom
310 | TokenKind::Declare
311 | TokenKind::EndDeclare
312 | TokenKind::Match
313 | TokenKind::Fn
314 | TokenKind::Const
315 | TokenKind::Use
316 | TokenKind::Public
317 | TokenKind::Protected
318 | TokenKind::Private
319 | TokenKind::Abstract
320 | TokenKind::Final
321 | TokenKind::Readonly
322 | TokenKind::Array
323 | TokenKind::Function
324 | TokenKind::HaltCompiler
325 | TokenKind::InstanceOf
326 | TokenKind::Line
327 | TokenKind::File
328 | TokenKind::Dir
329 | TokenKind::ClassC
330 | TokenKind::PropertyC
331 | TokenKind::TraitC
332 | TokenKind::MethodC
333 | TokenKind::FuncC
334 | TokenKind::NsC
335 )
336 }
337}