@@ -1322,6 +1322,7 @@ private function isExpressionStartFn() {
13221322 case TokenKind::IntegerLiteralToken:
13231323
13241324 case TokenKind::StringLiteralToken:
1325+ case TokenKind::EncapsedAndWhitespace:
13251326
13261327 case TokenKind::SingleQuoteToken:
13271328 case TokenKind::DoubleQuoteToken:
@@ -1415,6 +1416,7 @@ private function parsePrimaryExpression($parentNode) {
14151416 return $ this ->parseNumericLiteralExpression ($ parentNode );
14161417
14171418 case TokenKind::StringLiteralToken:
1419+ case TokenKind::EncapsedAndWhitespace:
14181420 return $ this ->parseStringLiteralExpression ($ parentNode );
14191421
14201422 case TokenKind::DoubleQuoteToken:
@@ -2311,6 +2313,7 @@ private function parseBinaryExpressionOrHigher($precedence, $parentNode) {
23112313 // the original operator, and the newly constructed exponentiation-expression as the operand.
23122314 $ shouldOperatorTakePrecedenceOverUnary = false ;
23132315 switch ($ token ->kind ) {
2316+ case TokenKind::OpenBraceToken:
23142317 case TokenKind::AsteriskAsteriskToken:
23152318 $ shouldOperatorTakePrecedenceOverUnary = $ leftOperand instanceof UnaryExpression;
23162319 break ;
@@ -2823,7 +2826,7 @@ private function parseDeclareDirectiveFn() {
28232826 TokenKind::InvalidOctalLiteralToken,
28242827 TokenKind::InvalidHexadecimalLiteral,
28252828 TokenKind::InvalidBinaryLiteral,
2826- TokenKind::StringLiteralToken
2829+ TokenKind::StringLiteralToken,
28272830 ); // TODO simplify
28282831
28292832 return $ declareDirective ;
@@ -3182,6 +3185,7 @@ private function parsePostfixExpressionRest($expression, $allowUpdateExpression
31823185 )) {
31833186 return $ expression ;
31843187 }
3188+
31853189 if ($ tokenKind === TokenKind::ColonColonToken) {
31863190 $ expression = $ this ->parseScopedPropertyAccessExpression ($ expression , null );
31873191 return $ this ->parsePostfixExpressionRest ($ expression );
@@ -3191,6 +3195,14 @@ private function parsePostfixExpressionRest($expression, $allowUpdateExpression
31913195
31923196 if ($ tokenKind === TokenKind::OpenBraceToken ||
31933197 $ tokenKind === TokenKind::OpenBracketToken) {
3198+ // Property hooks: don't parse `{` after certain expression types
3199+ // as those are property hook lists, not subscript expressions
3200+ if ($ tokenKind === TokenKind::OpenBraceToken &&
3201+ ($ expression instanceof StringLiteral ||
3202+ $ expression instanceof ArrayCreationExpression ||
3203+ $ expression instanceof ObjectCreationExpression)) {
3204+ return $ expression ;
3205+ }
31943206 $ expression = $ this ->parseSubscriptExpression ($ expression );
31953207 return $ this ->parsePostfixExpressionRest ($ expression );
31963208 }
0 commit comments