From b5fede32e89162775d8d95dec5ee783c95c5cf98 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Mon, 24 Apr 2023 17:08:49 +0200 Subject: [PATCH] Missing attributes for object shapes --- src/Parser/TypeParser.php | 10 ++++- tests/PHPStan/Parser/TypeParserTest.php | 58 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/Parser/TypeParser.php b/src/Parser/TypeParser.php index 127f7c47..6507aed2 100644 --- a/src/Parser/TypeParser.php +++ b/src/Parser/TypeParser.php @@ -713,12 +713,15 @@ private function parseObjectShape(TokenIterator $tokens): Ast\Type\ObjectShapeNo /** @phpstan-impure */ private function parseObjectShapeItem(TokenIterator $tokens): Ast\Type\ObjectShapeItemNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $key = $this->parseObjectShapeKey($tokens); $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $value = $this->parse($tokens); - return new Ast\Type\ObjectShapeItemNode($key, $optional, $value); + return $this->enrichWithAttributes($tokens, new Ast\Type\ObjectShapeItemNode($key, $optional, $value), $startLine, $startIndex); } /** @@ -727,6 +730,9 @@ private function parseObjectShapeItem(TokenIterator $tokens): Ast\Type\ObjectSha */ private function parseObjectShapeKey(TokenIterator $tokens) { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { if ($this->quoteAwareConstExprString) { $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); @@ -748,7 +754,7 @@ private function parseObjectShapeKey(TokenIterator $tokens) $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } - return $key; + return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } } diff --git a/tests/PHPStan/Parser/TypeParserTest.php b/tests/PHPStan/Parser/TypeParserTest.php index 663daf38..9c876048 100644 --- a/tests/PHPStan/Parser/TypeParserTest.php +++ b/tests/PHPStan/Parser/TypeParserTest.php @@ -2111,6 +2111,64 @@ static function (TypeNode $typeNode): TypeNode { ], ], ]; + + yield [ + 'object{foo: int}', + [ + [ + static function (TypeNode $typeNode): TypeNode { + return $typeNode; + }, + 'object{foo: int}', + 1, + 1, + 0, + 6, + ], + [ + static function (ObjectShapeNode $typeNode): TypeNode { + return $typeNode->items[0]; + }, + 'foo: int', + 1, + 1, + 2, + 5, + ], + ], + ]; + + yield [ + 'object{}', + [ + [ + static function (TypeNode $typeNode): TypeNode { + return $typeNode; + }, + 'object{}', + 1, + 1, + 0, + 2, + ], + ], + ]; + + yield [ + 'object{}[]', + [ + [ + static function (TypeNode $typeNode): TypeNode { + return $typeNode; + }, + 'object{}[]', + 1, + 1, + 0, + 4, + ], + ], + ]; } /**