Skip to content

Commit 35becde

Browse files
committed
Factory: loads method bodies from traits
1 parent 4bfc907 commit 35becde

File tree

6 files changed

+116
-3
lines changed

6 files changed

+116
-3
lines changed

src/PhpGenerator/Factory.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,17 @@ public function fromClassReflection(\ReflectionClass $from, bool $withBodies = f
5252
}
5353
$class->setProperties($props);
5454

55-
$bodies = $withBodies ? $this->loadMethodBodies($from) : [];
55+
$bodies = [];
5656
foreach ($from->getMethods() as $method) {
5757
if ($method->getDeclaringClass()->name === $from->name) {
5858
$methods[] = $m = $this->fromMethodReflection($method);
59-
if (isset($bodies[$method->name])) {
60-
$m->setBody($bodies[$method->name]);
59+
if ($withBodies) {
60+
$srcMethod = Nette\Utils\Reflection::getMethodDeclaringMethod($method);
61+
$srcClass = $srcMethod->getDeclaringClass()->name;
62+
$b = $bodies[$srcClass] = $bodies[$srcClass] ?? $this->loadMethodBodies($srcMethod->getDeclaringClass());
63+
if (isset($b[$srcMethod->name])) {
64+
$m->setBody($b[$srcMethod->name]);
65+
}
6166
}
6267
}
6368
}

tests/PhpGenerator/ClassType.from.bodies.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ Assert::exception(function () {
1717

1818
Assert::exception(function () {
1919
ClassType::withBodiesFrom(new class {
20+
public function f()
21+
{
22+
}
2023
});
2124
}, Nette\NotSupportedException::class, 'Anonymous classes are not supported.');
2225

tests/PhpGenerator/ClassType.from.trait.phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ $res[] = ClassType::from('Trait2');
1818
$res[] = ClassType::from('Class1');
1919
$res[] = ClassType::from('Class2');
2020
$res[] = ClassType::from('Class3');
21+
$res[] = ClassType::from('Class4');
22+
$res[] = ClassType::from('Class5');
2123

2224
sameFile(__DIR__ . '/expected/ClassType.from.trait.expect', implode("\n", $res));
2325

@@ -28,5 +30,7 @@ $res[] = ClassType::withBodiesFrom('Trait2');
2830
$res[] = ClassType::withBodiesFrom('Class1');
2931
$res[] = ClassType::withBodiesFrom('Class2');
3032
$res[] = ClassType::withBodiesFrom('Class3');
33+
$res[] = ClassType::withBodiesFrom('Class4');
34+
$res[] = ClassType::withBodiesFrom('Class5');
3135

3236
sameFile(__DIR__ . '/expected/ClassType.from.trait.bodies.expect', implode("\n", $res));

tests/PhpGenerator/expected/ClassType.from.trait.bodies.expect

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ trait Trait2
2626

2727
public function f1()
2828
{
29+
echo 'Trait1::f1';
2930
}
3031
}
3132

@@ -36,11 +37,13 @@ class Class1 extends ParentClass
3637

3738
public function f1()
3839
{
40+
echo 'Trait1::f1';
3941
}
4042

4143

4244
public function f2()
4345
{
46+
echo 'Trait2::f2';
4447
}
4548
}
4649

@@ -58,6 +61,7 @@ class Class2 extends ParentClass
5861

5962
public function f2()
6063
{
64+
echo 'Trait2::f2';
6165
}
6266
}
6367

@@ -75,10 +79,46 @@ class Class3 extends ParentClass
7579

7680
public function f2()
7781
{
82+
echo 'Trait2::f2';
83+
}
84+
85+
86+
public function aliased()
87+
{
88+
echo 'Trait1::f1';
7889
}
90+
}
91+
92+
class Class4 extends ParentClass
93+
{
94+
protected $x2;
7995

8096

8197
public function aliased()
8298
{
99+
echo 'Class4::aliased';
100+
}
101+
102+
103+
public function f1()
104+
{
105+
echo 'Trait1::f1';
106+
}
107+
108+
109+
public function f2()
110+
{
111+
echo 'Trait2::f2';
112+
}
113+
}
114+
115+
class Class5
116+
{
117+
public $x1;
118+
119+
120+
public function f1()
121+
{
122+
echo 'Trait1b::f1';
83123
}
84124
}

tests/PhpGenerator/expected/ClassType.from.trait.expect

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,33 @@ class Class3 extends ParentClass
7878
{
7979
}
8080
}
81+
82+
class Class4 extends ParentClass
83+
{
84+
protected $x2;
85+
86+
87+
public function aliased()
88+
{
89+
}
90+
91+
92+
public function f1()
93+
{
94+
}
95+
96+
97+
public function f2()
98+
{
99+
}
100+
}
101+
102+
class Class5
103+
{
104+
public $x1;
105+
106+
107+
public function f1()
108+
{
109+
}
110+
}

tests/PhpGenerator/fixtures/traits.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,34 @@ public function f1()
7777
echo 'Class3::f1';
7878
}
7979
}
80+
81+
82+
class Class4 extends ParentClass
83+
{
84+
use Trait2 {
85+
Trait2::f1 as aliased;
86+
}
87+
88+
89+
public function aliased()
90+
{
91+
echo 'Class4::aliased';
92+
}
93+
}
94+
95+
96+
trait Trait1b
97+
{
98+
public function f1()
99+
{
100+
echo 'Trait1b::f1';
101+
}
102+
}
103+
104+
105+
class Class5
106+
{
107+
use Trait1, Trait1b {
108+
Trait1b::f1 insteadof Trait1;
109+
}
110+
}

0 commit comments

Comments
 (0)