Skip to content

Commit 304bce2

Browse files
nunomaduroadoyStyleCIBot
authored
[1.x] Fixes FQCN on anonymous classes definition (#75)
* Fix closure with anonymous class that extends/implements class without FQCN * Adds more tests * Apply fixes from StyleCI * Fixes coding style --------- Co-authored-by: Pierrick Charron <pierrick@webstart.fr> Co-authored-by: StyleCI Bot <bot@styleci.io>
1 parent bfc58d9 commit 304bce2

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

src/Support/ReflectionClosure.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,11 @@ public function getCode()
642642
break;
643643
case 'anonymous':
644644
switch ($token[0]) {
645+
case T_NAME_QUALIFIED:
646+
[$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]);
647+
$state = 'id_name';
648+
$lastState = 'anonymous';
649+
break 2;
645650
case T_NS_SEPARATOR:
646651
case T_STRING:
647652
$id_start = $token[1];

tests/ReflectionClosure5Test.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,78 @@
5656
$f4 = fn () => new Qux();
5757
$e4 = 'fn () => new \Foo\Baz\Qux()';
5858

59+
$f5 = fn () => new class extends Baz\Qux {};
60+
$e5 = 'fn () => new class extends \Foo\Bar\Qux {}';
61+
62+
$f6 = fn () => new class extends Baz\Qux implements Baz\Qux {};
63+
$e6 = 'fn () => new class extends \Foo\Bar\Qux implements \Foo\Bar\Qux {}';
64+
65+
$f7 = fn () => new class implements Baz\Qux, Baz\Qux {};
66+
$e7 = 'fn () => new class implements \Foo\Bar\Qux, \Foo\Bar\Qux {}';
67+
68+
$f8 = function () {
69+
$a = new class implements Baz\Qux, Baz\Qux {};
70+
71+
$b = new class implements Baz\Qux {};
72+
};
73+
74+
$e8 = 'function () {
75+
$a = new class implements \Foo\Bar\Qux, \Foo\Bar\Qux {};
76+
77+
$b = new class implements \Foo\Bar\Qux {};
78+
}';
79+
80+
$f9 = function () {
81+
$a = new class implements Baz\Qux, Baz\Qux {};
82+
83+
$b = new class extends Forest implements Baz\Qux
84+
{
85+
public Baz\Qux $qux;
86+
87+
public function foo()
88+
{
89+
return new class {};
90+
}
91+
92+
public function qux(Baz\Qux $qux): Baz\Qux
93+
{
94+
return static fn () => new class extends Forest implements Baz\Qux {
95+
//
96+
};
97+
}
98+
};
99+
};
100+
101+
$e9 = 'function () {
102+
$a = new class implements \Foo\Bar\Qux, \Foo\Bar\Qux {};
103+
104+
$b = new class extends \Foo\Baz\Qux\Forest implements \Foo\Bar\Qux
105+
{
106+
public \Foo\Bar\Qux $qux;
107+
108+
public function foo()
109+
{
110+
return new class {};
111+
}
112+
113+
public function qux(\Foo\Bar\Qux $qux): \Foo\Bar\Qux
114+
{
115+
return static fn () => new class extends \Foo\Baz\Qux\Forest implements \Foo\Bar\Qux {
116+
//
117+
};
118+
}
119+
};
120+
}';
121+
59122
expect($f1)->toBeCode($e1);
60123
expect($f2)->toBeCode($e2);
61124
expect($f3)->toBeCode($e3);
62125
expect($f4)->toBeCode($e4);
126+
expect($f5)->toBeCode($e5);
127+
expect($f6)->toBeCode($e6);
128+
expect($f7)->toBeCode($e7);
129+
expect($f8)->toBeCode($e8);
130+
expect($f9)->toBeCode($e9);
63131
});
64132

65133
test('class keywords instantiation', function () {

0 commit comments

Comments
 (0)