Skip to content

Commit c19f8f3

Browse files
[1.x] Fixes namespace resolution on named arguments (#69)
* Fixes namespace resolution on named arguments * Apply fixes from StyleCI * Re-add test * Removes non-used class * Fixes test suite * tests functions --------- Co-authored-by: StyleCI Bot <bot@styleci.io>
1 parent 5c1e047 commit c19f8f3

8 files changed

+556
-2
lines changed

src/Support/ReflectionClosure.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,8 +511,7 @@ public function getCode()
511511
// named arguments...
512512
case ':':
513513
if ($lastState === 'closure' && $context === 'root') {
514-
$state = 'ignore_next';
515-
$lastState = 'closure';
514+
$state = 'closure';
516515
$code .= $id_start.$token;
517516
}
518517

tests/Fixtures/RegularClass.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Tests\Fixtures;
4+
5+
class RegularClass
6+
{
7+
public const C = 'CONST';
8+
9+
public function __construct(
10+
public $a1 = null,
11+
public $a2 = null,
12+
public $a3 = null,
13+
public $a4 = null,
14+
public $a5 = null,
15+
public $a6 = null,
16+
public $a7 = null,
17+
public $a8 = null,
18+
public $a9 = null,
19+
public $a10 = null,
20+
public $a11 = null,
21+
public $a12 = null,
22+
public $a13 = null,
23+
public $a14 = null,
24+
public $a15 = null,
25+
public $a16 = null,
26+
public $a17 = null,
27+
public $a18 = null,
28+
public $a19 = null,
29+
public $a20 = null,
30+
) {
31+
}
32+
33+
public static function staticMethod()
34+
{
35+
return 'staticMethod';
36+
}
37+
38+
public function instanceMethod()
39+
{
40+
return 'instanceMethod';
41+
}
42+
}

tests/ReflectionClosure1Test.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Fake
44
use Foo\Bar;
55
use Foo\Baz as Qux;
6+
use Tests\Fixtures\RegularClass;
67

78
test('new instance', function () {
89
$f = function () {
@@ -281,4 +282,18 @@
281282
$e1 = 'function () {
282283
return "{$foo}{$bar}{$foobar}";
283284
}';
285+
286+
expect($f1)->toBeCode($e1);
287+
});
288+
289+
test('consts', function () {
290+
$f1 = function () {
291+
return RegularClass::C;
292+
};
293+
294+
$e1 = 'function () {
295+
return \Tests\Fixtures\RegularClass::C;
296+
}';
297+
298+
expect($f1)->toBeCode($e1);
284299
});

tests/ReflectionClosure6Test.php

Whitespace-only changes.

tests/ReflectionClosurePhp81Test.php

Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use Foo\Baz\Qux\Forest;
44
use Some\ClassName as ClassAlias;
55
use Tests\Fixtures\Model;
6+
use Tests\Fixtures\RegularClass;
67
use function Tests\Fixtures\{makeModel};
78

