From 7fa3909acb05a2838975e27e4f25d5ec08552ee7 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 2 Oct 2019 17:37:59 +0200 Subject: [PATCH 1/2] decoupling --- .../StringToArrayArgumentProcessRector.php | 21 +++++++++++++------ phpstan.neon | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php b/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php index 779219d8959d..59039d33175e 100644 --- a/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php +++ b/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php @@ -113,7 +113,8 @@ private function processStringType(Node $node, int $argumentPosition, Node $firs return; } - if ($firstArgument instanceof FuncCall && $this->isName($firstArgument, 'sprintf')) { + if ($this->isFunctionNamed($firstArgument, 'sprintf')) { + /** @var FuncCall $firstArgument */ $arrayNode = $this->nodeTransformer->transformSprintfToArray($firstArgument); if ($arrayNode !== null) { $node->args[$argumentPosition]->value = $arrayNode; @@ -131,11 +132,10 @@ private function processPreviousAssign(Node $node, Node $firstArgument): void /** @var Assign|null $createdNode */ $createdNode = $this->findPreviousNodeAssign($node, $firstArgument); - if ($createdNode instanceof Assign && $createdNode->expr instanceof FuncCall && $this->isName( - $createdNode->expr, - 'sprintf' - )) { - $arrayNode = $this->nodeTransformer->transformSprintfToArray($createdNode->expr); + if ($createdNode instanceof Assign && $this->isFunctionNamed($createdNode->expr, 'sprintf')) { + /** @var FuncCall $funcCall */ + $funcCall = $createdNode->expr; + $arrayNode = $this->nodeTransformer->transformSprintfToArray($funcCall); if ($arrayNode !== null) { $createdNode->expr = $arrayNode; } @@ -160,4 +160,13 @@ private function findPreviousNodeAssign(Node $node, Node $firstArgument): ?Assig return $checkedNode; }); } + + private function isFunctionNamed(Node $node, string $name): bool + { + if ($node instanceof FuncCall) { + return false; + } + + return $this->isName($node, $name); + } } diff --git a/phpstan.neon b/phpstan.neon index f410d08ebff9..8a8fa281060e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -209,3 +209,4 @@ parameters: - '#In method "Rector\\Rector\\AbstractRector\:\:isDoctrineEntityClass", parameter \$class has no type\-hint and no @param annotation\. More info\: http\://bit\.ly/usetypehint#' - '#In method "Rector\\FileSystemRector\\Rector\\AbstractFileSystemRector\:\:moveFile", parameter \$nodes type is "array"\. Please provide a @param annotation to further specify the type of the array\. For instance\: @param int\[\] \$nodes\. More info\: http\://bit\.ly/typehintarray#' - '#Parameter \#1 \$items of class PhpParser\\Node\\Expr\\Array_ constructor expects array, array given#' + - '#Parameter \#1 \$sprintfFuncCall of method Rector\\PhpParser\\NodeTransformer\:\:transformSprintfToArray\(\) expects PhpParser\\Node\\Expr\\FuncCall, PhpParser\\Node given#' From 3a6b3b8d83259b2388bf295d57311bc134baf960 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 2 Oct 2019 20:29:47 +0200 Subject: [PATCH 2/2] fix type resolution for traversable --- packages/NodeTypeResolver/src/NodeTypeResolver.php | 10 +++++++++- .../Rector/New_/StringToArrayArgumentProcessRector.php | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/NodeTypeResolver/src/NodeTypeResolver.php b/packages/NodeTypeResolver/src/NodeTypeResolver.php index 022b9c23be6b..109c8cae6350 100644 --- a/packages/NodeTypeResolver/src/NodeTypeResolver.php +++ b/packages/NodeTypeResolver/src/NodeTypeResolver.php @@ -163,7 +163,15 @@ public function isObjectType(Node $node, $requiredType): bool return true; } - return $resolvedType->isSuperTypeOf($requiredType)->yes(); + if ($resolvedType instanceof UnionType) { + foreach ($resolvedType->getTypes() as $unionedType) { + if ($unionedType->equals($requiredType)) { + return true; + } + } + } + + return false; } public function getObjectType(Node $node): Type diff --git a/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php b/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php index 59039d33175e..6e55f3606bd7 100644 --- a/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php +++ b/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php @@ -163,7 +163,7 @@ private function findPreviousNodeAssign(Node $node, Node $firstArgument): ?Assig private function isFunctionNamed(Node $node, string $name): bool { - if ($node instanceof FuncCall) { + if (! $node instanceof FuncCall) { return false; }