1 | package lexers
|
---|
2 |
|
---|
3 | import (
|
---|
4 | . "github.com/alecthomas/chroma/v2" // nolint
|
---|
5 | )
|
---|
6 |
|
---|
7 | // Haxe lexer.
|
---|
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 | }
|
---|