89
enum GlobalEnum {
@@ -11,6 +12,276 @@ enum GlobalEnum {
1112
case Moderator;
1213
}
1314

15+
test('named arguments', function () {
16+
$variable = new RegularClass();
17+
18+
$f1 = function (string $a1) use ($variable) {
19+
return new RegularClass(
20+
a1: $a1,
21+
a2: 'string',
22+
a3: 1,
23+
a4: 1.1,
24+
a5: true,
25+
a6: null,
26+
a7: ['string'],
27+
a8: ['string', $a1, 1, null, true],
28+
a9: [[[[['string', $a1, 1, null, true]]]]],
29+
a10: new RegularClass(
30+
a1: $a1,
31+
a2: 'string',
32+
a3: 1,
33+
a4: 1.1,
34+
a5: true,
35+
a6: null,
36+
a7: ['string'],
37+
a8: ['string', $a1, 1, null, true],
38+
a9: [[[[['string', $a1, 1, null, true]]]]],
39+
a10: new RegularClass(),
40+
a11: RegularClass::C,
41+
a12: RegularClass::staticMethod(),
42+
a13: (new RegularClass())->instanceMethod(),
43+
a14: [new RegularClass(), RegularClass::C, RegularClass::staticMethod(), (new RegularClass())->instanceMethod()],
44+
),
45+
a11: RegularClass::C,
46+
a12: [new RegularClass(), RegularClass::C],
47+
a13: RegularClass::staticMethod(),
48+
a14: (new RegularClass())->instanceMethod(),
49+
a15: fn () => new RegularClass(
50+
a1: $a1,
51+
a2: 'string',
52+
a3: 1,
53+
a4: 1.1,
54+
a5: true,
55+
a6: null,
56+
a7: ['string'],
57+
a8: ['string', $a1, 1, null, true],
58+
a9: [[[[['string', $a1, 1, null, true]]]]],
59+
a10: new RegularClass(
60+
a1: $a1,
61+
a2: 'string',
62+
a3: 1,
63+
a4: 1.1,
64+
a5: true,
65+
a6: null,
66+
a7: ['string'],
67+
a8: ['string', $a1, 1, null, true],
68+
a9: [[[[['string', $a1, 1, null, true]]]]],
69+
a10: new RegularClass(),
70+
a11: RegularClass::C,
71+
a12: RegularClass::staticMethod(),
72+
a13: (new RegularClass())->instanceMethod(),
73+
a14: [new RegularClass(), RegularClass::C, RegularClass::staticMethod(), (new RegularClass())->instanceMethod()],
74+
),
75+
a11: RegularClass::C,
76+
a12: [new RegularClass(), RegularClass::C],
77+
a13: RegularClass::staticMethod(),
78+
a14: (new RegularClass())->instanceMethod(),
79+
),
80+
a16: fn () => fn () => new RegularClass(
81+
a1: $a1,
82+
a2: 'string',
83+
a3: 1,
84+
a4: 1.1,
85+
a5: true,
86+
a6: null,
87+
a7: ['string'],
88+
a8: ['string', $a1, 1, null, true],
89+
a9: [[[[['string', $a1, 1, null, true]]]]],
90+
a10: new RegularClass(
91+
a1: $a1,
92+
a2: 'string',
93+
a3: 1,
94+
a4: 1.1,
95+
a5: true,
96+
a6: null,
97+
a7: ['string'],
98+
a8: ['string', $a1, 1, null, true],
99+
a9: [[[[['string', $a1, 1, null, true]]]]],
100+
a10: new RegularClass(),
101+
a11: RegularClass::C,
102+
a12: RegularClass::staticMethod(),
103+
a13: (new RegularClass())->instanceMethod(),
104+
a14: [new RegularClass(), RegularClass::C, RegularClass::staticMethod(), (new RegularClass())->instanceMethod()],
105+
),
106+
a11: RegularClass::C,
107+
a12: [new RegularClass(), RegularClass::C],
108+
a13: RegularClass::staticMethod(),
109+
a14: (new RegularClass())->instanceMethod(),
110+
),
111+
a17: function () use ($variable) {
112+
return new RegularClass(
113+
a1: $a1,
114+
a2: 'string',
115+
a3: 1,
116+
a4: 1.1,
117+
a5: true,
118+
a6: null,
119+
a7: ['string'],
120+
a8: ['string', $a1, 1, null, true],
121+
a9: [[[[['string', $a1, 1, null, true]]]]],
122+
a10: new RegularClass(
123+
a1: $a1,
124+
a2: 'string',
125+
a3: 1,
126+
a4: 1.1,
127+
a5: true,
128+
a6: null,
129+
a7: ['string'],
130+
a8: ['string', $a1, 1, null, true],
131+
a9: [[[[['string', $a1, 1, null, true]]]]],
132+
a10: new RegularClass(),
133+
a11: RegularClass::C,
134+
a12: RegularClass::staticMethod(),
135+
a13: (new RegularClass())->instanceMethod(),
136+
a14: [new RegularClass(), RegularClass::C, RegularClass::staticMethod(), (new RegularClass())->instanceMethod()],
137+
),
138+
a11: RegularClass::C,
139+
a12: [new RegularClass(), RegularClass::C],
140+
a13: RegularClass::staticMethod(),
141+
a14: (new RegularClass())->instanceMethod(),
142+
);
143+
},
144+
a18: reflection_closure_my_function(),
145+
a19: reflection_closure_my_function(ReflectionClosureGlobalEnum::Guest),
146+
a20: reflection_closure_my_function(enum: ReflectionClosureGlobalEnum::Guest),
147+
);
148+
};
149+
150+
$e1 = "function (string \$a1) use (\$variable) {
151+
return new \Tests\Fixtures\RegularClass(
152+
a1: \$a1,
153+
a2: 'string',
154+
a3: 1,
155+
a4: 1.1,
156+
a5: true,
157+
a6: null,
158+
a7: ['string'],
159+
a8: ['string', \$a1, 1, null, true],
160+
a9: [[[[['string', \$a1, 1, null, true]]]]],
161+
a10: new \Tests\Fixtures\RegularClass(
162+
a1: \$a1,
163+
a2: 'string',
164+
a3: 1,
165+
a4: 1.1,
166+
a5: true,
167+
a6: null,
168+
a7: ['string'],
169+
a8: ['string', \$a1, 1, null, true],
170+
a9: [[[[['string', \$a1, 1, null, true]]]]],
171+
a10: new \Tests\Fixtures\RegularClass(),
172+
a11: \Tests\Fixtures\RegularClass::C,
173+
a12: \Tests\Fixtures\RegularClass::staticMethod(),
174+
a13: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
175+
a14: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C, \Tests\Fixtures\RegularClass::staticMethod(), (new \Tests\Fixtures\RegularClass())->instanceMethod()],
176+
),
177+
a11: \Tests\Fixtures\RegularClass::C,
178+
a12: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C],
179+
a13: \Tests\Fixtures\RegularClass::staticMethod(),
180+
a14: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
181+
a15: fn () => new \Tests\Fixtures\RegularClass(
182+
a1: \$a1,
183+
a2: 'string',
184+
a3: 1,
185+
a4: 1.1,
186+
a5: true,
187+
a6: null,
188+
a7: ['string'],
189+
a8: ['string', \$a1, 1, null, true],
190+
a9: [[[[['string', \$a1, 1, null, true]]]]],
191+
a10: new \Tests\Fixtures\RegularClass(
192+
a1: \$a1,
193+
a2: 'string',
194+
a3: 1,
195+
a4: 1.1,
196+
a5: true,
197+
a6: null,
198+
a7: ['string'],
199+
a8: ['string', \$a1, 1, null, true],
200+
a9: [[[[['string', \$a1, 1, null, true]]]]],
201+
a10: new \Tests\Fixtures\RegularClass(),
202+
a11: \Tests\Fixtures\RegularClass::C,
203+
a12: \Tests\Fixtures\RegularClass::staticMethod(),
204+
a13: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
205+
a14: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C, \Tests\Fixtures\RegularClass::staticMethod(), (new \Tests\Fixtures\RegularClass())->instanceMethod()],
206+
),
207+
a11: \Tests\Fixtures\RegularClass::C,
208+
a12: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C],
209+
a13: \Tests\Fixtures\RegularClass::staticMethod(),
210+
a14: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
211+
),
212+
a16: fn () => fn () => new \Tests\Fixtures\RegularClass(
213+
a1: \$a1,
214+
a2: 'string',
215+
a3: 1,
216+
a4: 1.1,
217+
a5: true,
218+
a6: null,
219+
a7: ['string'],
220+
a8: ['string', \$a1, 1, null, true],
221+
a9: [[[[['string', \$a1, 1, null, true]]]]],
222+
a10: new \Tests\Fixtures\RegularClass(
223+
a1: \$a1,
224+
a2: 'string',
225+
a3: 1,
226+
a4: 1.1,
227+
a5: true,
228+
a6: null,
229+
a7: ['string'],
230+
a8: ['string', \$a1, 1, null, true],
231+
a9: [[[[['string', \$a1, 1, null, true]]]]],
232+
a10: new \Tests\Fixtures\RegularClass(),
233+
a11: \Tests\Fixtures\RegularClass::C,
234+
a12: \Tests\Fixtures\RegularClass::staticMethod(),
235+
a13: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
236+
a14: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C, \Tests\Fixtures\RegularClass::staticMethod(), (new \Tests\Fixtures\RegularClass())->instanceMethod()],
237+
),
238+
a11: \Tests\Fixtures\RegularClass::C,
239+
a12: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C],
240+
a13: \Tests\Fixtures\RegularClass::staticMethod(),
241+
a14: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
242+
),
243+
a17: function () use (\$variable) {
244+
return new \Tests\Fixtures\RegularClass(
245+
a1: \$a1,
246+
a2: 'string',
247+
a3: 1,
248+
a4: 1.1,
249+
a5: true,
250+
a6: null,
251+
a7: ['string'],
252+
a8: ['string', \$a1, 1, null, true],
253+
a9: [[[[['string', \$a1, 1, null, true]]]]],
254+
a10: new \Tests\Fixtures\RegularClass(
255+
a1: \$a1,
256+
a2: 'string',
257+
a3: 1,
258+
a4: 1.1,
259+
a5: true,
260+
a6: null,
261+
a7: ['string'],
262+
a8: ['string', \$a1, 1, null, true],
263+
a9: [[[[['string', \$a1, 1, null, true]]]]],
264+
a10: new \Tests\Fixtures\RegularClass(),
265+
a11: \Tests\Fixtures\RegularClass::C,
266+
a12: \Tests\Fixtures\RegularClass::staticMethod(),
267+
a13: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
268+
a14: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C, \Tests\Fixtures\RegularClass::staticMethod(), (new \Tests\Fixtures\RegularClass())->instanceMethod()],
269+
),
270+
a11: \Tests\Fixtures\RegularClass::C,
271+
a12: [new \Tests\Fixtures\RegularClass(), \Tests\Fixtures\RegularClass::C],
272+
a13: \Tests\Fixtures\RegularClass::staticMethod(),
273+
a14: (new \Tests\Fixtures\RegularClass())->instanceMethod(),
274+
);
275+
},
276+
a18: \\reflection_closure_my_function(),
277+
a19: \\reflection_closure_my_function(\ReflectionClosureGlobalEnum::Guest),
278+
a20: \\reflection_closure_my_function(enum: \ReflectionClosureGlobalEnum::Guest),
279+
);
280+
}";
281+
282+
expect($f1)->toBeCode($e1);
283+
})->with('serializers');
284+
14285
test('enums', function () {
15286
$f = function (GlobalEnum $role) {
16287
return $role;
@@ -419,3 +690,14 @@ public function getSelf(self $instance): self
419690
return $instance;
420691
}
421692
}
693+
694+
enum ReflectionClosureGlobalEnum {
695+
case Admin;
696+
case Guest;
697+
case Moderator;
698+
}
699+
700+
function reflection_closure_my_function(SerializerGlobalEnum $enum = SerializerGlobalEnum::Admin)
701+
{
702+
return $enum;
703+
}

0 commit comments

Comments
 (0)