...

Source file src/github.com/alecthomas/chroma/v2/lexers/haxe.go

Documentation: github.com/alecthomas/chroma/v2/lexers

     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  }
   646  

View as plain text