• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nette / latte / 20711295966

05 Jan 2026 09:41AM UTC coverage: 94.752% (-0.09%) from 94.845%
20711295966

push

github

dg
added support for Partial Function Application WIP

172 of 179 new or added lines in 7 files covered. (96.09%)

29 existing lines in 8 files now uncovered.

5507 of 5812 relevant lines covered (94.75%)

0.95 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.96
/src/Latte/Compiler/TagParserData.php
1
<?php
2

3
/**
4
 * This file is part of the Latte (https://latte.nette.org)
5
 * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
 */
7

8
declare(strict_types=1);
9

10
namespace Latte\Compiler;
11

12
use Latte\Compiler\Nodes\Php as Node;
13
use Latte\Compiler\Nodes\Php\Expression;
14
use Latte\Compiler\Nodes\Php\Scalar;
15
use function array_pop, count, is_string, substr;
16

17

18
/** @internal generated part of TagParser */
19
trait TagParserData
20
{
21
        /** Symbol number of error recovery token */
22
        protected const ErrorSymbol = 1;
23

24
        /** Action number signifying default action */
25
        protected const DefaultAction = -8190;
26

27
        /** Rule number signifying that an unexpected token was encountered */
28
        protected const UnexpectedTokenRule = 8191;
29

30
        protected const Yy2Tblstate = 268;
31

32
        /** Number of non-leaf states */
33
        protected const NumNonLeafStates = 369;
34

35
        /** Map of lexer tokens to internal symbols */
36
        protected const TokenToSymbol = [
37
                0,     116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
38
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   51,    111,   116,   112,   50,    116,   116,
39
                105,   106,   48,    46,    2,     47,    42,    49,    116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   22,    109,
40
                37,    7,     39,    21,    62,    116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
41
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   64,    116,   110,   29,    116,   116,   103,   116,   116,
42
                116,   101,   104,   116,   116,   116,   116,   116,   116,   102,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
43
                116,   116,   116,   107,   26,    108,   53,    116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
44
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
45
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
46
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
47
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
48
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,
49
                116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   116,   1,     3,     4,     5,
50
                6,     8,     9,     10,    11,    12,    13,    14,    15,    16,    17,    18,    19,    20,    23,    24,    25,    27,    28,    30,
51
                31,    32,    33,    34,    35,    36,    38,    40,    41,    43,    44,    45,    52,    54,    55,    56,    57,    58,    59,    60,
52
                61,    63,    65,    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
53
                83,    84,    85,    86,    87,    88,    89,    90,    91,    92,    93,    113,   94,    95,    96,    97,    114,   115,   98,    99,
54
                100,
55
        ];
56

57
        /** Map of states to a displacement into the self::Action table. The corresponding action for this
58
         *  state/symbol pair is self::Action[self::ActionBase[$state] + $symbol]. If self::ActionBase[$state] is 0, the
59
         *  action is defaulted, i.e. self::ActionDefault[$state] should be used instead. */
60
        protected const ActionBase = [
61
                476,   148,   170,   284,   192,   284,   354,   354,   284,   284,   262,   284,   284,   393,   393,   393,   -30,   -30,   -30,   -30,
62
                155,   155,   190,   -11,   33,    437,   65,    437,   65,    437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,
63
                437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,
64
                437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,
65
                437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,   437,
66
                437,   437,   437,   437,   437,   437,   437,   437,   437,   16,    171,   250,   253,   488,   490,   489,   491,   504,   505,   503,
67
                506,   512,   68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    87,    121,   424,   495,
68
                495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   495,   563,   563,   563,
69
                143,   390,   366,   276,   125,   379,   379,   287,   287,   287,   287,   287,   305,   436,   436,   -35,   -35,   -35,   -35,   96,
70
                96,    378,   378,   378,   378,   378,   378,   378,   378,   378,   251,   494,   380,   380,   475,   234,   100,   100,   100,   100,
71
                237,   237,   237,   237,   237,   237,   237,   439,   445,   445,   445,   442,   456,   466,   469,   367,   -57,   -57,   -57,   -57,
72
                -57,   -57,   370,   513,   -8,    288,   288,   472,   408,   408,   128,   288,   85,    88,    307,   118,   198,   240,   346,   84,
73
                13,    486,   325,   329,   377,   127,   127,   487,   556,   454,   514,   514,   394,   454,   454,   454,   394,   169,   169,   169,
74
                140,   210,   74,    254,   492,   254,   254,   254,   359,   -47,   438,   438,   152,   443,   443,   63,    179,   81,    438,   438,
75
                438,   438,   156,   185,   156,   156,   382,   371,   404,   214,   161,   404,   372,   372,   204,   51,    458,   455,   459,   441,
76
                440,   496,   236,   271,   386,   384,   429,   308,   458,   455,   459,   385,   22,    416,   417,   353,   353,   353,   353,   353,
77
                353,   353,   353,   353,   353,   236,   508,   119,   389,   464,   465,   40,    402,   470,   479,   481,   498,   324,   499,   353,
78
                396,   406,   399,   509,   426,   47,    236,   510,   482,   493,   403,   279,   423,   376,   511,   483,   484,   405,   500,   144,
79
                467,   186,   501,   217,   497,   278,   485,   507,   502,   0,     -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,
80
                -30,   -30,   -30,   -30,   -30,   0,     0,     0,     0,     -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,
81
                -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,
82
                -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,
83
                -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,
84
                -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   -30,   68,    68,
85
                68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    0,     0,     0,     0,     0,     0,     0,     0,     0,
86
                0,     0,     0,     0,     0,     68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,
87
                68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    68,    0,     68,    68,    68,    68,    68,    68,
88
                68,    436,   0,     0,     445,   445,   445,   445,   -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    445,
89
                445,   -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    0,     0,     0,     0,
90
                0,     0,     0,     0,     85,    372,   372,   372,   372,   372,   372,   85,    85,    0,     0,     0,     0,     445,   445,   0,
91
                0,     0,     85,    372,   0,     0,     0,     0,     0,     0,     454,   454,   454,   85,    443,   443,   394,   0,     0,     372,
92
                372,   0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     353,   119,   353,   353,   353,
93
        ];
94

95
        /** Table of actions. Indexed according to self::ActionBase comment. */
96
        protected const Action = [
97
                375,   374,   -8191, -8191, -8191, -8191, 70,    71,    72,    73,    74,    97,    394,   -293,  395,   -293,  33,    34,    2,     -8190,
98
                -8190, 35,    -50,   36,    181,   182,   37,    38,    39,    40,    41,    42,    43,    31,    3,     196,   26,    595,   596,   211,
99
                -48,   577,   396,   173,   174,   593,   296,   -47,   253,   254,   99,    0,     297,   298,   466,   301,   -243,  299,   300,   215,
100
                575,   560,   577,   -8190, -8190, 6,     579,   578,   601,   599,   600,   51,    52,    53,    -47,   27,    -243,  -243,  -243,  431,
101
                180,   232,   301,   7,     -291,  -243,  -291,  579,   578,   23,    -8190, 54,    55,    56,    57,    -8190, -8190, 58,    59,    60,
102
                61,    62,    63,    64,    65,    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,    -293,
103
                199,   11,    214,   -293,  -8190, -8190, 375,   374,   -88,   13,    -88,   80,    16,    81,    82,    83,    84,    85,    86,    87,
104
                88,    89,    90,    91,    92,    93,    -8190, -8190, -8190, 14,    105,   377,   378,   376,   12,    -88,   -88,   396,   15,    669,
105
                3,     198,   -8190, 21,    -8190, 261,   -8190, -8190, 396,   465,   4,     593,   396,   377,   378,   376,   22,    185,   604,   504,
106
                506,   102,   -246,  299,   300,   -8190, -8190, 194,   -8190, -240,  -291,  465,   106,   387,   -291,  377,   378,   376,   173,   174,
107
                381,   46,    -246,  -246,  -246,  47,    241,   232,   301,   -240,  -240,  -240,  301,   197,   28,    387,   398,   207,   -240,  307,
108
                -8190, -8190, 381,   107,   308,   383,   242,   243,   382,   388,   309,   310,   289,   -207,  -88,   197,   28,    387,   394,   207,
109
                395,   307,   96,    94,    381,   -207,  308,   383,   242,   243,   382,   388,   309,   310,   460,   200,   17,    197,   28,    19,
110
                336,   207,   29,    307,   96,    377,   378,   376,   308,   383,   242,   243,   382,   388,   309,   310,   450,   214,   95,    -8190,
111
                -8190, -8190, 216,   217,   218,   108,   96,    377,   378,   376,   -8190, -8190, -8190, 71,    72,    73,    74,    -8190, 448,   -8190,
112
                -8190, -8190, -8190, -206,  234,   -8190, 199,   387,   -8190, 206,   -8190, -8190, -8190, -8190, 381,   -206,  -8190, -8190, -8190, -8191,
113
                -8191, -8191, -8191, -8191, 257,   258,   259,   197,   28,    387,   -23,   207,   433,   307,   432,   433,   381,   432,   308,   383,
114
                242,   243,   382,   388,   309,   310,   -289,  -17,   -289,  197,   28,    -16,   -240,  207,   353,   307,   100,   377,   378,   376,
115
                308,   383,   242,   243,   382,   388,   309,   310,   444,   -8190, -8190, -8190, -240,  -240,  -240,  465,   680,   396,   44,    45,
116
                681,   -240,  -8190, -8190, -8190, 204,   205,   -8190, 103,   -8190, -8190, -8190, -8190, -8190, -8190, -8190, 377,   378,   376,   387,
117
                -8190, 200,   -8190, -8190, -8190, -8190, 381,   18,    -8190, -8190, -8190, -8190, 98,    -8190, -8190, -8190, 80,    301,   24,    197,
118
                28,    173,   174,   207,   101,   307,   195,   -8190, -8190, -8190, 308,   383,   242,   243,   382,   388,   309,   310,   387,   377,
119
                378,   376,   3,     198,   396,   381,   104,   261,   96,    682,   396,   -8190, -289,  593,   -8190, -8190, -289,  605,   197,   28,
120
                606,   -22,   207,   360,   307,   406,   300,   -8190, -8190, 308,   383,   242,   243,   382,   388,   309,   310,   -215,  433,   172,
121
                432,   387,   250,   46,    375,   374,   -52,   100,   381,   232,   301,   75,    76,    77,    78,    79,    200,   199,   -8190, -8190,
122
                -8190, 380,   379,   -247,  -276,  391,   -247,  392,   80,    286,   -275,  -274,  384,   383,   386,   385,   382,   388,   389,   390,
123
                -244,  -251,  -250,  -247,  -247,  -247,  -247,  -247,  -247,  288,   -242,  -249,  -206,  -241,  -248,  -206,  30,    72,    73,    74,
124
                -244,  -244,  -244,  1,     -206,  5,     9,     -206,  10,    -244,  -242,  -242,  -242,  -241,  -241,  -241,  219,   220,   221,   -242,
125
                25,    -251,  -241,  48,    49,    251,   -8190, -8190, -8190, 192,   193,   -250,  249,   433,   -249,  432,   451,   32,    252,   8,
126
                179,   -29,   201,   202,   -8190, 548,   203,   591,   449,   461,   445,   566,   -29,   543,   344,   349,   582,   549,   649,   0,
127
                20,    0,     0,     50,    269,   0,     677,   679,   407,   678,   559,   357,   676,   633,   647,   0,     368,   0,     590,   622,
128
                637,   672,   362,   0,     594,   0,     301,
129
        ];
130

131
        /** Table indexed analogously to self::Action. If self::ActionCheck[self::ActionBase[$state] + $symbol] != $symbol
132
         *  then the action is defaulted, i.e. self::ActionDefault[$state] should be used instead. */
133
        protected const ActionCheck = [
134
                30,    31,    37,    38,    39,    40,    41,    42,    43,    44,    45,    22,    69,    0,     71,    2,     46,    47,    2,     30,
135
                31,    51,    0,     53,    54,    55,    56,    57,    58,    59,    60,    61,    62,    80,    64,    65,    66,    67,    68,    69,
136
                0,     71,    72,    27,    28,    75,    76,    0,     78,    79,    107,   0,     82,    83,    21,    112,   64,    87,    88,    89,
137
                69,    108,   71,    30,    31,    2,     96,    97,    98,    99,    100,   3,     4,     5,     0,     105,   84,    85,    86,    88,
138
                6,     111,   112,   2,     0,     93,    2,     96,    97,    21,    3,     23,    24,    25,    26,    30,    31,    29,    30,    31,
139
                32,    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,    46,    47,    48,    49,    50,    106,
140
                52,    2,     106,   110,   3,     4,     30,    31,    0,     2,     2,     63,    7,     8,     9,     10,    11,    12,    13,    14,
141
                15,    16,    17,    18,    19,    20,    3,     4,     5,     22,    6,     3,     4,     5,     2,     27,    28,    72,    2,     74,
142
                64,    65,    74,    2,     21,    69,    23,    24,    72,    21,    105,   75,    72,    3,     4,     5,     91,    92,    90,    54,
143
                55,    2,     64,    87,    88,    30,    31,    2,     88,    64,    106,   21,    6,     45,    110,   3,     4,     5,     27,    28,
144
                52,    105,   84,    85,    86,    105,   2,     111,   112,   84,    85,    86,    112,   65,    66,    45,    2,     69,    93,    71,
145
                30,    31,    52,    6,     76,    77,    78,    79,    80,    81,    82,    83,    77,    93,    106,   65,    66,    45,    69,    69,
146
                71,    71,    94,    7,     52,    105,   76,    77,    78,    79,    80,    81,    82,    83,    106,   21,    6,     65,    66,    6,
147
                70,    69,    64,    71,    94,    3,     4,     5,     76,    77,    78,    79,    80,    81,    82,    83,    106,   106,   7,     3,
148
                4,     5,     84,    85,    86,    7,     94,    3,     4,     5,     3,     4,     5,     42,    43,    44,    45,    21,    106,   23,
149
                24,    25,    26,    93,    64,    29,    52,    45,    21,    30,    23,    24,    25,    26,    52,    105,   29,    30,    31,    32,
150
                33,    34,    35,    36,    84,    85,    86,    65,    66,    45,    22,    69,    98,    71,    100,   98,    52,    100,   76,    77,
151
                78,    79,    80,    81,    82,    83,    0,     22,    2,     65,    66,    22,    64,    69,    47,    71,    94,    3,     4,     5,
152
                76,    77,    78,    79,    80,    81,    82,    83,    106,   3,     4,     5,     84,    85,    86,    21,    69,    72,    94,    95,
153
                73,    93,    3,     4,     5,     26,    27,    21,    64,    23,    24,    25,    26,    3,     4,     5,     3,     4,     5,     45,
154
                21,    21,    23,    24,    25,    26,    52,    22,    29,    30,    31,    21,    107,   23,    24,    25,    63,    112,   22,    65,
155
                66,    27,    28,    69,    22,    71,    22,    3,     4,     5,     76,    77,    78,    79,    80,    81,    82,    83,    45,    3,
156
                4,     5,     64,    65,    72,    52,    22,    69,    94,    73,    72,    74,    106,   75,    46,    47,    110,   90,    65,    66,
157
                90,    22,    69,    81,    71,    94,    88,    30,    31,    76,    77,    78,    79,    80,    81,    82,    83,    93,    98,    93,
158
                100,   45,    93,    105,   30,    31,    106,   94,    52,    111,   112,   46,    47,    48,    49,    50,    21,    52,    3,     4,
159
                5,     65,    66,    64,    105,   69,    64,    71,    63,    106,   105,   105,   76,    77,    78,    79,    80,    81,    82,    83,
160
                64,    105,   105,   84,    85,    86,    84,    85,    86,    106,   64,    105,   93,    64,    105,   93,    64,    43,    44,    45,
161
                84,    85,    86,    105,   105,   105,   105,   105,   105,   93,    84,    85,    86,    84,    85,    86,    84,    85,    86,    93,
162
                105,   105,   93,    105,   105,   93,    3,     4,     5,     105,   105,   105,   105,   98,    105,   100,   106,   101,   102,   103,
163
                104,   106,   26,    27,    21,    106,   30,    106,   106,   106,   106,   106,   106,   106,   106,   106,   106,   106,   106,   -1,
164
                107,   -1,    -1,    107,   107,   -1,    108,   108,   108,   108,   108,   108,   108,   108,   108,   -1,    109,   -1,    110,   110,
165
                110,   110,   110,   -1,    111,   -1,    112,
166
        ];
167

168
        /** Map of states to their default action */
169
        protected const ActionDefault = [
170
                8191,  8191,  8191,  287,   8191,  287,   29,    29,    31,    287,   8191,  287,   29,    8191,  8191,  29,    8191,  8191,  8191,  8191,
171
                39,    29,    8191,  8191,  8191,  8191,  8191,  8191,  10,    238,   238,   238,   8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,
172
                8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,
173
                8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,
174
                8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  99,    8191,  8191,  8191,
175
                8191,  8191,  29,    8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  288,   288,   8191,  8191,  8191,  8191,  8191,  8191,  8191,
176
                8191,  8191,  1,     294,   295,   102,   86,    239,   290,   292,   89,    90,    101,   43,    44,    56,    141,   143,   177,   142,
177
                116,   122,   123,   124,   125,   126,   127,   128,   129,   130,   131,   132,   133,   134,   114,   115,   189,   178,   176,   175,
178
                139,   140,   144,   147,   113,   145,   146,   164,   165,   162,   163,   166,   8191,  8191,  8191,  167,   168,   169,   170,   8191,
179
                8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  8191,  171,   148,   71,    71,    71,    8191,  8191,  11,    8191,  8191,
180
                8191,  8191,  8191,  8191,  8191,  8191,  8191,  229,   154,   155,   157,   229,   194,   228,   173,   8191,  8191,  8191,  8191,  8191,
181
                8191,  8191,  8191,  8191,  234,   136,   138,   212,   149,   150,   240,   117,   8191,  8191,  8191,  233,   8191,  302,   240,   240,
182
                240,   34,    34,    34,    8191,  109,   109,   8191,  57,    34,    8191,  8191,  8191,  34,    34,    34,    2,     8191,  8191,  8191,
183
                218,   247,   240,   160,   8191,  151,   152,   153,   59,    8191,  205,   8191,  28,    193,   8191,  28,    28,    28,    8191,  260,
184
                261,   262,   28,    28,    28,    28,    196,   36,    73,    28,    28,    73,    8191,  8191,  28,    8191,  8191,  8191,  8191,  8191,
185
                8191,  8191,  8191,  223,   8191,  245,   258,   208,   15,    20,    21,    8191,  223,   244,   242,   158,   159,   161,   181,   182,
186
                183,   184,   185,   186,   187,   285,   8191,  281,   211,   8191,  8191,  240,   8191,  8191,  8191,  8191,  301,   8191,  240,   156,
187
                8191,  219,   265,   8191,  241,   240,   286,   8191,  8191,  8191,  8191,  60,    8191,  8191,  8191,  8191,  8191,  220,   8191,  8191,
188
                8191,  8191,  8191,  8191,  8191,  55,    8191,  8191,  8191,
189
        ];
190

191
        /** Map of non-terminals to a displacement into the self::Goto table. The corresponding goto state for this
192
         *  non-terminal/state pair is self::Goto[self::GotoBase[$nonTerminal] + $state] (unless defaulted) */
193
        protected const GotoBase = [
194
                0,     0,     -3,    0,     0,     0,     103,   0,     153,   -141,  55,    -9,    0,     101,   51,    0,     0,     0,     0,     143,
195
                244,   -4,    2,     281,   24,    98,    0,     113,   0,     123,   -31,   0,     0,     -69,   31,    29,    -10,   215,   0,     0,
196
                6,     5,     106,   30,    0,     0,     0,     -91,   74,    0,     73,    0,     0,     196,   35,    0,     0,     0,     72,    0,
197
                0,     0,     0,     118,   -54,   0,     0,     0,     54,    65,    102,   76,    87,    64,    0,     0,     -19,   -25,   0,     47,
198
                149,   151,   80,    0,     0,
199
        ];
200

201
        /** Table of states to goto after reduction. Indexed according to self::GotoBase comment. */
202
        protected const Goto = [
203
                112,   109,   112,   284,   285,   111,   112,   452,   112,   111,   333,   454,   463,   140,   128,   129,   128,   125,   125,   117,
204
                138,   131,   125,   490,   110,   490,   127,   127,   127,   122,   315,   316,   263,   317,   318,   319,   320,   321,   322,   323,
205
                324,   123,   124,   113,   114,   115,   116,   118,   136,   137,   139,   157,   160,   161,   162,   163,   165,   166,   167,   168,
206
                169,   170,   171,   175,   176,   177,   178,   190,   191,   208,   209,   210,   228,   229,   265,   266,   267,   339,   141,   142,
207
                143,   144,   145,   146,   147,   148,   149,   150,   151,   152,   153,   154,   155,   130,   158,   119,   120,   130,   131,   132,
208
                121,   159,   133,   156,   134,   135,   183,   335,   183,   401,   453,   183,   183,   402,   183,   183,   673,   674,   675,   187,
209
                188,   189,   188,   430,   430,   430,   430,   574,   574,   574,   574,   430,   430,   430,   430,   430,   430,   430,   576,   576,
210
                576,   576,   576,   576,   576,   576,   576,   576,   576,   576,   576,   576,   576,   342,   340,   340,   473,   332,   264,   340,
211
                340,   474,   651,   332,   411,   475,   332,   332,   332,   427,   434,   436,   438,   435,   437,   439,   415,   636,   636,   636,
212
                636,   262,   345,   225,   226,   238,   331,   338,   230,   231,   239,   240,   280,   281,   638,   639,   640,   648,   648,   648,
213
                648,   648,   648,   312,   312,   592,   592,   592,   592,   592,   592,   592,   592,   592,   313,   313,   313,   313,   313,   313,
214
                313,   313,   313,   313,   313,   446,   347,   367,   446,   446,   447,   634,   634,   615,   615,   615,   615,   615,   615,   615,
215
                615,   615,   615,   615,   612,   612,   612,   612,   612,   612,   612,   612,   612,   612,   612,   314,   314,   314,   314,   314,
216
                314,   314,   314,   314,   314,   314,   348,   469,   355,   334,   237,   274,   541,   356,   420,   480,   479,   237,   237,   233,
217
                363,   409,   184,   184,   325,   567,   325,   237,   237,   683,   325,   352,   325,   329,   330,   667,   244,   641,   642,   237,
218
                346,   572,   561,   561,   329,   330,   287,   423,   573,   624,   625,   626,   667,   668,   328,   328,   328,   328,   443,   223,
219
                477,   568,   364,   0,     668,   341,   245,   246,   0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
220
                0,     0,     0,     0,     404,   404,   404,   365,   570,   0,     0,     0,     404,   0,     0,     0,     404,   404,   404,   0,
221
                0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
222
                0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
223
                0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
224
                0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
225
                0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
226
                418,   418,
227
        ];
228

229
        /** Table indexed analogously to self::Goto. If self::GotoCheck[self::GotoBase[$nonTerminal] + $state] != $nonTerminal
230
         *  then the goto state is defaulted, i.e. self::GotoDefault[$nonTerminal] should be used. */
231
        protected const GotoCheck = [
232
                2,     2,     2,     36,    36,    2,     2,     41,    2,     2,     40,    41,    41,    2,     2,     2,     2,     2,     2,     2,
233
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
234
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
235
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
236
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
237
                2,     2,     2,     2,     2,     2,     6,     70,    6,     13,    42,    6,     6,     13,    6,     6,     9,     9,     9,     6,
238
                6,     6,     6,     33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,    64,    64,
239
                64,    64,    64,    64,    64,    64,    64,    64,    64,    64,    64,    64,    64,    76,    8,     8,     47,    8,     80,    8,
240
                8,     47,    81,    8,     19,    47,    8,     8,     8,     30,    30,    30,    30,    30,    30,    30,    21,    76,    76,    76,
241
                76,    22,    22,    22,    22,    22,    22,    22,    22,    22,    22,    22,    77,    77,    77,    77,    77,    76,    76,    76,
242
                76,    76,    76,    24,    24,    24,    24,    24,    24,    24,    24,    24,    24,    24,    54,    54,    54,    54,    54,    54,
243
                54,    54,    54,    54,    54,    37,    53,    53,    37,    37,    37,    76,    76,    68,    68,    68,    68,    68,    68,    68,
244
                68,    68,    68,    68,    69,    69,    69,    69,    69,    69,    69,    69,    69,    69,    69,    71,    71,    71,    71,    71,
245
                71,    71,    71,    71,    71,    71,    11,    11,    11,    20,    10,    50,    50,    11,    11,    11,    11,    10,    10,    73,
246
                11,    11,    6,     6,     23,    11,    23,    10,    10,    10,    23,    25,    23,    14,    14,    82,    73,    79,    79,    10,
247
                23,    43,    35,    35,    14,    14,    14,    27,    43,    43,    43,    43,    82,    82,    63,    63,    63,    63,    29,    72,
248
                48,    58,    34,    -1,    82,    8,     8,     8,     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
249
                -1,    -1,    -1,    -1,    6,     6,     6,     10,    10,    -1,    -1,    -1,    6,     -1,    -1,    -1,    6,     6,     6,     -1,
250
                -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
251
                -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
252
                -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
253
                -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
254
                -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
255
                23,    23,
256
        ];
257

258
        /** Map of non-terminals to the default state to goto after their reduction */
259
        protected const GotoDefault = [
260
                -8192, 295,   126,   256,   372,   373,   186,   393,   311,   646,   632,   399,   272,   653,   293,   292,   488,   358,   290,   410,
261
                359,   414,   164,   302,   303,   350,   283,   422,   255,   441,   248,   268,   351,   270,   361,   481,   282,   464,   489,   275,
262
                467,   462,   456,   571,   277,   276,   247,   472,   476,   487,   273,   557,   291,   343,   212,   564,   366,   294,   569,   623,
263
                271,   304,   278,   583,   260,   227,   305,   -8192, 235,   224,   326,   213,   222,   666,   236,   306,   621,   279,   628,   635,
264
                327,   652,   665,   337,   354,
265
        ];
266

267
        /** Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for
268
         *  determining the state to goto after reduction. */
269
        protected const RuleToNonTerminal = [
270
                0,     1,     1,     1,     1,     6,     6,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
271
                7,     7,     8,     8,     8,     9,     9,     10,    11,    11,    4,     4,     12,    12,    14,    14,    15,    15,    16,    17,
272
                17,    18,    18,    19,    19,    5,     5,     21,    21,    21,    21,    25,    25,    26,    26,    27,    27,    29,    29,    29,
273
                29,    30,    30,    30,    30,    31,    31,    31,    31,    32,    32,    28,    28,    34,    34,    35,    35,    36,    36,    38,
274
                38,    38,    38,    39,    39,    39,    37,    37,    42,    42,    42,    43,    43,    44,    44,    41,    41,    41,    41,    40,
275
                20,    45,    45,    46,    46,    3,     3,     47,    47,    48,    48,    48,    48,    2,     2,     2,     2,     2,     2,     2,
276
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
277
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
278
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
279
                2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,     54,    55,    49,    49,    52,    52,    56,    57,
280
                57,    58,    59,    59,    59,    63,    33,    33,    64,    64,    64,    50,    50,    50,    61,    61,    67,    67,    68,    69,
281
                69,    24,    71,    71,    71,    71,    51,    51,    51,    51,    51,    51,    51,    51,    51,    51,    51,    51,    53,    53,
282
                66,    66,    66,    66,    66,    74,    74,    74,    60,    60,    60,    60,    75,    75,    75,    75,    75,    75,    22,    22,
283
                22,    22,    22,    76,    76,    79,    78,    65,    65,    65,    65,    65,    65,    65,    62,    62,    62,    77,    77,    77,
284
                23,    70,    80,    80,    81,    81,    81,    81,    13,    13,    13,    13,    13,    13,    13,    13,    72,    72,    72,    72,
285
                73,    83,    82,    82,    82,    82,    82,    82,    82,    82,    82,    84,    84,    84,    84,
286
        ];
287

288
        /** Map of rules to the length of their right-hand side, which is the number of elements that have to
289
         *  be popped from the stack(s) on reduction. */
290
        protected const RuleToLength = [
291
                1,     2,     2,     2,     2,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
292
                1,     1,     1,     1,     1,     1,     1,     1,     0,     1,     2,     0,     1,     3,     0,     1,     0,     1,     7,     0,
293
                2,     1,     3,     3,     4,     1,     3,     1,     2,     1,     1,     2,     0,     1,     3,     4,     6,     1,     2,     1,
294
                1,     1,     1,     1,     1,     3,     3,     3,     3,     3,     3,     0,     1,     0,     2,     2,     4,     1,     3,     2,
295
                4,     4,     3,     3,     1,     3,     1,     1,     2,     2,     3,     2,     4,     1,     3,     1,     1,     3,     1,     1,
296
                2,     3,     1,     2,     2,     1,     2,     3,     3,     0,     3,     3,     1,     1,     3,     3,     3,     4,     1,     1,
297
                2,     2,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     2,     2,     2,     2,     3,
298
                3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     2,     2,
299
                2,     2,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,     5,     4,     3,     3,     4,
300
                4,     2,     2,     2,     2,     2,     2,     2,     1,     8,     12,    9,     3,     2,     1,     1,     0,     4,     2,     1,
301
                3,     2,     2,     2,     4,     1,     1,     1,     1,     1,     1,     1,     1,     3,     1,     1,     0,     1,     1,     3,
302
                5,     3,     4,     1,     1,     3,     1,     1,     1,     1,     1,     1,     1,     1,     1,     3,     2,     3,     0,     1,
303
                1,     3,     1,     1,     1,     1,     1,     1,     1,     3,     1,     1,     1,     4,     1,     4,     4,     4,     1,     1,
304
                3,     3,     3,     1,     4,     1,     3,     1,     4,     3,     3,     3,     3,     3,     1,     3,     1,     1,     3,     1,
305
                4,     1,     3,     1,     1,     1,     3,     0,     1,     2,     3,     4,     3,     4,     2,     2,     2,     2,     1,     2,
306
                1,     1,     1,     4,     3,     3,     3,     3,     3,     6,     3,     1,     1,     2,     1,
307
        ];
308

309
        /** Map of symbols to their names */
310
        protected const SymbolToName = [
311
                'end',
312
                'error',
313
                "','",
314
                "'or'",
315
                "'xor'",
316
                "'and'",
317
                "'=>'",
318
                "'='",
319
                "'+='",
320
                "'-='",
321
                "'*='",
322
                "'/='",
323
                "'.='",
324
                "'%='",
325
                "'&='",
326
                "'|='",
327
                "'^='",
328
                "'<<='",
329
                "'>>='",
330
                "'**='",
331
                "'??='",
332
                "'?'",
333
                "':'",
334
                "'??'",
335
                "'||'",
336
                "'&&'",
337
                "'|'",
338
                "'|'",
339
                "'?|'",
340
                "'^'",
341
                "'&'",
342
                "'&'",
343
                "'=='",
344
                "'!='",
345
                "'==='",
346
                "'!=='",
347
                "'<=>'",
348
                "'<'",
349
                "'<='",
350
                "'>'",
351
                "'>='",
352
                "'|>'",
353
                "'.'",
354
                "'<<'",
355
                "'>>'",
356
                "'in'",
357
                "'+'",
358
                "'-'",
359
                "'*'",
360
                "'/'",
361
                "'%'",
362
                "'!'",
363
                "'instanceof'",
364
                "'~'",
365
                "'++'",
366
                "'--'",
367
                "'(int)'",
368
                "'(float'",
369
                "'(string)'",
370
                "'(array)'",
371
                "'(object)'",
372
                "'(bool)'",
373
                "'@'",
374
                "'**'",
375
                "'['",
376
                "'new'",
377
                "'clone'",
378
                'integer',
379
                'floating-point number',
380
                'identifier',
381
                'variable name',
382
                'constant',
383
                'variable',
384
                'number',
385
                'string content',
386
                'quoted string',
387
                "'match'",
388
                "'default'",
389
                "'function'",
390
                "'fn'",
391
                "'return'",
392
                "'use'",
393
                "'isset'",
394
                "'empty'",
395
                "'->'",
396
                "'?->'",
397
                "'??->'",
398
                "'list'",
399
                "'array'",
400
                "'heredoc start'",
401
                "'heredoc end'",
402
                "'\${'",
403
                "'{\$'",
404
                "'::'",
405
                "'...'",
406
                "'(expand)'",
407
                'fully qualified name',
408
                'namespaced name',
409
                "'null'",
410
                "'true'",
411
                "'false'",
412
                "'e'",
413
                "'m'",
414
                "'a'",
415
                "'f'",
416
                "'('",
417
                "')'",
418
                "'{'",
419
                "'}'",
420
                "';'",
421
                "']'",
422
                "'\"'",
423
                "'$'",
424
                "'\\\\'",
425
                'whitespace',
426
                'comment',
427
        ];
428

429
        /** Temporary value containing the result of last semantic action (reduction) */
430
        protected mixed $semValue = null;
431

432
        /** Semantic value stack (contains values of tokens and semantic action results) */
433
        protected array $semStack;
434

435
        /** @var Token[] Start attribute stack */
436
        protected array $startTokenStack;
437

438

439
        protected function reduce(int $rule, int $pos): void
1✔
440
        {
441
                (match ($rule) {
1✔
442
                        0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 28, 29, 57, 72, 74, 87, 95, 98, 112, 113, 118, 119, 188, 194, 195, 205, 207, 211, 212, 214, 215, 217, 228, 233, 234, 239, 240, 242, 243, 244, 245, 246, 248, 250, 251, 252, 254, 258, 259, 263, 267, 274, 276, 277, 279, 284, 302, 314 => fn() => $this->semValue = $this->semStack[$pos],
1✔
443
                        2 => fn() => $this->semValue = new Node\ModifierNode($this->semStack[$pos], position: $this->startTokenStack[$pos]->position),
1✔
444
                        3 => fn() => $this->semValue = new Expression\ArrayNode($this->semStack[$pos], position: $this->startTokenStack[$pos]->position),
1✔
445
                        22, 23, 24, 25, 26, 62, 63, 64 => fn() => $this->semValue = new Node\IdentifierNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
446
                        27 => fn() => $this->semValue = new Expression\VariableNode(substr($this->semStack[$pos], 1), $this->startTokenStack[$pos]->position),
1✔
447
                        30, 40, 51, 100, 110, 111, 173, 174, 197, 198, 213, 241, 249, 275, 278, 310 => fn() => $this->semValue = $this->semStack[$pos - 1],
1✔
448
                        31, 39, 52, 75, 79, 91, 109, 196, 216 => fn() => $this->semValue = [],
1✔
449
                        32, 41, 53, 77, 84, 93, 102, 105, 199, 283, 298 => fn() => $this->semValue = [$this->semStack[$pos]],
1✔
450
                        33, 42, 54, 66, 68, 70, 78, 85, 94, 101, 200, 282 => function () use ($pos) {
1✔
451
                                $this->semStack[$pos - 2][] = $this->semStack[$pos];
1✔
452
                                $this->semValue = $this->semStack[$pos - 2];
1✔
453
                        },
1✔
454
                        34, 36 => fn() => $this->semValue = false,
1✔
455
                        35, 37 => fn() => $this->semValue = true,
1✔
456
                        38 => fn() => $this->semValue = new Expression\MatchNode($this->semStack[$pos - 4], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 6]->position),
1✔
457
                        43 => fn() => $this->semValue = new Node\MatchArmNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
458
                        44 => fn() => $this->semValue = new Node\MatchArmNode(null, $this->semStack[$pos], $this->startTokenStack[$pos - 3]->position),
1✔
459
                        45 => fn() => $this->semValue = [null, ...$this->semStack[$pos]],
1✔
460
                        46 => fn() => $this->semValue = [$this->semStack[$pos - 2], ...$this->semStack[$pos]],
1✔
461
                        47, 49 => fn() => $this->semValue = [$this->semStack[$pos], false],
1✔
462
                        48 => fn() => $this->semValue = [$this->semStack[$pos], true],
×
463
                        50 => fn() => $this->semValue = [$this->convertArrayToList($this->semStack[$pos]), false],
1✔
464
                        55 => fn() => $this->semValue = new Node\ParameterNode($this->semStack[$pos], null, $this->semStack[$pos - 3], $this->semStack[$pos - 2], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
1✔
465
                        56 => fn() => $this->semValue = new Node\ParameterNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->semStack[$pos - 5], $this->semStack[$pos - 4], $this->semStack[$pos - 3], $this->startTokenStack[$pos - 5]->position),
1✔
466
                        58 => fn() => $this->semValue = new Node\NullableTypeNode($this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
467
                        59 => fn() => $this->semValue = new Node\UnionTypeNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
468
                        60 => fn() => $this->semValue = new Node\IntersectionTypeNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
469
                        61 => fn() => $this->semValue = TagParser::handleBuiltinTypes($this->semStack[$pos]),
1✔
470
                        65, 67, 69 => fn() => $this->semValue = [$this->semStack[$pos - 2], $this->semStack[$pos]],
1✔
471
                        71, 73, 238 => fn() => $this->semValue = null,
1✔
472
                        76, 80, 92 => fn() => $this->semValue = $this->semStack[$pos - 2],
1✔
473
                        81 => fn() => $this->semValue = [new Node\ArgumentNode($this->semStack[$pos - 2], false, false, null, $this->startTokenStack[$pos - 3]->position)],
1✔
474
                        82 => fn() => $this->semValue = [$this->semStack[$pos - 1]],
1✔
475
                        83 => fn() => $this->semValue = [new Node\ArgumentNode($this->semStack[$pos - 2], false, false, null, $this->startTokenStack[$pos - 2]->position), $this->semStack[$pos]],
1✔
476
                        86 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], false, false, null, $this->startTokenStack[$pos]->position),
1✔
477
                        88 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], true, false, null, $this->startTokenStack[$pos - 1]->position),
