Completed
Push — master ( e1173d...cdf0e4 )
by Oskar
05:16 queued 03:02
created

PackageCollectingVisitor::leaveNode()   D

Complexity

Conditions 9
Paths 33

Size

Total Lines 27
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

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