Skip to content

Commit 5faa6ba

Browse files
committed
Use more efficient AttributeParentConnectingVisitor
1 parent 8a68c67 commit 5faa6ba

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php declare(strict_types=1);
2+
3+
/*
4+
* This file is part of phpunit/php-code-coverage.
5+
*
6+
* (c) Sebastian Bergmann <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
namespace SebastianBergmann\CodeCoverage\StaticAnalysis;
12+
13+
use function array_pop;
14+
use function count;
15+
use PhpParser\Node;
16+
use PhpParser\NodeVisitorAbstract;
17+
18+
/**
19+
* Visitor that connects a child node to its parent node optimzed for Attribute nodes.
20+
*
21+
* On the child node, the parent node can be accessed through
22+
* <code>$node->getAttribute('parent')</code>.
23+
*/
24+
final class AttributeParentConnectingVisitor extends NodeVisitorAbstract
25+
{
26+
/**
27+
* @var Node[]
28+
*/
29+
private array $stack = [];
30+
31+
public function beforeTraverse(array $nodes)
32+
{
33+
$this->stack = [];
34+
}
35+
36+
public function enterNode(Node $node)
37+
{
38+
if (
39+
!empty($this->stack) &&
40+
($node instanceof Node\Attribute || $node instanceof Node\AttributeGroup)
41+
) {
42+
$node->setAttribute('parent', $this->stack[count($this->stack) - 1]);
43+
}
44+
45+
$this->stack[] = $node;
46+
}
47+
48+
public function leaveNode(Node $node)
49+
{
50+
array_pop($this->stack);
51+
}
52+
}

src/StaticAnalysis/ParsingFileAnalyser.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
use PhpParser\Error;
2727
use PhpParser\NodeTraverser;
2828
use PhpParser\NodeVisitor\NameResolver;
29-
use PhpParser\NodeVisitor\ParentConnectingVisitor;
3029
use PhpParser\ParserFactory;
3130
use SebastianBergmann\CodeCoverage\ParserException;
3231
use SebastianBergmann\LinesOfCode\LineCountingVisitor;
@@ -180,7 +179,7 @@ private function analyse(string $filename): void
180179
$executableLinesFindingVisitor = new ExecutableLinesFindingVisitor($source);
181180

182181
$traverser->addVisitor(new NameResolver);
183-
$traverser->addVisitor(new ParentConnectingVisitor);
182+
$traverser->addVisitor(new AttributeParentConnectingVisitor);
184183
$traverser->addVisitor($codeUnitFindingVisitor);
185184
$traverser->addVisitor($lineCountingVisitor);
186185
$traverser->addVisitor($ignoredLinesFindingVisitor);

0 commit comments

Comments
 (0)