Skip to content

Commit 4099408

Browse files
authored
[Php81] Handle different named argument on NullToStrictStringFuncCallArgRector (#7243)
1 parent 5a66eeb commit 4099408

5 files changed

Lines changed: 40 additions & 22 deletions

File tree

config/set/php85.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
use PhpParser\Node\Expr\Cast\String_;
99
use Rector\Config\RectorConfig;
1010
use Rector\Php85\Rector\ArrayDimFetch\ArrayFirstLastRector;
11-
use Rector\Php85\Rector\ClassMethod\NullDebugInfoReturnRector;
1211
use Rector\Php85\Rector\Class_\SleepToSerializeRector;
12+
use Rector\Php85\Rector\ClassMethod\NullDebugInfoReturnRector;
1313
use Rector\Php85\Rector\Const_\DeprecatedAnnotationToDeprecatedAttributeRector;
1414
use Rector\Php85\Rector\FuncCall\ArrayKeyExistsNullToEmptyStringRector;
1515
use Rector\Php85\Rector\FuncCall\ChrArgModuloRector;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Rector\Tests\Php81\Rector\FuncCall\NullToStrictStringFuncCallArgRector\Fixture;
4+
5+
final class DifferentNamed
6+
{
7+
public function run()
8+
{
9+
preg_split('#a#', null, flags: 0);
10+
}
11+
}
12+
13+
?>
14+
-----
15+
<?php
16+
17+
namespace Rector\Tests\Php81\Rector\FuncCall\NullToStrictStringFuncCallArgRector\Fixture;
18+
19+
final class DifferentNamed
20+
{
21+
public function run()
22+
{
23+
preg_split('#a#', '', flags: 0);
24+
}
25+
}
26+
27+
?>

rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
use PHPStan\Reflection\ClassReflection;
1313
use PHPStan\Reflection\FunctionReflection;
1414
use PHPStan\Reflection\Native\NativeFunctionReflection;
15-
use Rector\NodeAnalyzer\ArgsAnalyzer;
1615
use Rector\NodeTypeResolver\Node\AttributeKey;
1716
use Rector\NodeTypeResolver\PHPStan\ParametersAcceptorSelectorVariantsWrapper;
1817
use Rector\Php81\Enum\NameNullToStrictNullFunctionMap;
@@ -31,7 +30,6 @@ final class NullToStrictStringFuncCallArgRector extends AbstractRector implement
3130
{
3231
public function __construct(
3332
private readonly ReflectionResolver $reflectionResolver,
34-
private readonly ArgsAnalyzer $argsAnalyzer,
3533
private readonly NullToStrictStringIntConverter $nullToStrictStringIntConverter
3634
) {
3735
}
@@ -89,9 +87,7 @@ public function refactor(Node $node): ?Node
8987
}
9088

9189
$args = $node->getArgs();
92-
$positions = $this->argsAnalyzer->hasNamedArg($args)
93-
? $this->resolveNamedPositions($node, $args)
94-
: $this->resolveOriginalPositions($node, $scope);
90+
$positions = $this->resolvePositions($node, $args, $scope);
9591

9692
if ($positions === []) {
9793
return null;
@@ -139,11 +135,13 @@ public function provideMinPhpVersion(): int
139135
* @param Arg[] $args
140136
* @return int[]|string[]
141137
*/
142-
private function resolveNamedPositions(FuncCall $funcCall, array $args): array
138+
private function resolvePositions(FuncCall $funcCall, array $args, Scope $scope): array
143139
{
140+
$positions = [];
141+
144142
$functionName = $this->getName($funcCall);
145143
$argNames = NameNullToStrictNullFunctionMap::FUNCTION_TO_PARAM_NAMES[$functionName] ?? [];
146-
$positions = [];
144+
$excludedArgNames = [];
147145

148146
foreach ($args as $position => $arg) {
149147
if (! $arg->name instanceof Identifier) {
@@ -154,20 +152,13 @@ private function resolveNamedPositions(FuncCall $funcCall, array $args): array
154152
continue;
155153
}
156154

155+
$excludedArgNames[] = $arg->name->toString();
157156
$positions[] = $position;
158157
}
159158

160-
return $positions;
161-
}
162-
163-
/**
164-
* @return int[]|string[]
165-
*/
166-
private function resolveOriginalPositions(FuncCall $funcCall, Scope $scope): array
167-
{
168159
$functionReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($funcCall);
169160
if (! $functionReflection instanceof NativeFunctionReflection) {
170-
return [];
161+
return $positions;
171162
}
172163

173164
$parametersAcceptor = ParametersAcceptorSelectorVariantsWrapper::select(
@@ -177,10 +168,10 @@ private function resolveOriginalPositions(FuncCall $funcCall, Scope $scope): arr
177168
);
178169
$functionName = $functionReflection->getName();
179170
$argNames = NameNullToStrictNullFunctionMap::FUNCTION_TO_PARAM_NAMES[$functionName];
180-
$positions = [];
181171

182172
foreach ($parametersAcceptor->getParameters() as $position => $parameterReflection) {
183-
if (in_array($parameterReflection->getName(), $argNames, true)) {
173+
if (in_array($parameterReflection->getName(), $argNames, true)
174+
&& ! in_array($parameterReflection->getName(), $excludedArgNames, true)) {
184175
$positions[] = $position;
185176
}
186177
}

rules/Php85/Rector/Class_/SleepToSerializeRector.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
namespace Rector\Php85\Rector\Class_;
66

7-
use PhpParser\Node\Scalar\String_;
8-
use PhpParser\Node\Expr\Variable;
97
use PhpParser\Node;
108
use PhpParser\Node\Expr\Array_;
119
use PhpParser\Node\Expr\ArrayItem;
1210
use PhpParser\Node\Expr\PropertyFetch;
11+
use PhpParser\Node\Expr\Variable;
1312
use PhpParser\Node\Identifier;
13+
use PhpParser\Node\Scalar\String_;
1414
use PhpParser\Node\Stmt\Class_;
1515
use PhpParser\Node\Stmt\ClassMethod;
1616
use Rector\PhpParser\Node\BetterNodeFinder;

src/ValueObject/PhpVersionFeature.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ final class PhpVersionFeature
816816
* @var int
817817
*/
818818
public const DEPRECATED_METHOD_SLEEP = PhpVersion::PHP_85;
819-
819+
820820
/**
821821
* @see https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_passing_string_which_are_not_one_byte_long_to_ord
822822
* @var int

0 commit comments

Comments
 (0)