Skip to content

Commit b9fd2a1

Browse files
committed
ClassType::from() resolves inheriting interfaces [Closes #32]
1 parent b381eca commit b9fd2a1

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

src/PhpGenerator/Factory.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,15 @@ public function fromClassReflection(\ReflectionClass $from): ClassType
2727
$class->setType($from->isInterface() ? 'interface' : ($from->isTrait() ? 'trait' : 'class'));
2828
$class->setFinal($from->isFinal() && $class->getType() === 'class');
2929
$class->setAbstract($from->isAbstract() && $class->getType() === 'class');
30-
$class->setImplements($from->getInterfaceNames());
30+
31+
$ifaces = $from->getInterfaceNames();
32+
foreach ($ifaces as $iface) {
33+
$ifaces = array_filter($ifaces, function ($item) use ($iface) {
34+
return !is_subclass_of($iface, $item);
35+
});
36+
}
37+
$class->setImplements($ifaces);
38+
3139
$class->setComment(Helpers::unformatDocComment((string) $from->getDocComment()));
3240
if ($from->getParentClass()) {
3341
$class->setExtends($from->getParentClass()->getName());

tests/PhpGenerator/ClassType.inheritance.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class B extends A
1+
class B extends A implements I3
22
{
33
public $d;
44

tests/PhpGenerator/ClassType.inheritance.phpt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,22 @@ use Tester\Assert;
88
require __DIR__ . '/../bootstrap.php';
99

1010

11-
class A
11+
interface I1
12+
{
13+
}
14+
15+
16+
interface I2
17+
{
18+
}
19+
20+
21+
interface I3 extends I2
22+
{
23+
}
24+
25+
26+
class A implements I1
1227
{
1328
public $a;
1429

@@ -23,7 +38,7 @@ class A
2338
}
2439

2540

26-
class B extends A
41+
class B extends A implements I3
2742
{
2843
public $d;
2944

0 commit comments

Comments
 (0)