Completed
Pull Request — master (#283)
by Oskar
02:23
created

PackageCollectingVisitor::enterNode()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
c 0
b 0
f 0
nc 2
nop 1
dl 0
loc 6
rs 9.4285
1
<?php
2
3
namespace Hal\Metric\Package;
4
5
use Hal\Metric\Metrics;
6
use Hal\Metric\PackageMetric;
7
use PhpParser\Node;
8
use PhpParser\Node\Stmt\Class_;
9
use PhpParser\Node\Stmt\Interface_;
10
use PhpParser\Node\Stmt\Namespace_;
11
use PhpParser\NodeVisitorAbstract;
12
13
class PackageCollectingVisitor extends NodeVisitorAbstract
14
{
15
    /** @var string */
16
    private $namespace = '';
17
18
    /** @var Metrics */
19
    private $metrics;
20
21
    public function __construct(Metrics $metrics)
22
    {
23
        $this->metrics = $metrics;
24
    }
25
26
    public function enterNode(Node $node)
27
    {
28
        if ($node instanceof Namespace_) {
29
            $this->namespace = (string) $node->name;
30
        }
31
    }
32
33
    public function leaveNode(Node $node)
34
    {
35
        if ($node instanceof Class_ || $node instanceof Interface_) {
36
            $package = $this->namespace;
37
38
            $docComment = $node->getDocComment();
39
            $docBlockText = $docComment ? $docComment->getText() : '';
40
            if (preg_match('/^\s*\* @package (.*)/m', $docBlockText, $matches)) {
41
                $package = $matches[1];
42
            }
43
            if (preg_match('/^\s*\* @subpackage (.*)/m', $docBlockText, $matches)) {
44
                $package = $package . '\\' . $matches[1];
45
            }
46
47
            $packageName = $package . '\\';
48
            if (! $packageMetric = $this->metrics->get($packageName)) {
49
                $packageMetric = new PackageMetric($packageName);
50
                $this->metrics->attach($packageMetric);
51
            }
52
            /* @var PackageMetric $packageMetric */
53
            $elementName = isset($node->namespacedName) ? $node->namespacedName : 'anonymous@'.spl_object_hash($node);
54
            $elementName = (string) $elementName;
55
            $packageMetric->addClass((string) $elementName);
56
57
            $this->metrics->get($elementName)->set('package', $packageName);
58
        }
59
    }
60
}
61