1✔
478
                        89 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], false, true, null, $this->startTokenStack[$pos - 1]->position),
1✔
479
                        90 => fn() => $this->semValue = new Node\ArgumentNode($this->semStack[$pos], false, false, $this->semStack[$pos - 2], $this->startTokenStack[$pos - 2]->position),
1✔
480
                        96 => fn() => $this->semValue = new Node\ArgumentPlaceholderNode(null, $this->startTokenStack[$pos]->position),
1✔
481
                        97 => fn() => $this->semValue = new Node\ArgumentPlaceholderNode($this->semStack[$pos - 2], $this->startTokenStack[$pos - 2]->position),
1✔
482
                        99 => fn() => $this->semValue = new Node\VariadicPlaceholderNode($this->startTokenStack[$pos]->position),
1✔
483
                        103, 104 => fn() => $this->semValue = new Expression\FilterCallNode($this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
484
                        106, 296, 297 => function () use ($pos) {
1✔
485
                                $this->semStack[$pos - 1][] = $this->semStack[$pos];
1✔
486
                                $this->semValue = $this->semStack[$pos - 1];
1✔
487
                        },
1✔
488
                        107 => fn() => $this->semValue = new Node\FilterNode($this->semStack[$pos - 1], $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
1✔
489
                        108 => fn() => $this->semValue = new Node\FilterNode($this->semStack[$pos - 1], $this->semStack[$pos], true, $this->startTokenStack[$pos - 2]->position),
1✔
490
                        114, 116 => fn() => $this->semValue = new Expression\AssignNode($this->semStack[$pos - 2], $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
1✔
491
                        115 => fn() => $this->semValue = new Expression\AssignNode($this->convertArrayToList($this->semStack[$pos - 2]), $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
1✔
492
                        117 => fn() => $this->semValue = new Expression\AssignNode($this->semStack[$pos - 3], $this->semStack[$pos], true, $this->startTokenStack[$pos - 3]->position),
1✔
493
                        120 => fn() => $this->semValue = new Expression\FunctionCallNode(new Node\NameNode($this->semStack[$pos - 1], Node\NameNode::KindNormal, $this->startTokenStack[$pos - 1]->position), $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
494
                        121 => fn() => $this->semValue = new Expression\CloneNode($this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
495
                        122 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '+', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
496
                        123 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '-', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
497
                        124 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '*', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
498
                        125 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '/', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
499
                        126 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '.', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
500
                        127 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '%', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
501
                        128 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '&', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
502
                        129 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '|', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
503
                        130 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '^', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
504
                        131 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '<<', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
505
                        132 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '>>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
506
                        133 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '**', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
507
                        134 => fn() => $this->semValue = new Expression\AssignOpNode($this->semStack[$pos - 2], '??', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
508
                        135 => fn() => $this->semValue = new Expression\PostOpNode($this->semStack[$pos - 1], '++', $this->startTokenStack[$pos - 1]->position),
1✔
509
                        136 => fn() => $this->semValue = new Expression\PreOpNode($this->semStack[$pos], '++', $this->startTokenStack[$pos - 1]->position),
1✔
510
                        137 => fn() => $this->semValue = new Expression\PostOpNode($this->semStack[$pos - 1], '--', $this->startTokenStack[$pos - 1]->position),
1✔
511
                        138 => fn() => $this->semValue = new Expression\PreOpNode($this->semStack[$pos], '--', $this->startTokenStack[$pos - 1]->position),
1✔
512
                        139 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '||', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
513
                        140 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '&&', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
514
                        141 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], 'or', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
515
                        142 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], 'and', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
516
                        143 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], 'xor', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
517
                        144 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '|', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
518
                        145, 146 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '&', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
519
                        147 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '^', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
520
                        148 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '.', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
521
                        149 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '+', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
522
                        150 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '-', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
523
                        151 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '*', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
524
                        152 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '/', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
525
                        153 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '%', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
526
                        154 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<<', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
527
                        155 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '>>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
528
                        156 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '**', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
529
                        157 => fn() => $this->semValue = new Expression\InNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
530
                        158 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '+', $this->startTokenStack[$pos - 1]->position),
1✔
531
                        159 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '-', $this->startTokenStack[$pos - 1]->position),
1✔
532
                        160 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '!', $this->startTokenStack[$pos - 1]->position),
1✔
533
                        161 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '~', $this->startTokenStack[$pos - 1]->position),
