From 63e379b4b6c78022e480744722c8bd2dc1f671e6 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 13 Oct 2025 21:20:27 +0200 Subject: [PATCH 1/2] get param name directly, to avoid string type doc --- .../Fixture/skip_contract_enforced.php.inc | 12 ++++++++++++ .../Source/EnforcingSomeContractInterface.php | 11 +++++++++++ ...DynamicDocBlockPropertyToNativePropertyRector.php | 2 +- .../BinaryOpStandaloneAssignsToDirectRector.php | 7 +------ ...emoveUselessAssignFromPropertyPromotionRector.php | 2 +- rules/Naming/Naming/ExpectedNameResolver.php | 4 +--- .../Naming/ValueObjectFactory/ParamRenameFactory.php | 6 +----- ...assPropertyAssignToConstructorPromotionRector.php | 5 ++--- ...enameFunctionLikeParamWithinCallLikeArgRector.php | 2 +- rules/TypeDeclaration/Guard/ParamTypeAddGuard.php | 5 +---- .../ClassMethod/AddParamFromDimFetchKeyUseRector.php | 3 +-- .../AddParamStringTypeFromSprintfUseRector.php | 3 +-- .../AddParamArrayDocblockFromDataProviderRector.php | 4 +--- ...AddParamArrayDocblockFromDimFetchAccessRector.php | 4 +--- src/NodeAnalyzer/ParamAnalyzer.php | 2 +- 15 files changed, 37 insertions(+), 35 deletions(-) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/skip_contract_enforced.php.inc create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Source/EnforcingSomeContractInterface.php diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/skip_contract_enforced.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/skip_contract_enforced.php.inc new file mode 100644 index 00000000000..e6ecc20efde --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/skip_contract_enforced.php.inc @@ -0,0 +1,12 @@ +getName($param->var); + $paramName = $this->getName($param); if ($paramName === $propertyName) { return true; } diff --git a/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php b/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php index cb8e16ee622..8ab71fb74a6 100644 --- a/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php +++ b/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php @@ -141,12 +141,7 @@ private function resolveParamByRefVariables(ClassMethod|Function_|Closure $node) continue; } - $paramName = $this->getName($param->var); - if ($paramName === null) { - continue; - } - - $paramByRefVariables[] = $paramName; + $paramByRefVariables[] = $this->getName($param); } return $paramByRefVariables; diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php index f0a2e51028e..e6324ee5a00 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php @@ -82,7 +82,7 @@ public function refactor(Node $node): ?Node continue; } - $variableNames[] = (string) $this->getName($param->var); + $variableNames[] = $this->getName($param); } if ($variableNames === []) { diff --git a/rules/Naming/Naming/ExpectedNameResolver.php b/rules/Naming/Naming/ExpectedNameResolver.php index 1d0ee6e6c36..872896ef3a5 100644 --- a/rules/Naming/Naming/ExpectedNameResolver.php +++ b/rules/Naming/Naming/ExpectedNameResolver.php @@ -45,9 +45,7 @@ public function resolveForParamIfNotYet(Param $param): ?string return null; } - /** @var string $currentName */ - $currentName = $this->nodeNameResolver->getName($param->var); - + $currentName = $this->nodeNameResolver->getName($param); if ($currentName === $expectedName || str_ends_with($currentName, ucfirst($expectedName))) { return null; } diff --git a/rules/Naming/ValueObjectFactory/ParamRenameFactory.php b/rules/Naming/ValueObjectFactory/ParamRenameFactory.php index 2a5510ed69b..ec885949ac9 100644 --- a/rules/Naming/ValueObjectFactory/ParamRenameFactory.php +++ b/rules/Naming/ValueObjectFactory/ParamRenameFactory.php @@ -26,11 +26,7 @@ public function createFromResolvedExpectedName( return null; } - $currentName = $this->nodeNameResolver->getName($param->var); - if ($currentName === null) { - return null; - } - + $currentName = $this->nodeNameResolver->getName($param); return new ParamRename($currentName, $expectedName, $param->var, $functionLike); } } diff --git a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php index cb68fc734b6..ed37f50d75d 100644 --- a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php +++ b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php @@ -226,9 +226,8 @@ public function refactor(Node $node): ?Node $assignStmtPosition = $promotionCandidate->getStmtPosition(); unset($constructClassMethod->stmts[$assignStmtPosition]); - /** @var string $oldName */ - $oldName = $this->getName($param->var); - $this->variableRenamer->renameVariableInFunctionLike($constructClassMethod, $oldName, $propertyName, null); + $oldParamName = $this->getName($param); + $this->variableRenamer->renameVariableInFunctionLike($constructClassMethod, $oldParamName, $propertyName); $paramTagValueNode = $constructorPhpDocInfo->getParamTagValueByName($paramName); diff --git a/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php b/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php index 0ff36a370c9..8ef80e3f2f2 100644 --- a/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php +++ b/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php @@ -126,7 +126,7 @@ public function refactor(Node $node): ?Node ($functionLike instanceof Closure || $functionLike instanceof ArrowFunction) && ( $this->breakingVariableRenameGuard->shouldSkipVariable( - (string) $this->getName($param->var), + $this->getName($param), $renameFunctionLikeParamWithinCallLikeArg->getNewParamName(), $functionLike, $param->var diff --git a/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php b/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php index 180920adab8..06634f6a12e 100644 --- a/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php +++ b/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php @@ -27,10 +27,7 @@ public function __construct( public function isLegal(Param $param, ClassMethod $classMethod): bool { - $paramName = $this->nodeNameResolver->getName($param->var); - if ($paramName === null) { - return false; - } + $paramName = $this->nodeNameResolver->getName($param); $isLegal = true; diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddParamFromDimFetchKeyUseRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddParamFromDimFetchKeyUseRector.php index 4ebd95ccfe9..cb7687e482a 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddParamFromDimFetchKeyUseRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddParamFromDimFetchKeyUseRector.php @@ -100,8 +100,7 @@ public function refactor(Node $node): ?Node continue; } - /** @var string $paramName */ - $paramName = $this->getName($param->var); + $paramName = $this->getName($param); $dimFetches = $this->arrayDimFetchFinder->findByDimName($classMethod, $paramName); if ($dimFetches === []) { diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php index 4260b60f0ab..d51dec28693 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php @@ -94,8 +94,7 @@ public function refactor(Node $node): ClassMethod|Function_|Closure|ArrowFunctio continue; } - /** @var string $variableName */ - $variableName = $this->getName($param->var); + $variableName = $this->getName($param); if (! $this->variableInSprintfMaskMatcher->matchMask($node, $variableName, '%s')) { continue; diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php index 50fd46c89b7..93fd0236517 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php @@ -126,9 +126,7 @@ public function refactor(Node $node): ?Node continue; } - /** @var string $paramName */ - $paramName = $this->getName($param->var); - + $paramName = $this->getName($param); $paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName); // already defined, lets skip it diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php index d9d073ccd9e..f2a08f32362 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php @@ -102,9 +102,7 @@ public function refactor(Node $node): ?Node continue; } - /** @var string $paramName */ - $paramName = $this->getName($param->var); - + $paramName = $this->getName($param); $paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName); // already defined, lets skip it diff --git a/src/NodeAnalyzer/ParamAnalyzer.php b/src/NodeAnalyzer/ParamAnalyzer.php index df9af8b48ac..de6e28418f4 100644 --- a/src/NodeAnalyzer/ParamAnalyzer.php +++ b/src/NodeAnalyzer/ParamAnalyzer.php @@ -121,7 +121,7 @@ public function isNullable(Param $param): bool public function isParamReassign(ClassMethod $classMethod, Param $param): bool { - $paramName = (string) $this->nodeNameResolver->getName($param->var); + $paramName = $this->nodeNameResolver->getName($param); return (bool) $this->betterNodeFinder->findFirstInFunctionLikeScoped($classMethod, function (Node $node) use ( $paramName ): bool { From b8fa441739926aac90a118aa4736a4fccbe8c855 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 13 Oct 2025 21:21:59 +0200 Subject: [PATCH 2/2] Skip parent methods in AddParamArrayDocblockFromDimFetchAccessRector --- .../AddParamArrayDocblockFromDimFetchAccessRector.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php index f2a08f32362..950d50778e6 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php @@ -18,6 +18,7 @@ use Rector\Rector\AbstractRector; use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayDimFetchFinder; use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer; +use Rector\VendorLocker\ParentClassMethodTypeOverrideGuard; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -30,7 +31,8 @@ public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly ArrayDimFetchFinder $arrayDimFetchFinder, private readonly DocBlockUpdater $docBlockUpdater, - private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer + private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, + private readonly ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard ) { } @@ -115,6 +117,13 @@ public function refactor(Node $node): ?Node continue; } + // skip for now, not to create more error on incompatible parent @param doc override + if ($node instanceof ClassMethod && $this->parentClassMethodTypeOverrideGuard->hasParentClassMethod( + $node + )) { + continue; + } + $keyTypes = []; foreach ($dimFetches as $dimFetch) { // nothing to resolve here