@@ -121,13 +121,17 @@ class Parser {
121121 private $ nameOrStaticOrReservedWordTokens ;
122122 private $ reservedWordTokens ;
123123 private $ keywordTokens ;
124+ private $ argumentStartTokensSet ;
124125 // TODO consider validating parameter and return types on post-parse instead so we can be more permissive
125126 private $ parameterTypeDeclarationTokens ;
126127 private $ returnTypeDeclarationTokens ;
127128
128129 public function __construct () {
129130 $ this ->reservedWordTokens = \array_values (TokenStringMaps::RESERVED_WORDS );
130131 $ this ->keywordTokens = \array_values (TokenStringMaps::KEYWORDS );
132+ $ this ->argumentStartTokensSet = \array_flip (TokenStringMaps::KEYWORDS );
133+ unset($ this ->argumentStartTokensSet [TokenKind::YieldFromKeyword]);
134+ $ this ->argumentStartTokensSet [TokenKind::DotDotDotToken] = '... ' ;
131135 $ this ->nameOrKeywordOrReservedWordTokens = \array_merge ([TokenKind::Name], $ this ->keywordTokens , $ this ->reservedWordTokens );
132136 $ this ->nameOrReservedWordTokens = \array_merge ([TokenKind::Name], $ this ->reservedWordTokens );
133137 $ this ->nameOrStaticOrReservedWordTokens = \array_merge ([TokenKind::Name, TokenKind::StaticKeyword], $ this ->reservedWordTokens );
@@ -2762,16 +2766,30 @@ private function parseMemberName($parentNode) {
27622766 private function isArgumentExpressionStartFn () {
27632767 return function ($ token ) {
27642768 return
2765- $ token ->kind === TokenKind::DotDotDotToken ? true : $ this ->isExpressionStart ($ token );
2769+ isset ( $ this -> argumentStartTokensSet [ $ token ->kind ]) || $ this ->isExpressionStart ($ token );
27662770 };
27672771 }
27682772
27692773 private function parseArgumentExpressionFn () {
27702774 return function ($ parentNode ) {
27712775 $ argumentExpression = new ArgumentExpression ();
27722776 $ argumentExpression ->parent = $ parentNode ;
2773- $ argumentExpression ->byRefToken = $ this ->eatOptional1 (TokenKind::AmpersandToken);
2774- $ argumentExpression ->dotDotDotToken = $ this ->eatOptional1 (TokenKind::DotDotDotToken);
2777+
2778+ $ nextToken = $ this ->lexer ->getTokensArray ()[$ this ->lexer ->getCurrentPosition ()] ?? null ;
2779+ if ($ nextToken && $ nextToken ->kind === TokenKind::ColonToken) {
2780+ $ name = $ this ->token ;
2781+ $ this ->advanceToken ();
2782+ if ($ name ->kind === TokenKind::YieldFromKeyword || !\in_array ($ name ->kind , $ this ->nameOrKeywordOrReservedWordTokens )) {
2783+ $ name = new SkippedToken ($ name );
2784+ } else {
2785+ $ name ->kind = TokenKind::Name;
2786+ }
2787+ $ argumentExpression ->name = $ name ;
2788+ $ argumentExpression ->colonToken = $ this ->eat1 (TokenKind::ColonToken);
2789+ } else {
2790+ $ argumentExpression ->byRefToken = $ this ->eatOptional1 (TokenKind::AmpersandToken);
2791+ $ argumentExpression ->dotDotDotToken = $ this ->eatOptional1 (TokenKind::DotDotDotToken);
2792+ }
27752793 $ argumentExpression ->expression = $ this ->parseExpression ($ argumentExpression );
27762794 return $ argumentExpression ;
27772795 };
0 commit comments