1✔
534
                        162 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '===', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
535
                        163 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '!==', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
536
                        164 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '==', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
537
                        165 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '!=', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
538
                        166 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<=>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
539
                        167 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
540
                        168 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '<=', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
541
                        169 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
542
                        170 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '>=', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
543
                        171 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '|>', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
544
                        172 => fn() => $this->semValue = new Expression\InstanceofNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
545
                        175 => fn() => $this->semValue = new Expression\TernaryNode($this->semStack[$pos - 4], $this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 4]->position),
1✔
546
                        176 => fn() => $this->semValue = new Expression\TernaryNode($this->semStack[$pos - 3], null, $this->semStack[$pos], $this->startTokenStack[$pos - 3]->position),
1✔
547
                        177 => fn() => $this->semValue = new Expression\TernaryNode($this->semStack[$pos - 2], $this->semStack[$pos], null, $this->startTokenStack[$pos - 2]->position),
1✔
548
                        178 => fn() => $this->semValue = new Expression\BinaryOpNode($this->semStack[$pos - 2], '??', $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
549
                        179 => fn() => $this->semValue = new Expression\IssetNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
1✔
550
                        180 => fn() => $this->semValue = new Expression\EmptyNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
1✔
551
                        181 => fn() => $this->semValue = new Expression\CastNode('int', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
552
                        182 => fn() => $this->semValue = new Expression\CastNode('float', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
553
                        183 => fn() => $this->semValue = new Expression\CastNode('string', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
554
                        184 => fn() => $this->semValue = new Expression\CastNode('array', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
555
                        185 => fn() => $this->semValue = new Expression\CastNode('object', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
556
                        186 => fn() => $this->semValue = new Expression\CastNode('bool', $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
557
                        187 => fn() => $this->semValue = new Expression\UnaryOpNode($this->semStack[$pos], '@', $this->startTokenStack[$pos - 1]->position),
1✔
558
                        189 => fn() => $this->semValue = new Expression\ClosureNode((bool) $this->semStack[$pos - 6], $this->semStack[$pos - 4], [], $this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 7]->position),
1✔
559
                        190 => fn() => $this->semValue = new Expression\ClosureNode((bool) $this->semStack[$pos - 10], $this->semStack[$pos - 8], $this->semStack[$pos - 6], $this->semStack[$pos - 5], $this->semStack[$pos - 2], $this->startTokenStack[$pos - 11]->position),
1✔
560
                        191 => fn() => $this->semValue = new Expression\ClosureNode((bool) $this->semStack[$pos - 7], $this->semStack[$pos - 5], $this->semStack[$pos - 3], $this->semStack[$pos - 2], null, $this->startTokenStack[$pos - 8]->position),
1✔
561
                        192 => fn() => $this->semValue = new Expression\NewNode($this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
562
                        193 => fn() => $this->semValue = new Expression\NewNode($this->semStack[$pos], [], $this->startTokenStack[$pos - 1]->position),
1✔
563
                        201 => fn() => $this->semValue = new Node\ClosureUseNode($this->semStack[$pos], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 1]->position),
1✔
564
                        202, 203 => fn() => $this->semValue = $this->checkFunctionName(new Expression\FunctionCallNode($this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position)),
1✔
565
                        204 => fn() => $this->semValue = new Expression\StaticMethodCallNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 3]->position),
1✔
566
                        206, 209 => fn() => $this->semValue = new Node\NameNode($this->semStack[$pos], Node\NameNode::KindNormal, $this->startTokenStack[$pos]->position),
1✔
567
                        208 => fn() => $this->semValue = new Node\NameNode($this->semStack[$pos], -1, $this->startTokenStack[$pos]->position),
1✔
568
                        210 => fn() => $this->semValue = new Node\NameNode($this->semStack[$pos], Node\NameNode::KindFullyQualified, $this->startTokenStack[$pos]->position),
1✔
569
                        218 => fn() => $this->semValue = new Expression\ConstantFetchNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
570
                        219 => fn() => $this->semValue = new Expression\ClassConstantFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
571
                        220 => fn() => $this->semValue = new Expression\ClassConstantFetchNode($this->semStack[$pos - 4], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 4]->position),
1✔
572
                        221 => fn() => $this->semValue = new Expression\ArrayNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 2]->position),
1✔
573
                        222 => fn() => $this->semValue = new Expression\ArrayNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
1✔
574
                        223 => function () use ($pos) {
1✔
575
                                $this->semValue = $this->semStack[$pos];
1✔
576
                                $this->shortArrays->offsetSet($this->semValue);
1✔
577
                        },
1✔
578
                        224 => fn() => $this->semValue = Scalar\StringNode::parse($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
579
                        225 => fn() => $this->semValue = Scalar\InterpolatedStringNode::parse($this->semStack[$pos - 1], $this->startTokenStack[$pos - 2]->position),
1✔
580
                        226 => fn() => $this->semValue = Scalar\IntegerNode::parse($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
581
                        227 => fn() => $this->semValue = Scalar\FloatNode::parse($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
582
                        229, 311 => fn() => $this->semValue = new Scalar\StringNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
583
                        230 => fn() => $this->semValue = new Scalar\BooleanNode(true, $this->startTokenStack[$pos]->position),
1✔
584
                        231 => fn() => $this->semValue = new Scalar\BooleanNode(false, $this->startTokenStack[$pos]->position),
1✔
585
                        232 => fn() => $this->semValue = new Scalar\NullNode($this->startTokenStack[$pos]->position),
1✔
586
                        235 => fn() => $this->semValue = $this->parseDocString($this->semStack[$pos - 2], [$this->semStack[$pos - 1]], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position, $this->startTokenStack[$pos]->position),
1✔
587
                        236 => fn() => $this->semValue = $this->parseDocString($this->semStack[$pos - 1], [], $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position, $this->startTokenStack[$pos]->position),
1✔
588
                        237 => fn() => $this->semValue = $this->parseDocString($this->semStack[$pos - 2], $this->semStack[$pos - 1], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position, $this->startTokenStack[$pos]->position),
1✔
589
                        247 => fn() => $this->semValue = new Expression\ConstantFetchNode(new Node\NameNode($this->semStack[$pos], Node\NameNode::KindNormal, $this->startTokenStack[$pos]->position), $this->startTokenStack[$pos]->position),
1✔
590
                        253, 268, 303 => fn() => $this->semValue = new Expression\ArrayAccessNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
1✔
591
                        255 => fn() => $this->semValue = new Expression\MethodCallNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->semStack[$pos], false, $this->startTokenStack[$pos - 3]->position),
1✔
592
                        256 => fn() => $this->semValue = new Expression\MethodCallNode($this->semStack[$pos - 3], $this->semStack[$pos - 1], $this->semStack[$pos], true, $this->startTokenStack[$pos - 3]->position),
1✔
593
                        257 => function () use ($pos) {
1✔
594
                                $this->semValue = new Expression\MethodCallNode(new Expression\BinaryOpNode($this->semStack[$pos - 3], '??', new Scalar\NullNode($this->startTokenStack[$pos - 3]->position), $this->startTokenStack[$pos - 3]->position), $this->semStack[$pos - 1], $this->semStack[$pos], true, $this->startTokenStack[$pos - 3]->position);
1✔
595
                                trigger_error('Latte: undefined-nullsafe operator ??-> is deprecated, used ' . $this->startTokenStack[$pos - 3]->position);
1✔
596
                        },
1✔
597
                        260, 269, 304 => fn() => $this->semValue = new Expression\PropertyFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], false, $this->startTokenStack[$pos - 2]->position),
1✔
598
                        261, 270, 305 => fn() => $this->semValue = new Expression\PropertyFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], true, $this->startTokenStack[$pos - 2]->position),
