From 0fe292d7fa9deb3a869a4a74363497e1ae527a54 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Sun, 15 Sep 2024 14:49:48 +0200 Subject: [PATCH] [BCB] `ArrayShapeItemNode` and `ObjectShapeItemNode` are not standalone TypeNode, just Node --- UPGRADING.md | 1 + src/Ast/Type/ArrayShapeItemNode.php | 3 +- src/Ast/Type/ObjectShapeItemNode.php | 3 +- src/Printer/Printer.php | 52 ++++++++++++------------- tests/PHPStan/Parser/TypeParserTest.php | 4 +- 5 files changed, 33 insertions(+), 30 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index 51f947d0..b673bccf 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -126,3 +126,4 @@ The line with `some text in the middle` in phpdoc-parser 2.0 is now part of the * Constructor parameter `$isReference` in `TypelessParamTagValueNode` made required * Constructor parameter `$templateTypes` in `CallableTypeNode` made required * Constructor parameters `$expectedTokenValue` and `$currentTokenLine` in `ParserException` made required +* `ArrayShapeItemNode` and `ObjectShapeItemNode` are not standalone TypeNode, just Node diff --git a/src/Ast/Type/ArrayShapeItemNode.php b/src/Ast/Type/ArrayShapeItemNode.php index 2c47eda2..bed62381 100644 --- a/src/Ast/Type/ArrayShapeItemNode.php +++ b/src/Ast/Type/ArrayShapeItemNode.php @@ -4,10 +4,11 @@ use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; +use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\NodeAttributes; use function sprintf; -class ArrayShapeItemNode implements TypeNode +class ArrayShapeItemNode implements Node { use NodeAttributes; diff --git a/src/Ast/Type/ObjectShapeItemNode.php b/src/Ast/Type/ObjectShapeItemNode.php index d64b92e1..f7aa9efb 100644 --- a/src/Ast/Type/ObjectShapeItemNode.php +++ b/src/Ast/Type/ObjectShapeItemNode.php @@ -3,10 +3,11 @@ namespace PHPStan\PhpDocParser\Ast\Type; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; +use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\NodeAttributes; use function sprintf; -class ObjectShapeItemNode implements TypeNode +class ObjectShapeItemNode implements Node { use NodeAttributes; diff --git a/src/Printer/Printer.php b/src/Printer/Printer.php index 915ab39b..7834dc04 100644 --- a/src/Printer/Printer.php +++ b/src/Printer/Printer.php @@ -248,6 +248,30 @@ function (PhpDocChildNode $child): string { if ($node instanceof DoctrineArrayItem) { return (string) $node; } + if ($node instanceof ArrayShapeItemNode) { + if ($node->keyName !== null) { + return sprintf( + '%s%s: %s', + $this->print($node->keyName), + $node->optional ? '?' : '', + $this->printType($node->valueType), + ); + } + + return $this->printType($node->valueType); + } + if ($node instanceof ObjectShapeItemNode) { + if ($node->keyName !== null) { + return sprintf( + '%s%s: %s', + $this->print($node->keyName), + $node->optional ? '?' : '', + $this->printType($node->valueType), + ); + } + + return $this->printType($node->valueType); + } throw new LogicException(sprintf('Unknown node type %s', get_class($node))); } @@ -364,7 +388,7 @@ private function printTagValue(PhpDocTagValueNode $node): string private function printType(TypeNode $node): string { if ($node instanceof ArrayShapeNode) { - $items = array_map(fn (ArrayShapeItemNode $item): string => $this->printType($item), $node->items); + $items = array_map(fn (ArrayShapeItemNode $item): string => $this->print($item), $node->items); if (! $node->sealed) { $items[] = '...' . ($node->unsealedType === null ? '' : $this->print($node->unsealedType)); @@ -372,18 +396,6 @@ private function printType(TypeNode $node): string return $node->kind . '{' . implode(', ', $items) . '}'; } - if ($node instanceof ArrayShapeItemNode) { - if ($node->keyName !== null) { - return sprintf( - '%s%s: %s', - $this->print($node->keyName), - $node->optional ? '?' : '', - $this->printType($node->valueType), - ); - } - - return $this->printType($node->valueType); - } if ($node instanceof ArrayTypeNode) { return $this->printOffsetAccessType($node->type) . '[]'; } @@ -469,22 +481,10 @@ private function printType(TypeNode $node): string return '?' . $this->printType($node->type); } if ($node instanceof ObjectShapeNode) { - $items = array_map(fn (ObjectShapeItemNode $item): string => $this->printType($item), $node->items); + $items = array_map(fn (ObjectShapeItemNode $item): string => $this->print($item), $node->items); return 'object{' . implode(', ', $items) . '}'; } - if ($node instanceof ObjectShapeItemNode) { - if ($node->keyName !== null) { - return sprintf( - '%s%s: %s', - $this->print($node->keyName), - $node->optional ? '?' : '', - $this->printType($node->valueType), - ); - } - - return $this->printType($node->valueType); - } if ($node instanceof OffsetAccessTypeNode) { return $this->printOffsetAccessType($node->type) . '[' . $this->printType($node->offset) . ']'; } diff --git a/tests/PHPStan/Parser/TypeParserTest.php b/tests/PHPStan/Parser/TypeParserTest.php index a05bdbfa..ad19f10f 100644 --- a/tests/PHPStan/Parser/TypeParserTest.php +++ b/tests/PHPStan/Parser/TypeParserTest.php @@ -2888,7 +2888,7 @@ public function dataLinesAndIndexes(): iterable 6, ], [ - static fn (ArrayShapeNode $typeNode): TypeNode => $typeNode->items[0], + static fn (ArrayShapeNode $typeNode): Node => $typeNode->items[0], 'foo: int', 1, 1, @@ -2924,7 +2924,7 @@ public function dataLinesAndIndexes(): iterable 6, ], [ - static fn (ObjectShapeNode $typeNode): TypeNode => $typeNode->items[0], + static fn (ObjectShapeNode $typeNode): Node => $typeNode->items[0], 'foo: int', 1, 1,