Skip to content

Commit 480f1cf

Browse files
authored
Check for variable name in parameters before adding to uses (#268)
* Check for variable name in parameters before adding to uses * Add test for variable duplicated in parameter and use * Resolve undefined property access error * Fix coding style * Fix coding style
1 parent b55c3bc commit 480f1cf

File tree

2 files changed

+100
-1
lines changed

2 files changed

+100
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
3+
namespace Rector\Tests\DowngradePhp74\Rector\ArrowFunction\ArrowFunctionToAnonymousFunctionRector\Fixture;
4+
5+
class NoParamsDuplicatedInUse
6+
{
7+
public function single()
8+
{
9+
$callable = fn($param) => $param;
10+
}
11+
12+
public function singleArrayAssignment()
13+
{
14+
$callable = fn($param) => $arr[] = $param;
15+
}
16+
17+
public function multiple()
18+
{
19+
$callable = fn($param, $param2) => $param + $param2;
20+
}
21+
22+
public function multipleArrayAssignment()
23+
{
24+
$callable = fn($param, $param2) => $arr[] = $param + $param2;
25+
}
26+
27+
public function mixed()
28+
{
29+
$callable = fn($param) => $param + $param2;
30+
}
31+
32+
public function mixedArrayAssignment()
33+
{
34+
$callable = fn($param) => $arr[] = $param + $param2;
35+
}
36+
}
37+
38+
?>
39+
-----
40+
<?php
41+
42+
namespace Rector\Tests\DowngradePhp74\Rector\ArrowFunction\ArrowFunctionToAnonymousFunctionRector\Fixture;
43+
44+
class NoParamsDuplicatedInUse
45+
{
46+
public function single()
47+
{
48+
$callable = function ($param) {
49+
return $param;
50+
};
51+
}
52+
53+
public function singleArrayAssignment()
54+
{
55+
$callable = function ($param) use ($arr) {
56+
return $arr[] = $param;
57+
};
58+
}
59+
60+
public function multiple()
61+
{
62+
$callable = function ($param, $param2) {
63+
return $param + $param2;
64+
};
65+
}
66+
67+
public function multipleArrayAssignment()
68+
{
69+
$callable = function ($param, $param2) use ($arr) {
70+
return $arr[] = $param + $param2;
71+
};
72+
}
73+
74+
public function mixed()
75+
{
76+
$callable = function ($param) use ($param2) {
77+
return $param + $param2;
78+
};
79+
}
80+
81+
public function mixedArrayAssignment()
82+
{
83+
$callable = function ($param) use ($arr, $param2) {
84+
return $arr[] = $param + $param2;
85+
};
86+
}
87+
}
88+
89+
?>

rules/DowngradePhp74/Rector/ArrowFunction/ArrowFunctionToAnonymousFunctionRector.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,17 @@ public function refactor(Node $node): Closure
9898
);
9999

100100
if (! $isFound) {
101-
$anonymousFunctionFactory->uses[] = new ClosureUse($node->expr->expr);
101+
$isAlsoParam = in_array(
102+
$node->expr->expr->name,
103+
array_map(
104+
static fn ($param) => $param->var instanceof Variable ? $param->var->name : null,
105+
$node->params
106+
)
107+
);
108+
109+
if (! $isAlsoParam) {
110+
$anonymousFunctionFactory->uses[] = new ClosureUse($node->expr->expr);
111+
}
102112
}
103113
}
104114

0 commit comments

Comments
 (0)