Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,7 @@ parameters:
- '#Class "Rector\\CodeQuality\\Rector\\Switch_\\SwitchTrueToIfRector" is missing @see annotation with test case class reference#'
- '#Class "Rector\\TypeDeclarationDocblocks\\Rector\\ClassMethod\\AddReturnDocblockForDimFetchArrayFromAssignsRector" is missing @see annotation with test case class reference#'
- '#Class "Rector\\Assert\\Rector\\ClassMethod\\AddAssertArrayFromClassMethodDocblockRector" is missing @see annotation with test case class reference#'
- '#Class "Rector\\TypeDeclarationDocblocks\\Rector\\ClassMethod\\AddParamArrayDocblockBasedOnArrayMapRector" is missing @see annotation with test case class reference#'

# @todo fix in phpstan-rules
-
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,19 @@
namespace Rector\TypeDeclarationDocblocks\Rector\ClassMethod;

use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Type\ArrayType;
use PHPStan\Type\MixedType;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Configuration\Deprecation\Contract\DeprecatedInterface;
use Rector\Exception\ShouldNotHappenException;
use Rector\Rector\AbstractRector;
use Rector\StaticTypeMapper\StaticTypeMapper;
use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator;
use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayMapClosureExprFinder;
use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;

/**
* @see \Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockBasedOnArrayMapRector\AddParamArrayDocblockBasedOnArrayMapRectorTest
* @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.
*/
final class AddParamArrayDocblockBasedOnArrayMapRector extends AbstractRector
final class AddParamArrayDocblockBasedOnArrayMapRector extends AbstractRector implements DeprecatedInterface
{
public function __construct(
private readonly ArrayMapClosureExprFinder $arrayMapClosureExprFinder,
private readonly StaticTypeMapper $staticTypeMapper,
private readonly PhpDocInfoFactory $phpDocInfoFactory,
private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer,
private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator
) {

}

public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Add @param array docblock if array_map is used on the parameter', [
Expand Down Expand Up @@ -78,73 +61,9 @@ public function getNodeTypes(): array
*/
public function refactor(Node $node): ?Node
{
if ($node->getParams() === []) {
return null;
}

$hasChanged = false;
$functionPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);

foreach ($node->params as $param) {
// handle only arrays
if (! $this->isArrayParam($param)) {
continue;
}

$paramName = $this->getName($param);

$arrayMapClosures = $this->arrayMapClosureExprFinder->findByVariableName($node, $paramName);
if ($arrayMapClosures === []) {
continue;
}

foreach ($arrayMapClosures as $arrayMapClosure) {
$params = $arrayMapClosure->getParams();
if ($params === []) {
continue;
}

$firstParam = $params[0];
$paramTypeNode = $firstParam->type;
if ($paramTypeNode === null) {
continue;
}

if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag(
$functionPhpDocInfo->getParamTagValueByName($paramName)
)) {
continue;
}

$paramType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($paramTypeNode);
$arrayParamType = new ArrayType(new MixedType(), $paramType);

if ($this->nodeDocblockTypeDecorator->decorateGenericIterableParamType(
$arrayParamType,
$functionPhpDocInfo,
$node,
$param,
$paramName
)) {
$hasChanged = true;
}
}

}

if (! $hasChanged) {
return null;
}

return $node;
}

private function isArrayParam(Param $param): bool
{
if (! $param->type instanceof Identifier) {
return false;
}

return $this->isName($param->type, 'array');
throw new ShouldNotHappenException(sprintf(
'"%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',
self::class
));
}
}
2 changes: 0 additions & 2 deletions src/Config/Level/TypeDeclarationDocblocksLevel.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarArrayFromGetterReturnRector;
use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarArrayFromPropertyDefaultsRector;
use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarFromParamDocblockInConstructorRector;
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockBasedOnArrayMapRector;
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromAssignsParamToParamReferenceRector;
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector;
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddReturnDocblockForArrayDimAssignedObjectRector;
Expand All @@ -36,7 +35,6 @@ final class TypeDeclarationDocblocksLevel
// param
AddParamArrayDocblockFromDimFetchAccessRector::class,
ClassMethodArrayDocblockParamFromLocalCallsRector::class,
AddParamArrayDocblockBasedOnArrayMapRector::class,
AddParamArrayDocblockFromAssignsParamToParamReferenceRector::class,
AddParamArrayDocblockBasedOnCallableNativeFuncCallRector::class,

Expand Down
Loading