1✔
599
                        262, 271, 306 => function () use ($pos) {
1✔
600
                                $this->semValue = new Expression\PropertyFetchNode(new Expression\BinaryOpNode($this->semStack[$pos - 2], '??', new Scalar\NullNode($this->startTokenStack[$pos - 2]->position), $this->startTokenStack[$pos - 2]->position), $this->semStack[$pos], true, $this->startTokenStack[$pos - 2]->position);
1✔
601
                                trigger_error('Latte: undefined-nullsafe operator ??-> is deprecated, used ' . $this->startTokenStack[$pos - 2]->position);
1✔
602
                        },
1✔
603
                        264 => fn() => $this->semValue = new Expression\VariableNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position),
1✔
604
                        265 => function () use ($pos) {
1✔
605
                                $var = $this->semStack[$pos]->name;
1✔
606
                                $this->semValue = is_string($var)
1✔
607
                                        ? new Node\VarLikeIdentifierNode($var, $this->startTokenStack[$pos]->position)
1✔
608
                                        : $var;
1✔
609
                        },
1✔
610
                        266, 272, 273 => fn() => $this->semValue = new Expression\StaticPropertyFetchNode($this->semStack[$pos - 2], $this->semStack[$pos], $this->startTokenStack[$pos - 2]->position),
