1 package lexers
2
3 import (
4 . "github.com/alecthomas/chroma/v2"
5 )
6
7
8 var Haxe = Register(MustNewLexer(
9 &Config{
10 Name: "Haxe",
11 Aliases: []string{"hx", "haxe", "hxsl"},
12 Filenames: []string{"*.hx", "*.hxsl"},
13 MimeTypes: []string{"text/haxe", "text/x-haxe", "text/x-hx"},
14 DotAll: true,
15 },
16 haxeRules,
17 ))
18
19 func haxeRules() Rules {
20 return Rules{
21 "root": {
22 Include("spaces"),
23 Include("meta"),
24 {`(?:package)\b`, KeywordNamespace, Push("semicolon", "package")},
25 {`(?:import)\b`, KeywordNamespace, Push("semicolon", "import")},
26 {`(?:using)\b`, KeywordNamespace, Push("semicolon", "using")},
27 {`(?:extern|private)\b`, KeywordDeclaration, nil},
28 {`(?:abstract)\b`, KeywordDeclaration, Push("abstract")},
29 {`(?:class|interface)\b`, KeywordDeclaration, Push("class")},
30 {`(?:enum)\b`, KeywordDeclaration, Push("enum")},
31 {`(?:typedef)\b`, KeywordDeclaration, Push("typedef")},
32 {`(?=.)`, Text, Push("expr-statement")},
33 },
34 "spaces": {
35 {`\s+`, Text, nil},
36 {`//[^\n\r]*`, CommentSingle, nil},
37 {`/\*.*?\*/`, CommentMultiline, nil},
38 {`(#)(if|elseif|else|end|error)\b`, CommentPreproc, MutatorFunc(haxePreProcMutator)},
39 },
40 "string-single-interpol": {
41 {`\$\{`, LiteralStringInterpol, Push("string-interpol-close", "expr")},
42 {`\$\$`, LiteralStringEscape, nil},
43 {`\$(?=(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+))`, LiteralStringInterpol, Push("ident")},
44 Include("string-single"),
45 },
46 "string-single": {
47 {`'`, LiteralStringSingle, Pop(1)},
48 {`\\.`, LiteralStringEscape, nil},
49 {`.`, LiteralStringSingle, nil},
50 },
51 "string-double": {
52 {`"`, LiteralStringDouble, Pop(1)},
53 {`\\.`, LiteralStringEscape, nil},
54 {`.`, LiteralStringDouble, nil},
55 },
56 "string-interpol-close": {
57 {`\$(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, LiteralStringInterpol, nil},
58 {`\}`, LiteralStringInterpol, Pop(1)},
59 },
60 "package": {
61 Include("spaces"),
62 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, nil},
63 {`\.`, Punctuation, Push("import-ident")},
64 Default(Pop(1)),
65 },
66 "import": {
67 Include("spaces"),
68 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, nil},
69 {`\*`, Keyword, nil},
70 {`\.`, Punctuation, Push("import-ident")},
71 {`in`, KeywordNamespace, Push("ident")},
72 Default(Pop(1)),
73 },
74 "import-ident": {
75 Include("spaces"),
76 {`\*`, Keyword, Pop(1)},
77 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, Pop(1)},
78 },
79 "using": {
80 Include("spaces"),
81 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, nil},
82 {`\.`, Punctuation, Push("import-ident")},
83 Default(Pop(1)),
84 },
85 "preproc-error": {
86 {`\s+`, CommentPreproc, nil},
87 {`'`, LiteralStringSingle, Push("#pop", "string-single")},
88 {`"`, LiteralStringDouble, Push("#pop", "string-double")},
89 Default(Pop(1)),
90 },
91 "preproc-expr": {
92 {`\s+`, CommentPreproc, nil},
93 {`\!`, CommentPreproc, nil},
94 {`\(`, CommentPreproc, Push("#pop", "preproc-parenthesis")},
95 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, CommentPreproc, Pop(1)},
96 {`\.[0-9]+`, LiteralNumberFloat, nil},
97 {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, nil},
98 {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, nil},
99 {`[0-9]+\.[0-9]+`, LiteralNumberFloat, nil},
100 {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, nil},
101 {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil},
102 {`[0-9]+`, LiteralNumberInteger, nil},
103 {`'`, LiteralStringSingle, Push("#pop", "string-single")},
104 {`"`, LiteralStringDouble, Push("#pop", "string-double")},
105 },
106 "preproc-parenthesis": {
107 {`\s+`, CommentPreproc, nil},
108 {`\)`, CommentPreproc, Pop(1)},
109 Default(Push("preproc-expr-in-parenthesis")),
110 },
111 "preproc-expr-chain": {
112 {`\s+`, CommentPreproc, nil},
113 {`(?:%=|&=|\|=|\^=|\+=|\-=|\*=|/=|<<=|>\s*>\s*=|>\s*>\s*>\s*=|==|!=|<=|>\s*=|&&|\|\||<<|>>>|>\s*>|\.\.\.|<|>|%|&|\||\^|\+|\*|/|\-|=>|=)`, CommentPreproc, Push("#pop", "preproc-expr-in-parenthesis")},
114 Default(Pop(1)),
115 },
116 "preproc-expr-in-parenthesis": {
117 {`\s+`, CommentPreproc, nil},
118 {`\!`, CommentPreproc, nil},
119 {`\(`, CommentPreproc, Push("#pop", "preproc-expr-chain", "preproc-parenthesis")},
120 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, CommentPreproc, Push("#pop", "preproc-expr-chain")},
121 {`\.[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")},
122 {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")},
123 {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")},
124 {`[0-9]+\.[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")},
125 {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")},
126 {`0x[0-9a-fA-F]+`, LiteralNumberHex, Push("#pop", "preproc-expr-chain")},
127 {`[0-9]+`, LiteralNumberInteger, Push("#pop", "preproc-expr-chain")},
128 {`'`, LiteralStringSingle, Push("#pop", "preproc-expr-chain", "string-single")},
129 {`"`, LiteralStringDouble, Push("#pop", "preproc-expr-chain", "string-double")},
130 },
131 "abstract": {
132 Include("spaces"),
133 Default(Pop(1), Push("abstract-body"), Push("abstract-relation"), Push("abstract-opaque"), Push("type-param-constraint"), Push("type-name")),
134 },
135 "abstract-body": {
136 Include("spaces"),
137 {`\{`, Punctuation, Push("#pop", "class-body")},
138 },
139 "abstract-opaque": {
140 Include("spaces"),
141 {`\(`, Punctuation, Push("#pop", "parenthesis-close", "type")},
142 Default(Pop(1)),
143 },
144 "abstract-relation": {
145 Include("spaces"),
146 {`(?:to|from)`, KeywordDeclaration, Push("type")},
147 {`,`, Punctuation, nil},
148 Default(Pop(1)),
149 },
150 "meta": {
151 Include("spaces"),
152 {`@`, NameDecorator, Push("meta-body", "meta-ident", "meta-colon")},
153 },
154 "meta-colon": {
155 Include("spaces"),
156 {`:`, NameDecorator, Pop(1)},
157 Default(Pop(1)),
158 },
159 "meta-ident": {
160 Include("spaces"),
161 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameDecorator, Pop(1)},
162 },
163 "meta-body": {
164 Include("spaces"),
165 {`\(`, NameDecorator, Push("#pop", "meta-call")},
166 Default(Pop(1)),
167 },
168 "meta-call": {
169 Include("spaces"),
170 {`\)`, NameDecorator, Pop(1)},
171 Default(Pop(1), Push("meta-call-sep"), Push("expr")),
172 },
173 "meta-call-sep": {
174 Include("spaces"),
175 {`\)`, NameDecorator, Pop(1)},
176 {`,`, Punctuation, Push("#pop", "meta-call")},
177 },
178 "typedef": {
179 Include("spaces"),
180 Default(Pop(1), Push("typedef-body"), Push("type-param-constraint"), Push("type-name")),
181 },
182 "typedef-body": {
183 Include("spaces"),
184 {`=`, Operator, Push("#pop", "optional-semicolon", "type")},
185 },
186 "enum": {
187 Include("spaces"),
188 Default(Pop(1), Push("enum-body"), Push("bracket-open"), Push("type-param-constraint"), Push("type-name")),
189 },
190 "enum-body": {
191 Include("spaces"),
192 Include("meta"),
193 {`\}`, Punctuation, Pop(1)},
194 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("enum-member", "type-param-constraint")},
195 },
196 "enum-member": {
197 Include("spaces"),
198 {`\(`, Punctuation, Push("#pop", "semicolon", "flag", "function-param")},
199 Default(Pop(1), Push("semicolon"), Push("flag")),
200 },
201 "class": {
202 Include("spaces"),
203 Default(Pop(1), Push("class-body"), Push("bracket-open"), Push("extends"), Push("type-param-constraint"), Push("type-name")),
204 },
205 "extends": {
206 Include("spaces"),
207 {`(?:extends|implements)\b`, KeywordDeclaration, Push("type")},
208 {`,`, Punctuation, nil},
209 Default(Pop(1)),
210 },
211 "bracket-open": {
212 Include("spaces"),
213 {`\{`, Punctuation, Pop(1)},
214 },
215 "bracket-close": {
216 Include("spaces"),
217 {`\}`, Punctuation, Pop(1)},
218 },
219 "class-body": {
220 Include("spaces"),
221 Include("meta"),
222 {`\}`, Punctuation, Pop(1)},
223 {`(?:static|public|private|override|dynamic|inline|macro)\b`, KeywordDeclaration, nil},
224 Default(Push("class-member")),
225 },
226 "class-member": {
227 Include("spaces"),
228 {`(var)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "var")},
229 {`(function)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "class-method")},
230 },
231 "function-local": {
232 Include("spaces"),
233 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameFunction, Push("#pop", "optional-expr", "flag", "function-param", "parenthesis-open", "type-param-constraint")},
234 Default(Pop(1), Push("optional-expr"), Push("flag"), Push("function-param"), Push("parenthesis-open"), Push("type-param-constraint")),
235 },
236 "optional-expr": {
237 Include("spaces"),
238 Include("expr"),
239 Default(Pop(1)),
240 },
241 "class-method": {
242 Include("spaces"),
243 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameFunction, Push("#pop", "optional-expr", "flag", "function-param", "parenthesis-open", "type-param-constraint")},
244 },
245 "function-param": {
246 Include("spaces"),
247 {`\)`, Punctuation, Pop(1)},
248 {`\?`, Punctuation, nil},
249 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "function-param-sep", "assign", "flag")},
250 },
251 "function-param-sep": {
252 Include("spaces"),
253 {`\)`, Punctuation, Pop(1)},
254 {`,`, Punctuation, Push("#pop", "function-param")},
255 },
256 "prop-get-set": {
257 Include("spaces"),
258 {`\(`, Punctuation, Push("#pop", "parenthesis-close", "prop-get-set-opt", "comma", "prop-get-set-opt")},
259 Default(Pop(1)),
260 },
261 "prop-get-set-opt": {
262 Include("spaces"),
263 {`(?:default|null|never|dynamic|get|set)\b`, Keyword, Pop(1)},
264 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Text, Pop(1)},
265 },
266 "expr-statement": {
267 Include("spaces"),
268 Default(Pop(1), Push("optional-semicolon"), Push("expr")),
269 },
270 "expr": {
271 Include("spaces"),
272 {`@`, NameDecorator, Push("#pop", "optional-expr", "meta-body", "meta-ident", "meta-colon")},
273 {`(?:\+\+|\-\-|~(?!/)|!|\-)`, Operator, nil},
274 {`\(`, Punctuation, Push("#pop", "expr-chain", "parenthesis")},
275 {`(?:static|public|private|override|dynamic|inline)\b`, KeywordDeclaration, nil},
276 {`(?:function)\b`, KeywordDeclaration, Push("#pop", "expr-chain", "function-local")},
277 {`\{`, Punctuation, Push("#pop", "expr-chain", "bracket")},
278 {`(?:true|false|null)\b`, KeywordConstant, Push("#pop", "expr-chain")},
279 {`(?:this)\b`, Keyword, Push("#pop", "expr-chain")},
280 {`(?:cast)\b`, Keyword, Push("#pop", "expr-chain", "cast")},
281 {`(?:try)\b`, Keyword, Push("#pop", "catch", "expr")},
282 {`(?:var)\b`, KeywordDeclaration, Push("#pop", "var")},
283 {`(?:new)\b`, Keyword, Push("#pop", "expr-chain", "new")},
284 {`(?:switch)\b`, Keyword, Push("#pop", "switch")},
285 {`(?:if)\b`, Keyword, Push("#pop", "if")},
286 {`(?:do)\b`, Keyword, Push("#pop", "do")},
287 {`(?:while)\b`, Keyword, Push("#pop", "while")},
288 {`(?:for)\b`, Keyword, Push("#pop", "for")},
289 {`(?:untyped|throw)\b`, Keyword, nil},
290 {`(?:return)\b`, Keyword, Push("#pop", "optional-expr")},
291 {`(?:macro)\b`, Keyword, Push("#pop", "macro")},
292 {`(?:continue|break)\b`, Keyword, Pop(1)},
293 {`(?:\$\s*[a-z]\b|\$(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)))`, Name, Push("#pop", "dollar")},
294 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "expr-chain")},
295 {`\.[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")},
296 {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")},
297 {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")},
298 {`[0-9]+\.[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")},
299 {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, Push("#pop", "expr-chain")},
300 {`0x[0-9a-fA-F]+`, LiteralNumberHex, Push("#pop", "expr-chain")},
301 {`[0-9]+`, LiteralNumberInteger, Push("#pop", "expr-chain")},
302 {`'`, LiteralStringSingle, Push("#pop", "expr-chain", "string-single-interpol")},
303 {`"`, LiteralStringDouble, Push("#pop", "expr-chain", "string-double")},
304 {`~/(\\\\|\\/|[^/\n])*/[gimsu]*`, LiteralStringRegex, Push("#pop", "expr-chain")},
305 {`\[`, Punctuation, Push("#pop", "expr-chain", "array-decl")},
306 },
307 "expr-chain": {
308 Include("spaces"),
309 {`(?:\+\+|\-\-)`, Operator, nil},
310 {`(?:%=|&=|\|=|\^=|\+=|\-=|\*=|/=|<<=|>\s*>\s*=|>\s*>\s*>\s*=|==|!=|<=|>\s*=|&&|\|\||<<|>>>|>\s*>|\.\.\.|<|>|%|&|\||\^|\+|\*|/|\-|=>|=)`, Operator, Push("#pop", "expr")},
311 {`(?:in)\b`, Keyword, Push("#pop", "expr")},
312 {`\?`, Operator, Push("#pop", "expr", "ternary", "expr")},
313 {`(\.)((?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+))`, ByGroups(Punctuation, Name), nil},
314 {`\[`, Punctuation, Push("array-access")},
315 {`\(`, Punctuation, Push("call")},
316 Default(Pop(1)),
317 },
318 "macro": {
319 Include("spaces"),
320 Include("meta"),
321 {`:`, Punctuation, Push("#pop", "type")},
322 {`(?:extern|private)\b`, KeywordDeclaration, nil},
323 {`(?:abstract)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "abstract")},
324 {`(?:class|interface)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "macro-class")},
325 {`(?:enum)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "enum")},
326 {`(?:typedef)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "typedef")},
327 Default(Pop(1), Push("expr")),
328 },
329 "macro-class": {
330 {`\{`, Punctuation, Push("#pop", "class-body")},
331 Include("class"),
332 },
333 "cast": {
334 Include("spaces"),
335 {`\(`, Punctuation, Push("#pop", "parenthesis-close", "cast-type", "expr")},
336 Default(Pop(1), Push("expr")),
337 },
338 "cast-type": {
339 Include("spaces"),
340 {`,`, Punctuation, Push("#pop", "type")},
341 Default(Pop(1)),
342 },
343 "catch": {
344 Include("spaces"),
345 {`(?:catch)\b`, Keyword, Push("expr", "function-param", "parenthesis-open")},
346 Default(Pop(1)),
347 },
348 "do": {
349 Include("spaces"),
350 Default(Pop(1), Push("do-while"), Push("expr")),
351 },
352 "do-while": {
353 Include("spaces"),
354 {`(?:while)\b`, Keyword, Push("#pop", "parenthesis", "parenthesis-open")},
355 },
356 "while": {
357 Include("spaces"),
358 {`\(`, Punctuation, Push("#pop", "expr", "parenthesis")},
359 },
360 "for": {
361 Include("spaces"),
362 {`\(`, Punctuation, Push("#pop", "expr", "parenthesis")},
363 },
364 "if": {
365 Include("spaces"),
366 {`\(`, Punctuation, Push("#pop", "else", "optional-semicolon", "expr", "parenthesis")},
367 },
368 "else": {
369 Include("spaces"),
370 {`(?:else)\b`, Keyword, Push("#pop", "expr")},
371 Default(Pop(1)),
372 },
373 "switch": {
374 Include("spaces"),
375 Default(Pop(1), Push("switch-body"), Push("bracket-open"), Push("expr")),
376 },
377 "switch-body": {
378 Include("spaces"),
379 {`(?:case|default)\b`, Keyword, Push("case-block", "case")},
380 {`\}`, Punctuation, Pop(1)},
381 },
382 "case": {
383 Include("spaces"),
384 {`:`, Punctuation, Pop(1)},
385 Default(Pop(1), Push("case-sep"), Push("case-guard"), Push("expr")),
386 },
387 "case-sep": {
388 Include("spaces"),
389 {`:`, Punctuation, Pop(1)},
390 {`,`, Punctuation, Push("#pop", "case")},
391 },
392 "case-guard": {
393 Include("spaces"),
394 {`(?:if)\b`, Keyword, Push("#pop", "parenthesis", "parenthesis-open")},
395 Default(Pop(1)),
396 },
397 "case-block": {
398 Include("spaces"),
399 {`(?!(?:case|default)\b|\})`, Keyword, Push("expr-statement")},
400 Default(Pop(1)),
401 },
402 "new": {
403 Include("spaces"),
404 Default(Pop(1), Push("call"), Push("parenthesis-open"), Push("type")),
405 },
406 "array-decl": {
407 Include("spaces"),
408 {`\]`, Punctuation, Pop(1)},
409 Default(Pop(1), Push("array-decl-sep"), Push("expr")),
410 },
411 "array-decl-sep": {
412 Include("spaces"),
413 {`\]`, Punctuation, Pop(1)},
414 {`,`, Punctuation, Push("#pop", "array-decl")},
415 },
416 "array-access": {
417 Include("spaces"),
418 Default(Pop(1), Push("array-access-close"), Push("expr")),
419 },
420 "array-access-close": {
421 Include("spaces"),
422 {`\]`, Punctuation, Pop(1)},
423 },
424 "comma": {
425 Include("spaces"),
426 {`,`, Punctuation, Pop(1)},
427 },
428 "colon": {
429 Include("spaces"),
430 {`:`, Punctuation, Pop(1)},
431 },
432 "semicolon": {
433 Include("spaces"),
434 {`;`, Punctuation, Pop(1)},
435 },
436 "optional-semicolon": {
437 Include("spaces"),
438 {`;`, Punctuation, Pop(1)},
439 Default(Pop(1)),
440 },
441 "ident": {
442 Include("spaces"),
443 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Pop(1)},
444 },
445 "dollar": {
446 Include("spaces"),
447 {`\{`, Punctuation, Push("#pop", "expr-chain", "bracket-close", "expr")},
448 Default(Pop(1), Push("expr-chain")),
449 },
450 "type-name": {
451 Include("spaces"),
452 {`_*[A-Z]\w*`, Name, Pop(1)},
453 },
454 "type-full-name": {
455 Include("spaces"),
456 {`\.`, Punctuation, Push("ident")},
457 Default(Pop(1)),
458 },
459 "type": {
460 Include("spaces"),
461 {`\?`, Punctuation, nil},
462 {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "type-check", "type-full-name")},
463 {`\{`, Punctuation, Push("#pop", "type-check", "type-struct")},
464 {`\(`, Punctuation, Push("#pop", "type-check", "type-parenthesis")},
465 },
466 "type-parenthesis": {
467 Include("spaces"),
468 Default(Pop(1), Push("parenthesis-close"), Push("type")),
469 },
470 "type-check": {
471 Include("spaces"),
472 {`->`, Punctuation, Push("#pop", "type")},
473 {`<(?!=)`, Punctuation, Push("type-param")},
474 Default(Pop(1)),
475 },
476 "type-struct": {
477 Include("spaces"),
478 {`\}`, Punctuation, Pop(1)},
479 {`\?`, Punctuation, nil},
480 {`>`, Punctuation, Push("comma", "type")},
481 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "type-struct-sep", "type", "colon")},
482 Include("class-body"),
483 },
484 "type-struct-sep": {
485 Include("spaces"),
486 {`\}`, Punctuation, Pop(1)},
487 {`,`, Punctuation, Push("#pop", "type-struct")},
488 },
489 "type-param-type": {
490 {`\.[0-9]+`, LiteralNumberFloat, Pop(1)},
491 {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, Pop(1)},
492 {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, Pop(1)},
493 {`[0-9]+\.[0-9]+`, LiteralNumberFloat, Pop(1)},
494 {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, Pop(1)},
495 {`0x[0-9a-fA-F]+`, LiteralNumberHex, Pop(1)},
496 {`[0-9]+`, LiteralNumberInteger, Pop(1)},
497 {`'`, LiteralStringSingle, Push("#pop", "string-single")},
498 {`"`, LiteralStringDouble, Push("#pop", "string-double")},
499 {`~/(\\\\|\\/|[^/\n])*/[gim]*`, LiteralStringRegex, Pop(1)},
500 {`\[`, Operator, Push("#pop", "array-decl")},
501 Include("type"),
502 },
503 "type-param": {
504 Include("spaces"),
505 Default(Pop(1), Push("type-param-sep"), Push("type-param-type")),
506 },
507 "type-param-sep": {
508 Include("spaces"),
509 {`>`, Punctuation, Pop(1)},
510 {`,`, Punctuation, Push("#pop", "type-param")},
511 },
512 "type-param-constraint": {
513 Include("spaces"),
514 {`<(?!=)`, Punctuation, Push("#pop", "type-param-constraint-sep", "type-param-constraint-flag", "type-name")},
515 Default(Pop(1)),
516 },
517 "type-param-constraint-sep": {
518 Include("spaces"),
519 {`>`, Punctuation, Pop(1)},
520 {`,`, Punctuation, Push("#pop", "type-param-constraint-sep", "type-param-constraint-flag", "type-name")},
521 },
522 "type-param-constraint-flag": {
523 Include("spaces"),
524 {`:`, Punctuation, Push("#pop", "type-param-constraint-flag-type")},
525 Default(Pop(1)),
526 },
527 "type-param-constraint-flag-type": {
528 Include("spaces"),
529 {`\(`, Punctuation, Push("#pop", "type-param-constraint-flag-type-sep", "type")},
530 Default(Pop(1), Push("type")),
531 },
532 "type-param-constraint-flag-type-sep": {
533 Include("spaces"),
534 {`\)`, Punctuation, Pop(1)},
535 {`,`, Punctuation, Push("type")},
536 },
537 "parenthesis": {
538 Include("spaces"),
539 Default(Pop(1), Push("parenthesis-close"), Push("flag"), Push("expr")),
540 },
541 "parenthesis-open": {
542 Include("spaces"),
543 {`\(`, Punctuation, Pop(1)},
544 },
545 "parenthesis-close": {
546 Include("spaces"),
547 {`\)`, Punctuation, Pop(1)},
548 },
549 "var": {
550 Include("spaces"),
551 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Text, Push("#pop", "var-sep", "assign", "flag", "prop-get-set")},
552 },
553 "var-sep": {
554 Include("spaces"),
555 {`,`, Punctuation, Push("#pop", "var")},
556 Default(Pop(1)),
557 },
558 "assign": {
559 Include("spaces"),
560 {`=`, Operator, Push("#pop", "expr")},
561 Default(Pop(1)),
562 },
563 "flag": {
564 Include("spaces"),
565 {`:`, Punctuation, Push("#pop", "type")},
566 Default(Pop(1)),
567 },
568 "ternary": {
569 Include("spaces"),
570 {`:`, Operator, Pop(1)},
571 },
572 "call": {
573 Include("spaces"),
574 {`\)`, Punctuation, Pop(1)},
575 Default(Pop(1), Push("call-sep"), Push("expr")),
576 },
577 "call-sep": {
578 Include("spaces"),
579 {`\)`, Punctuation, Pop(1)},
580 {`,`, Punctuation, Push("#pop", "call")},
581 },
582 "bracket": {
583 Include("spaces"),
584 {`(?!(?:\$\s*[a-z]\b|\$(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+))))(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "bracket-check")},
585 {`'`, LiteralStringSingle, Push("#pop", "bracket-check", "string-single")},
586 {`"`, LiteralStringDouble, Push("#pop", "bracket-check", "string-double")},
587 Default(Pop(1), Push("block")),
588 },
589 "bracket-check": {
590 Include("spaces"),
591 {`:`, Punctuation, Push("#pop", "object-sep", "expr")},
592 Default(Pop(1), Push("block"), Push("optional-semicolon"), Push("expr-chain")),
593 },
594 "block": {
595 Include("spaces"),
596 {`\}`, Punctuation, Pop(1)},
597 Default(Push("expr-statement")),
598 },
599 "object": {
600 Include("spaces"),
601 {`\}`, Punctuation, Pop(1)},
602 Default(Pop(1), Push("object-sep"), Push("expr"), Push("colon"), Push("ident-or-string")),
603 },
604 "ident-or-string": {
605 Include("spaces"),
606 {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Pop(1)},
607 {`'`, LiteralStringSingle, Push("#pop", "string-single")},
608 {`"`, LiteralStringDouble, Push("#pop", "string-double")},
609 },
610 "object-sep": {
611 Include("spaces"),
612 {`\}`, Punctuation, Pop(1)},
613 {`,`, Punctuation, Push("#pop", "object")},
614 },
615 }
616 }
617
618 func haxePreProcMutator(state *LexerState) error {
619 stack, ok := state.Get("haxe-pre-proc").([][]string)
620 if !ok {
621 stack = [][]string{}
622 }
623
624 proc := state.Groups[2]
625 switch proc {
626 case "if":
627 stack = append(stack, state.Stack)
628 case "else", "elseif":
629 if len(stack) > 0 {
630 state.Stack = stack[len(stack)-1]
631 }
632 case "end":
633 stack = stack[:len(stack)-1]
634 }
635
636 if proc == "if" || proc == "elseif" {
637 state.Stack = append(state.Stack, "preproc-expr")
638 }
639
640 if proc == "error" {
641 state.Stack = append(state.Stack, "preproc-error")
642 }
643 state.Set("haxe-pre-proc", stack)
644 return nil
645 }
646
View as plain text