@@ -1446,15 +1446,11 @@ protected function tokenize($string)
1446
1446
&& strpos ($ token [1 ], '#[ ' ) === 0
1447
1447
) {
1448
1448
$ subTokens = $ this ->parsePhpAttribute ($ tokens , $ stackPtr );
1449
- if ($ subTokens !== null ) {
1450
- array_splice ($ tokens , $ stackPtr , 1 , $ subTokens );
1451
- $ numTokens = count ($ tokens );
1449
+ array_splice ($ tokens , $ stackPtr , 1 , $ subTokens );
1450
+ $ numTokens = count ($ tokens );
1452
1451
1453
- $ tokenIsArray = true ;
1454
- $ token = $ tokens [$ stackPtr ];
1455
- } else {
1456
- $ token [0 ] = T_ATTRIBUTE ;
1457
- }
1452
+ $ tokenIsArray = true ;
1453
+ $ token = $ tokens [$ stackPtr ];
1458
1454
}
1459
1455
1460
1456
if ($ tokenIsArray === true
@@ -4105,11 +4101,10 @@ private function findCloser(array &$tokens, $start, $openerTokens, $closerChar)
4105
4101
* @param array $tokens The original array of tokens (as returned by token_get_all).
4106
4102
* @param int $stackPtr The current position in token array.
4107
4103
*
4108
- * @return array|null The array of parsed attribute tokens
4104
+ * @return array The array of parsed attribute tokens
4109
4105
*/
4110
4106
private function parsePhpAttribute (array &$ tokens , $ stackPtr )
4111
4107
{
4112
-
4113
4108
$ token = $ tokens [$ stackPtr ];
4114
4109
4115
4110
$ commentBody = substr ($ token [1 ], 2 );
@@ -4121,18 +4116,24 @@ private function parsePhpAttribute(array &$tokens, $stackPtr)
4121
4116
&& strpos ($ subToken [1 ], '#[ ' ) === 0
4122
4117
) {
4123
4118
$ reparsed = $ this ->parsePhpAttribute ($ subTokens , $ i );
4124
- if ($ reparsed !== null ) {
4125
- array_splice ($ subTokens , $ i , 1 , $ reparsed );
4126
- } else {
4127
- $ subToken [0 ] = T_ATTRIBUTE ;
4128
- }
4119
+ array_splice ($ subTokens , $ i , 1 , $ reparsed );
4129
4120
}
4130
4121
}
4131
4122
4132
4123
array_splice ($ subTokens , 0 , 1 , [[T_ATTRIBUTE , '#[ ' ]]);
4133
4124
4134
4125
// Go looking for the close bracket.
4135
4126
$ bracketCloser = $ this ->findCloser ($ subTokens , 1 , '[ ' , '] ' );
4127
+
4128
+ /*
4129
+ * No closer bracket found, this might be a multi-line attribute,
4130
+ * but it could also be an unfinished attribute (parse error).
4131
+ *
4132
+ * If it is a multi-line attribute, we need to grab a larger part of the code.
4133
+ * If it is a parse error, we need to stick with only handling the line
4134
+ * containing the attribute opener.
4135
+ */
4136
+
4136
4137
if (PHP_VERSION_ID < 80000 && $ bracketCloser === null ) {
4137
4138
foreach (array_slice ($ tokens , ($ stackPtr + 1 )) as $ token ) {
4138
4139
if (is_array ($ token ) === true ) {
@@ -4142,20 +4143,17 @@ private function parsePhpAttribute(array &$tokens, $stackPtr)
4142
4143
}
4143
4144
}
4144
4145
4145
- $ subTokens = @token_get_all ('<?php ' .$ commentBody );
4146
- array_splice ($ subTokens , 0 , 1 , [[T_ATTRIBUTE , '#[ ' ]]);
4146
+ $ newSubTokens = @token_get_all ('<?php ' .$ commentBody );
4147
+ array_splice ($ newSubTokens , 0 , 1 , [[T_ATTRIBUTE , '#[ ' ]]);
4147
4148
4148
- $ bracketCloser = $ this ->findCloser ($ subTokens , 1 , '[ ' , '] ' );
4149
+ $ bracketCloser = $ this ->findCloser ($ newSubTokens , 1 , '[ ' , '] ' );
4149
4150
if ($ bracketCloser !== null ) {
4150
- array_splice ($ tokens , ($ stackPtr + 1 ), count ($ tokens ), array_slice ($ subTokens , ($ bracketCloser + 1 )));
4151
- $ subTokens = array_slice ($ subTokens , 0 , ($ bracketCloser + 1 ));
4151
+ // We found the closer, overwrite the original $subTokens array.
4152
+ array_splice ($ tokens , ($ stackPtr + 1 ), count ($ tokens ), array_slice ($ newSubTokens , ($ bracketCloser + 1 )));
4153
+ $ subTokens = array_slice ($ newSubTokens , 0 , ($ bracketCloser + 1 ));
4152
4154
}
4153
4155
}
4154
4156
4155
- if ($ bracketCloser === null ) {
4156
- return null ;
4157
- }
4158
-
4159
4157
return $ subTokens ;
4160
4158
4161
4159
}//end parsePhpAttribute()
0 commit comments