diff --git a/src/StaticAnalysis/Visitor/ExecutableLinesFindingVisitor.php b/src/StaticAnalysis/Visitor/ExecutableLinesFindingVisitor.php index c2fb9aabd..50fe68649 100644 --- a/src/StaticAnalysis/Visitor/ExecutableLinesFindingVisitor.php +++ b/src/StaticAnalysis/Visitor/ExecutableLinesFindingVisitor.php @@ -160,6 +160,15 @@ public function enterNode(Node $node): null return null; } + if ($node instanceof Node\Stmt\Expression && + ( + $node->expr instanceof Node\Scalar || + $node->expr instanceof Node\Expr\ConstFetch + ) + ) { + return null; + } + if ($node instanceof Node\Stmt\Enum_ || $node instanceof Node\Stmt\Function_ || $node instanceof Node\Stmt\Class_ || diff --git a/tests/_files/source_with_scalar_literals.php b/tests/_files/source_with_scalar_literals.php new file mode 100644 index 000000000..bdc6bc11b --- /dev/null +++ b/tests/_files/source_with_scalar_literals.php @@ -0,0 +1,16 @@ +assertArrayHasKey(12, $executableLines); } + #[Ticket('https://github.com/sebastianbergmann/php-code-coverage/issues/1156')] + public function testScalarLiteralsNotMarkedAsExecutable(): void + { + $source = file_get_contents(__DIR__ . '/../../../_files/source_with_scalar_literals.php'); + $parser = (new ParserFactory)->createForHostVersion(); + $nodes = $parser->parse($source); + $executableLinesFindingVisitor = new ExecutableLinesFindingVisitor($source); + + $traverser = new NodeTraverser; + $traverser->addVisitor($executableLinesFindingVisitor); + $traverser->traverse($nodes); + + $executableLines = $executableLinesFindingVisitor->executableLinesGroupedByBranch(); + + $this->assertArrayNotHasKey(6, $executableLines); + $this->assertArrayNotHasKey(7, $executableLines); + $this->assertArrayNotHasKey(9, $executableLines); + $this->assertArrayNotHasKey(10, $executableLines); + $this->assertArrayNotHasKey(12, $executableLines); + $this->assertArrayNotHasKey(13, $executableLines); + $this->assertArrayHasKey(8, $executableLines); + $this->assertArrayHasKey(11, $executableLines); + $this->assertArrayHasKey(14, $executableLines); + } + private function doTestSelfDescribingAssert(string $filename): void { $source = file_get_contents($filename);