Skip to content

Commit a29bd5e

Browse files
committed
[deprecation] Deprecate AddParamArrayDocblockBasedOnArrayMapRector, as a single array_map() call is a vague type source
The rule reads the closure param type of one array_map() call inside the body and turns it into a @PARAM docblock for the whole parameter. One call site does not prove what every caller passes, so the added type is often too narrow. Add the docblock manually instead.
1 parent 091e1ef commit a29bd5e

11 files changed

Lines changed: 9 additions & 337 deletions

File tree

‎phpstan.neon‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ parameters:
466466
- '#Class "Rector\\CodeQuality\\Rector\\Concat\\JoinStringConcatRector" is missing @see annotation with test case class reference#'
467467
- '#Class "Rector\\CodeQuality\\Rector\\Switch_\\SwitchTrueToIfRector" is missing @see annotation with test case class reference#'
468468
- '#Class "Rector\\TypeDeclarationDocblocks\\Rector\\ClassMethod\\AddReturnDocblockForDimFetchArrayFromAssignsRector" is missing @see annotation with test case class reference#'
469+
- '#Class "Rector\\TypeDeclarationDocblocks\\Rector\\ClassMethod\\AddParamArrayDocblockBasedOnArrayMapRector" is missing @see annotation with test case class reference#'
469470

470471
# @todo fix in phpstan-rules
471472
-

‎rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/AddParamArrayDocblockBasedOnArrayMapRectorTest.php‎

Lines changed: 0 additions & 28 deletions
This file was deleted.

‎rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_bare_mixed.php.inc‎

Lines changed: 0 additions & 33 deletions
This file was deleted.

‎rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_dummy_array.php.inc‎

Lines changed: 0 additions & 33 deletions
This file was deleted.

‎rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/override_mixed_type.php.inc‎

Lines changed: 0 additions & 33 deletions
This file was deleted.

‎rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/skip_better_existing_type.php.inc‎

Lines changed: 0 additions & 14 deletions
This file was deleted.

‎rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/Fixture/some_class.php.inc‎

Lines changed: 0 additions & 30 deletions
This file was deleted.

‎rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector/config/configured_rule.php‎

Lines changed: 0 additions & 9 deletions
This file was deleted.

‎rules/TypeDeclarationDocblocks/NodeFinder/ArrayMapClosureExprFinder.php‎

Lines changed: 0 additions & 66 deletions
This file was deleted.

‎rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockBasedOnArrayMapRector.php‎

Lines changed: 8 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,19 @@
55
namespace Rector\TypeDeclarationDocblocks\Rector\ClassMethod;
66

77
use PhpParser\Node;
8-
use PhpParser\Node\Identifier;
9-
use PhpParser\Node\Param;
108
use PhpParser\Node\Stmt\ClassMethod;
119
use PhpParser\Node\Stmt\Function_;
12-
use PHPStan\Type\ArrayType;
13-
use PHPStan\Type\MixedType;
14-
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
10+
use Rector\Configuration\Deprecation\Contract\DeprecatedInterface;
11+
use Rector\Exception\ShouldNotHappenException;
1512
use Rector\Rector\AbstractRector;
16-
use Rector\StaticTypeMapper\StaticTypeMapper;
17-
use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator;
18-
use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayMapClosureExprFinder;
19-
use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer;
2013
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
2114
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
2215

2316
/**
24-
* @see \Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockBasedOnArrayMapRector\AddParamArrayDocblockBasedOnArrayMapRectorTest
17+
* @deprecated This rule is deprecated, as a single array_map() closure only proves what one call site reads. The param type is vague and unreliable. Add the @param docblock manually instead.
2518
*/
26-
final class AddParamArrayDocblockBasedOnArrayMapRector extends AbstractRector
19+
final class AddParamArrayDocblockBasedOnArrayMapRector extends AbstractRector implements DeprecatedInterface
2720
{
28-
public function __construct(
29-
private readonly ArrayMapClosureExprFinder $arrayMapClosureExprFinder,
30-
private readonly StaticTypeMapper $staticTypeMapper,
31-
private readonly PhpDocInfoFactory $phpDocInfoFactory,
32-
private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer,
33-
private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator
34-
) {
35-
36-
}
37-
3821
public function getRuleDefinition(): RuleDefinition
3922
{
4023
return new RuleDefinition('Add @param array docblock if array_map is used on the parameter', [
@@ -78,73 +61,9 @@ public function getNodeTypes(): array
7861
*/
7962
public function refactor(Node $node): ?Node
8063
{
81-
if ($node->getParams() === []) {
82-
return null;
83-
}
84-
85-
$hasChanged = false;
86-
$functionPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
87-
88-
foreach ($node->params as $param) {
89-
// handle only arrays
90-
if (! $this->isArrayParam($param)) {
91-
continue;
92-
}
93-
94-
$paramName = $this->getName($param);
95-
96-
$arrayMapClosures = $this->arrayMapClosureExprFinder->findByVariableName($node, $paramName);
97-
if ($arrayMapClosures === []) {
98-
continue;
99-
}
100-
101-
foreach ($arrayMapClosures as $arrayMapClosure) {
102-
$params = $arrayMapClosure->getParams();
103-
if ($params === []) {
104-
continue;
105-
}
106-
107-
$firstParam = $params[0];
108-
$paramTypeNode = $firstParam->type;
109-
if ($paramTypeNode === null) {
110-
continue;
111-
}
112-
113-
if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag(
114-
$functionPhpDocInfo->getParamTagValueByName($paramName)
115-
)) {
116-
continue;
117-
}
118-
119-
$paramType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($paramTypeNode);
120-
$arrayParamType = new ArrayType(new MixedType(), $paramType);
121-
122-
if ($this->nodeDocblockTypeDecorator->decorateGenericIterableParamType(
123-
$arrayParamType,
124-
$functionPhpDocInfo,
125-
$node,
126-
$param,
127-
$paramName
128-
)) {
129-
$hasChanged = true;
130-
}
131-
}
132-
133-
}
134-
135-
if (! $hasChanged) {
136-
return null;
137-
}
138-
139-
return $node;
140-
}
141-
142-
private function isArrayParam(Param $param): bool
143-
{
144-
if (! $param->type instanceof Identifier) {
145-
return false;
146-
}
147-
148-
return $this->isName($param->type, 'array');
64+
throw new ShouldNotHappenException(sprintf(
65+
'"%s" rule is deprecated, as the param type guessed from a single array_map() closure is vague and unreliable. Add the @param docblock manually instead',
66+
self::class
67+
));
14968
}
15069
}

0 commit comments

Comments
 (0)