Skip to content

Commit ecbea80

Browse files
committed
Fix transitive trait coverage for enums
1 parent 8d03d7a commit ecbea80

3 files changed

Lines changed: 36 additions & 3 deletions

File tree

src/StaticAnalysis/Visitor/CodeUnitFindingVisitor.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public function leaveNode(Node $node): null
107107
return null;
108108
}
109109

110-
if (!$node instanceof Class_ && !$node instanceof Trait_) {
110+
if (!$node instanceof Class_ && !$node instanceof Enum_ && !$node instanceof Trait_) {
111111
return null;
112112
}
113113

@@ -398,11 +398,11 @@ private function typeAsString(Identifier|Name $node): string
398398
/**
399399
* @param list<non-empty-string> $traits
400400
*/
401-
private function postProcessClassOrTrait(Class_|Trait_ $node, array $traits): void
401+
private function postProcessClassOrTrait(Class_|Enum_|Trait_ $node, array $traits): void
402402
{
403403
$name = $node->namespacedName->toString();
404404

405-
if ($node instanceof Class_) {
405+
if ($node instanceof Class_ || $node instanceof Enum_) {
406406
assert(isset($this->classes[$name]));
407407

408408
$this->classes[$name] = new \SebastianBergmann\CodeCoverage\StaticAnalysis\Class_(
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php declare(strict_types=1);
2+
namespace SebastianBergmann\CodeCoverage\TestFixture;
3+
4+
trait EnumTrait
5+
{
6+
public function traitMethod(): string
7+
{
8+
return 'from trait';
9+
}
10+
}
11+
12+
enum EnumWithTrait: string
13+
{
14+
use EnumTrait;
15+
16+
case Foo = 'foo';
17+
}

tests/tests/StaticAnalysis/Visitor/CodeUnitFindingVisitorTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,22 @@ public function testHandlesTraitUsingTrait(): void
304304
);
305305
}
306306

307+
public function testHandlesEnumUsingTrait(): void
308+
{
309+
$codeUnitFindingVisitor = $this->findCodeUnits(__DIR__ . '/../../../_files/source_with_enum_using_trait.php');
310+
311+
$classes = $codeUnitFindingVisitor->classes();
312+
313+
$this->assertCount(1, $classes);
314+
315+
$enum = $classes['SebastianBergmann\CodeCoverage\TestFixture\EnumWithTrait'];
316+
317+
$this->assertSame(
318+
['SebastianBergmann\CodeCoverage\TestFixture\EnumTrait'],
319+
$enum->traits(),
320+
);
321+
}
322+
307323
private function findCodeUnits(string $filename): CodeUnitFindingVisitor
308324
{
309325
$nodes = (new ParserFactory)->createForHostVersion()->parse(

0 commit comments

Comments
 (0)