From ca6dfe2e1ccdced5ac18f4a686d78e16549d9812 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 1 Jun 2022 23:30:52 +0700 Subject: [PATCH] [Php80] Mirror additional docblock on importNames() on ClassPropertyAssignToConstructorPromotionRector (#2410) * [Php80] Mirror additional docblock on importNames() on ClassPropertyAssignToConstructorPromotionRector * update docblock var to param * add test for non auto import as well * Fixed :tada: --- .../mirror_additional_docblock.php.inc | 44 +++++++++++++++++++ .../mirror_additional_docblock.php.inc | 44 +++++++++++++++++++ ...ertyAssignToConstructorPromotionRector.php | 23 +++++++--- 3 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/Fixture/mirror_additional_docblock.php.inc create mode 100644 rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/FixtureAutoImport/mirror_additional_docblock.php.inc diff --git a/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/Fixture/mirror_additional_docblock.php.inc b/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/Fixture/mirror_additional_docblock.php.inc new file mode 100644 index 00000000000..c0b28258bd8 --- /dev/null +++ b/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/Fixture/mirror_additional_docblock.php.inc @@ -0,0 +1,44 @@ +name = $name; + } +} + +?> +----- + diff --git a/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/FixtureAutoImport/mirror_additional_docblock.php.inc b/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/FixtureAutoImport/mirror_additional_docblock.php.inc new file mode 100644 index 00000000000..c56dee76fde --- /dev/null +++ b/rules-tests/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector/FixtureAutoImport/mirror_additional_docblock.php.inc @@ -0,0 +1,44 @@ +name = $name; + } +} + +?> +----- + diff --git a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php index 949d41a63ea..29e13448a8b 100644 --- a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php +++ b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\Property; use PhpParser\Node\UnionType; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\Core\NodeAnalyzer\ParamAnalyzer; @@ -130,7 +131,7 @@ public function refactor(Node $node): ?Node $paramTagValueNode = $classMethodPhpDocInfo->getParamTagValueNodeByName($paramName); if (! $paramTagValueNode instanceof ParamTagValueNode) { - $this->decorateParamWithPropertyPhpDocInfo($property, $param); + $this->decorateParamWithPropertyPhpDocInfo($constructClassMethod, $property, $param, $paramName); } elseif ($paramTagValueNode->parameterName !== '$' . $propertyName) { $paramTagValueNode->parameterName = '$' . $propertyName; $paramTagValueNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null); @@ -163,8 +164,12 @@ private function processNullableType(Property $property, Param $param): void } } - private function decorateParamWithPropertyPhpDocInfo(Property $property, Param $param): void - { + private function decorateParamWithPropertyPhpDocInfo( + ClassMethod $classMethod, + Property $property, + Param $param, + string $paramName + ): void { $propertyPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); $propertyPhpDocInfo->markAsChanged(); @@ -172,10 +177,18 @@ private function decorateParamWithPropertyPhpDocInfo(Property $property, Param $ // make sure the docblock is useful if ($param->type === null) { - return; + $varTagValueNode = $propertyPhpDocInfo->getVarTagValueNode(); + if (! $varTagValueNode instanceof VarTagValueNode) { + return; + } + + $paramType = $this->staticTypeMapper->mapPHPStanPhpDocTypeToPHPStanType($varTagValueNode, $property); + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); + $this->phpDocTypeChanger->changeParamType($classMethodPhpDocInfo, $paramType, $param, $paramName); + } else { + $paramType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); } - $paramType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); $this->varTagRemover->removeVarPhpTagValueNodeIfNotComment($param, $paramType); }