1✔
611
                        280 => fn() => $this->semValue = $this->convertArrayToList(new Expression\ArrayNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 3]->position)),
1✔
612
                        281 => function () use ($pos) {
1✔
613
                                $this->semValue = $this->semStack[$pos];
1✔
614
                                $end = count($this->semValue) - 1;
1✔
615
                                if (
616
                                        $this->semValue[$end]->value instanceof Expression\TemporaryNode
1✔
617
                                        && !$this->semValue[$end]->value->value
1✔
618
                                ) {
619
                                        array_pop($this->semValue);
1✔
620
                                }
621
                        },
1✔
622
                        285 => fn() => $this->semValue = new Node\ArrayItemNode(new Expression\TemporaryNode($this->semStack[$pos], $this->startTokenStack[$pos]->position), null, false, false, $this->startTokenStack[$pos]->position),
1✔
623
                        286 => fn() => $this->semValue = new Node\ArrayItemNode(new Expression\TemporaryNode($this->semStack[$pos], $this->startTokenStack[$pos - 2]->position), $this->semStack[$pos - 2], false, false, $this->startTokenStack[$pos - 2]->position),
1✔
624
                        287 => fn() => $this->semValue = new Node\ArrayItemNode(new Expression\TemporaryNode(null), null, false, false, $this->startTokenStack[$pos]->position),
