|  | 
| 5 | 5 | use LogicException; | 
| 6 | 6 | use PHPStan\PhpDocParser\Ast; | 
| 7 | 7 | use PHPStan\PhpDocParser\Lexer\Lexer; | 
|  | 8 | +use function in_array; | 
| 8 | 9 | use function strpos; | 
| 9 | 10 | use function trim; | 
| 10 | 11 | 
 | 
| @@ -123,8 +124,8 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode | 
| 123 | 124 | 				} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { | 
| 124 | 125 | 					$type = $this->tryParseArrayOrOffsetAccess($tokens, $type); | 
| 125 | 126 | 
 | 
| 126 |  | -				} elseif ($type->name === 'array' && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { | 
| 127 |  | -					$type = $this->parseArrayShape($tokens, $type); | 
|  | 127 | +				} elseif (in_array($type->name, ['array', 'list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { | 
|  | 128 | +					$type = $this->parseArrayShape($tokens, $type, $type->name); | 
| 128 | 129 | 
 | 
| 129 | 130 | 					if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { | 
| 130 | 131 | 						$type = $this->tryParseArrayOrOffsetAccess($tokens, $type); | 
| @@ -439,8 +440,8 @@ private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNo | 
| 439 | 440 | 			if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { | 
| 440 | 441 | 				$type = $this->parseGeneric($tokens, $type); | 
| 441 | 442 | 
 | 
| 442 |  | -			} elseif ($type->name === 'array' && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { | 
| 443 |  | -				$type = $this->parseArrayShape($tokens, $type); | 
|  | 443 | +			} elseif (in_array($type->name, ['array', 'list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { | 
|  | 444 | +				$type = $this->parseArrayShape($tokens, $type, $type->name); | 
| 444 | 445 | 			} | 
| 445 | 446 | 		} | 
| 446 | 447 | 
 | 
| @@ -499,8 +500,11 @@ private function tryParseArrayOrOffsetAccess(TokenIterator $tokens, Ast\Type\Typ | 
| 499 | 500 | 	} | 
| 500 | 501 | 
 | 
| 501 | 502 | 
 | 
| 502 |  | -	/** @phpstan-impure */ | 
| 503 |  | -	private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\ArrayShapeNode | 
|  | 503 | +	/** | 
|  | 504 | +	 * @phpstan-impure | 
|  | 505 | +	 * @param Ast\Type\ArrayShapeNode::KIND_* $kind | 
|  | 506 | +	 */ | 
|  | 507 | +	private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type, string $kind): Ast\Type\ArrayShapeNode | 
| 504 | 508 | 	{ | 
| 505 | 509 | 		$tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); | 
| 506 | 510 | 
 | 
| @@ -528,7 +532,7 @@ private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type) | 
| 528 | 532 | 		$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); | 
| 529 | 533 | 		$tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); | 
| 530 | 534 | 
 | 
| 531 |  | -		return new Ast\Type\ArrayShapeNode($items, $sealed); | 
|  | 535 | +		return new Ast\Type\ArrayShapeNode($items, $sealed, $kind); | 
| 532 | 536 | 	} | 
| 533 | 537 | 
 | 
| 534 | 538 | 
 | 
|  | 
0 commit comments