1✔
625
                        288 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], null, false, false, $this->startTokenStack[$pos]->position),
1✔
626
                        289 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], null, true, false, $this->startTokenStack[$pos - 1]->position),
1✔
627
                        290, 292 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], $this->semStack[$pos - 2], false, false, $this->startTokenStack[$pos - 2]->position),
1✔
628
                        291, 293 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], $this->semStack[$pos - 3], true, false, $this->startTokenStack[$pos - 3]->position),
1✔
629
                        294, 295 => fn() => $this->semValue = new Node\ArrayItemNode($this->semStack[$pos], null, false, true, $this->startTokenStack[$pos - 1]->position),
1✔
630
                        299 => fn() => $this->semValue = [$this->semStack[$pos - 1], $this->semStack[$pos]],
1✔
631
                        300 => fn() => $this->semValue = new Node\InterpolatedStringPartNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
NEW
632
                        301 => fn() => $this->semValue = new Expression\VariableNode($this->semStack[$pos], $this->startTokenStack[$pos]->position),
×
NEW
633
                        307, 308 => fn() => $this->semValue = new Expression\VariableNode($this->semStack[$pos - 1], $this->startTokenStack[$pos - 2]->position),
×
NEW
634
                        309 => fn() => $this->semValue = new Expression\ArrayAccessNode($this->semStack[$pos - 4], $this->semStack[$pos - 2], $this->startTokenStack[$pos - 5]->position),
×
635
                        312 => fn() => $this->semValue = TagParser::parseOffset($this->semStack[$pos], $this->startTokenStack[$pos]->position),
1✔
636
                        313 => fn() => $this->semValue = TagParser::parseOffset('-' . $this->semStack[$pos], $this->startTokenStack[$pos - 1]->position),
1✔
637
                })();
1✔
638
        }
1✔
639
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc